Utfør sikker tilbakeskrivning av databaser med Amazon QuickSight

Utfør sikker tilbakeskrivning av databaser med Amazon QuickSight

Kilde node: 2641420

Amazon QuickSight er en skalerbar, serverløs, maskinlæring (ML)-drevet business intelligence (BI)-løsning som gjør det enkelt å koble til dataene dine, lage interaktive dashboards, få tilgang til ML-aktivert innsikt og dele visuelle elementer og dashboards med titusenvis av interne og eksterne brukere, enten i QuickSight selv eller innebygd i en hvilken som helst applikasjon.

En tilbakeskrivning er muligheten til å oppdatere et datamarked, datavarehus eller en hvilken som helst annen databasebackend fra BI-dashboards og analysere de oppdaterte dataene i nesten sanntid innenfor selve dashbordet. I dette innlegget viser vi hvordan du utfører sikker tilbakeskrivning av databaser med QuickSight.

Bruk saksoversikt

For å demonstrere hvordan du kan aktivere tilbakeskrivningsmulighet med QuickSight, la oss vurdere et fiktivt selskap, AnyCompany Inc. AnyCompany er et profesjonelt tjenestefirma som spesialiserer seg på å tilby arbeidskraftløsninger til sine kunder. AnyCompany bestemte at å kjøre arbeidsbelastninger i skyen for å støtte dets voksende globale forretningsbehov er et konkurransefortrinn og bruker skyen til å være vert for alle arbeidsbelastningene. AnyCompany bestemte seg for å forbedre måten filialene gir tilbud til sine kunder. For øyeblikket genererer filialene kundetilbud manuelt, og som et første skritt i denne innovasjonsreisen ønsker AnyCompany å utvikle en bedriftsløsning for generering av kundetilbud med muligheten til å dynamisk anvende lokale prisdata på tidspunktet for tilbudsgenerering.

AnyCompany bruker for øyeblikket Amazon RedShift som deres bedriftsdatavarehusplattform og QuickSight som deres BI-løsning.

Å bygge en ny løsning har følgende utfordringer:

  • AnyCompany vil ha en løsning som er enkel å bygge og vedlikeholde, og de ønsker ikke å investere i å bygge et eget brukergrensesnitt.
  • AnyCompany ønsker å utvide mulighetene til deres eksisterende QuickSight BI-dashbord for også å muliggjøre tilbudsgenerering og tilbudsaksept. Dette vil forenkle funksjonsutrullingen fordi deres ansatte allerede bruker QuickSight-dashboards og nyter det brukervennlige grensesnittet som QuickSight gir.
  • AnyCompany ønsker å lagre tilbudsforhandlingshistorikken som inkluderer genererte, gjennomgåtte og aksepterte tilbud.
  • AnyCompany ønsker å bygge et nytt dashbord med tilbudshistorikkdata for analyse og forretningsinnsikt.

Dette innlegget går gjennom trinnene for å aktivere tilbakeskrivningsfunksjonalitet til Amazon Redshift fra QuickSight. Vær oppmerksom på at de tradisjonelle BI-verktøyene er skrivebeskyttet med få eller ingen alternativer for å oppdatere kildedata.

Løsningsoversikt

Denne løsningen bruker følgende AWS-tjenester:

  • Amazon API-gateway – Verter og sikrer tilbakeskrivnings-REST API som vil bli påberopt av QuickSight
  • AWS Lambda – Kjører beregningsfunksjonen som kreves for å generere hashen og en andre funksjon for å utføre tilbakeskrivningen på en sikker måte
  • Amazon QuickSight – Tilbyr BI-dashbord og muligheter for tilbudsgenerering
  • Amazon RedShift – Lagrer tilbud, priser og andre relevante datasett
  • AWS Secrets Manager – Lagrer og administrerer nøkler for å signere hash (meldingssammendrag)

Selv om denne løsningen bruker Amazon Redshift som datalager, kan en lignende tilnærming implementeres med enhver database som støtter oppretting av brukerdefinerte funksjoner (UDF) som kan påkalle Lambda.

Følgende figur viser arbeidsflyten for å utføre tilbakeskrivninger fra QuickSight.

Det første trinnet i løsningen er å generere en hash eller en meldingssammendrag av settet med attributter i Amazon Redshift ved å påkalle en Lambda-funksjon. Dette trinnet forhindrer manipulering av forespørsel. For å generere en hash, påkaller Amazon Redshift en skalar Lambda UDF. Hashing-mekanismen som brukes her er den populære BLAKE2 funksjon (tilgjengelig i Python-biblioteket hashlib). For ytterligere å sikre hashen benyttes keyed hashing, som er et raskere og enklere alternativ til hash-basert meldingsautentiseringskode (HMAC). Denne nøkkelen genereres og lagres av Secrets Manager og skal bare være tilgjengelig for tillatte applikasjoner. Etter at den sikre hashen er generert, returneres den til Amazon Redshift og kombinert i en Amazon Redshift-visning.

Å skrive det genererte sitatet tilbake til Amazon Redshift utføres av tilbakeskrivnings Lambda-funksjonen, og et API Gateway REST API-endepunkt opprettes for å sikre og sende forespørsler til tilbakeskrivningsfunksjonen. Tilbakeskrivningsfunksjonen utfører følgende handlinger:

  1. Generer hashen basert på API-inndataparametere mottatt fra QuickSight.
  2. Signer hashen ved å bruke nøkkelen fra Secrets Manager.
  3. Sammenlign den genererte hashen med hashen mottatt fra inngangsparameterne ved å bruke compare_digest-metoden som er tilgjengelig i HMAC modul.
  4. Etter vellykket validering, skriv posten til tilbudstabellen i Amazon Redshift.

Den følgende delen inneholder detaljerte trinn med eksempler på nyttelast og kodebiter.

Generer hashen

Hashen genereres ved hjelp av en Lambda UDF i Amazon Redshift. I tillegg brukes en Secrets Manager-nøkkel for å signere hashen. For å lage hashen, fullfør følgende trinn:

  1. Opprett Secrets Manager-nøkkelen fra AWS kommandolinjegrensesnitt (AWS CLI):
aws secretsmanager create-secret --name “name_of_secret” --description "Secret key to sign hash" --secret-string '{" name_of_key ":"value"}' --region us-east-1

  1. Opprett en Lambda UDF for å generere en hash for kryptering:
import boto3 import base64
import json
from hashlib import blake2b
from botocore.exceptions import ClientError def get_secret(): #This key is used by the Lambda function to further secure the hash. secret_name = "<name_of_secret>" region_name = "<aws_region_name>" # Create a Secrets Manager client session = boto3.session.Session() client = session.client(service_name='secretsmanager', region_name=<aws_region_name> ) # In this sample we only handle the specific exceptions for the 'GetSecretValue' API. # See https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html # We rethrow the exception by default. try: get_secret_value_response = client.get_secret_value(SecretId=secret_name) except Exception as e: raise e if "SecretString" in get_secret_value_response: access_token = get_secret_value_response["SecretString"] else: access_token = get_secret_value_response["SecretBinary"] return json.loads(access_token)[<token key name>] SECRET_KEY = get_secret()
AUTH_SIZE = 16 def sign(payload): h = blake2b(digest_size=AUTH_SIZE, key=SECRET_KEY) h.update(payload) return h.hexdigest().encode('utf-8') def lambda_handler(event, context):
ret = dict() try: res = [] for argument in event['arguments']: try: msg = json.dumps(argument) signed_key = sign(str.encode(msg)) res.append(signed_key.decode('utf-8')) except: res.append(None) ret['success'] = True ret['results'] = res except Exception as e: ret['success'] = False ret['error_msg'] = str(e) return json.dumps(ret)

  1. Definer en Amazon Redshift UDF for å kalle Lambda-funksjonen for å lage en hash:
CREATE OR REPLACE EXTERNAL FUNCTION udf_get_digest (par1 varchar)
RETURNS varchar STABLE
LAMBDA 'redshift_get_digest'
IAM_ROLE 'arn:aws:iam::<AWSACCOUNTID>role/service-role/<role_name>';

De AWS identitets- og tilgangsadministrasjon (IAM)-rollen i det foregående trinnet bør ha følgende retningslinjer knyttet for å kunne påkalle Lambda-funksjonen:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1:<AWSACCOUNTID>1:function:redshift_get_digest" }
}

  1. Hent nøkkelen fra Secrets Manager.

Denne nøkkelen brukes av Lambda-funksjonen for å sikre hashen ytterligere. Dette er angitt i få_hemmelig funksjon i trinn 2.

Sett opp Amazon Redshift-datasett i QuickSight

Sitatgenereringsdashbordet bruker følgende Amazon Redshift-visning.

Lag en Amazon Redshift-visning som bruker alle de foregående kolonnene sammen med hash-kolonnen:

create view quote_gen_vw as select *, udf_get_digest ( customername || BGCheckRequired || Skill|| Shift ||State ||Cost ) from billing_input_tbl

Postene vil se ut som følgende skjermbilde.

Den foregående visningen vil bli brukt som QuickSight-datasettet for å generere sitater. En QuickSight-analyse vil bli opprettet ved hjelp av datasettet. For nær-sanntidsanalyse kan du bruke QuickSight direkte spørringsmodus.

Opprett API Gateway-ressurser

Tilbakeskrivningsoperasjonen initieres ved at QuickSight påkaller en API Gateway-ressurs, som påkaller Lambda-tilbakeskrivningsfunksjonen. Som en forutsetning for å opprette det beregnede feltet i QuickSight for å kalle tilbakeskrivnings-API, må du først opprette disse ressursene.

API-gateway sikrer og aktiverer tilbakeskrivnings-lamda-funksjonen med parameterne opprettet som URL-spørringsstrengparametere med tilordningsmaler. Kartleggingsparametrene kan unngås ved å bruke Lambda-proxy-integrasjonen.

Opprett en REST API-ressurs av metodetypen GET som bruker Lambda-funksjoner (opprettet i neste trinn) som integrasjonstype. For instruksjoner, se Opprette en REST API i Amazon API Gateway og Sett opp Lambda-integrasjoner i API Gateway.

Følgende skjermbilde viser detaljene for å lage en spørringsstrengparameter for hver parameter som sendes til API-gateway.

Følgende skjermbilde viser detaljene for å lage en tilordningsmalparameter for hver parameter som sendes til API Gateway.

Lag Lambda-funksjonen

Opprett en ny Lambda-funksjon som API-gatewayen kan påkalle. Lambdafunksjonen utfører følgende trinn:

  1. Motta parametere fra QuickSight gjennom API Gateway og hash de sammenkoblede parameterne.

Følgende kodeeksempel henter parametere fra API Gateway-kallet ved å bruke hendelsesobjektet til Lambda-funksjonen:

 customer= event['customer’]) bgc = event['bgc']

Funksjonen utfører hashing-logikken som vist i lage hasj trinn tidligere ved å bruke de sammenkoblede parameterne som er sendt av QuickSight.

  1. Sammenlign den hash-utgangen med hash-parameteren.

Hvis disse ikke samsvarer, vil tilbakeskrivningen ikke skje.

  1. Hvis hashen samsvarer, utfør en tilbakeskrivning. Se etter tilstedeværelsen av en post i tilbudsgenereringstabellen ved å generere en spørring fra tabellen ved å bruke parameterne sendt fra QuickSight:
query_str = "select * From tbquote where cust = '" + cust + "' and bgc = '" + bgc +"'" +" and skilledtrades = '" + skilledtrades + "' and shift = '" +shift + "' and jobdutydescription ='" + jobdutydescription + "'"

  1. Fullfør følgende handling basert på resultatene av spørringen:
    1. Hvis det ikke finnes noen post for den foregående kombinasjonen, generer og kjør en innsettingsspørring ved å bruke alle parametere med status som generert.
    2. Hvis det eksisterer en post for den foregående kombinasjonen, generer og kjør en innsettingsspørring med statusen som i gjennomgang. quote_Id for den eksisterende kombinasjonen vil bli gjenbrukt.

Lag et QuickSight-bilde

Dette trinnet innebærer å lage en tabellvisualisering som bruker et beregnet felt til å sende parametere til API-gateway og påkalle den foregående Lambda-funksjonen.

  1. Legg til et QuickSight-beregnet felt kalt Generate Quote for å holde URL-en som vert for API-gatewayen som vil bli utløst for å skrive tilbake sitathistorikken til Amazon Redshift:
concat("https://xxxxx.execute-api.us-east-1.amazonaws.com/stage_name/apiresourcename/?cust=",customername,"&bgc=",bgcheckrequired,"&billrate=",toString(billrate),"&skilledtrades=",skilledtrades,"&shift=",shift,"&jobdutydescription=",jobdutydescription,"&hash=",hashvalue)

  1. Lag en QuickSight-tabellvisualisering.
  2. Legg til obligatoriske felt som Kunde, Ferdighet og Kostnad.
  3. Legg til feltet Generer sitat beregnet og stil dette som en hyperkobling.

Ved å velge denne koblingen vil posten skrives inn i Amazon Redshift. Dette påhviler den samme hash-verdien som returnerer når Lambda-funksjonen utfører hashen på parameterne.

Følgende skjermbilde viser et eksempel på en tabell.

Skriv til Amazon Redshift-databasen

Secrets Manager-nøkkelen hentes og brukes av Lambda-funksjonen for å generere hashen for sammenligning. Tilbakeskrivningen utføres bare hvis hashen samsvarer med hashen som er sendt i parameteren.

Følgende Amazon Redshift-tabell vil fange opp sitathistorikken som fylt ut av Lambda-funksjonen. Poster i grønt representerer de siste postene for sitatet.

Betraktninger og neste steg

Bruk av sikre hasher forhindrer manipulering av nyttelastparametere som er synlige i nettleservinduet når tilbakeskrivnings-URLen påkalles. For å sikre tilbakeskrivnings-URLen ytterligere, kan du bruke følgende teknikker:

  • Distribuer REST API i en privat VPC som kun er tilgjengelig for QuickSight-brukere.
  • For å forhindre replay-angrep kan et tidsstempel genereres ved siden av hashing-funksjonen og sendes som en tilleggsparameter i tilbakeskrivnings-URLen. Backend Lambda-funksjonen kan deretter modifiseres til kun å tillate tilbakeskrivninger innenfor en viss tidsbasert terskel.
  • Følg API-gatewayen adgangskontroll og sikkerhet beste praksis.
  • Minske potensiell tjenestenekt for offentlige APIer.

Du kan forbedre denne løsningen ytterligere for å gjengi et nettbasert skjema når tilbakeskrivnings-URLen åpnes. Dette kan implementeres ved dynamisk å generere et HTML-skjema i backend Lambda-funksjonen for å støtte inndata av tilleggsinformasjon. Hvis arbeidsbelastningen din krever et høyt antall tilbakeskrivninger som krever høyere gjennomstrømming eller samtidighet, kan et spesialbygd datalager som f.eks. Amazon Aurora PostgreSQL-kompatibel utgave kan være et bedre valg. For mer informasjon, se Påkalle en AWS Lambda-funksjon fra en Aurora PostgreSQL DB-klynge. Disse oppdateringene kan deretter synkroniseres til Amazon Redshift-tabeller ved hjelp av fødererte søk.

konklusjonen

Dette innlegget viste hvordan du bruker QuickSight sammen med Lambda, API Gateway, Secrets Manager og Amazon Redshift for å fange brukerinndata og sikkert oppdatere Amazon Redshift-datavarehuset ditt uten å forlate QuickSight BI-miljøet. Denne løsningen eliminerer behovet for å lage en ekstern applikasjon eller brukergrensesnitt for databaseoppdatering eller innsettingsoperasjoner, og reduserer relatert utviklings- og vedlikeholdskostnader. API-gateway-anropet kan også sikres ved hjelp av en nøkkel eller token for å sikre at bare anrop som kommer fra QuickSight blir akseptert av API-gatewayen. Dette vil bli dekket i påfølgende innlegg.


Om forfatterne

Srikanth Baheti er en spesialisert World Wide Principal Solutions Architect for Amazon QuickSight. Han startet sin karriere som konsulent og jobbet for flere private og offentlige organisasjoner. Senere jobbet han for PerkinElmer Health and Sciences & eResearch Technology Inc., hvor han var ansvarlig for å designe og utvikle nettapplikasjoner med høy trafikk, svært skalerbare og vedlikeholdbare datapipelines for rapporteringsplattformer som bruker AWS-tjenester og serverløs databehandling.

Raji Sivasubramaniam er Senior Solutions Architect hos AWS, med fokus på Analytics. Raji er spesialisert på å bygge ende-til-ende Enterprise Data Management, Business Intelligence og Analytics-løsninger for Fortune 500 og Fortune 100-selskaper over hele verden. Hun har inngående erfaring med integrerte helsedata og analyser med et bredt utvalg helsedatasett inkludert administrert marked, legemålretting og pasientanalyse.

Tidstempel:

Mer fra AWS Big Data