Utför säkra databasåterskrivningar med Amazon QuickSight

Utför säkra databasåterskrivningar med Amazon QuickSight

Källnod: 2641420

Amazon QuickSight är en skalbar, serverlös, maskininlärning (ML)-driven Business Intelligence-lösning (BI) som gör det enkelt att ansluta till din data, skapa interaktiva instrumentpaneler, få tillgång till ML-aktiverade insikter och dela grafik och instrumentpaneler med tiotusentals av interna och externa användare, antingen inom QuickSight själv eller inbäddade i valfri applikation.

En återskrivning är möjligheten att uppdatera en datamarknad, datalager eller någon annan databasbackend från BI-instrumentpaneler och analysera uppdaterade data i nästan realtid inom själva instrumentpanelen. I det här inlägget visar vi hur man utför säkra databasåterskrivningar med QuickSight.

Använda fallöversikt

För att visa hur man möjliggör en återskrivningskapacitet med QuickSight, låt oss överväga ett fiktivt företag, AnyCompany Inc. AnyCompany är ett professionellt tjänsteföretag som specialiserat sig på att tillhandahålla arbetskraftslösningar till sina kunder. AnyCompany fastställde att att köra arbetsbelastningar i molnet för att stödja dess växande globala affärsbehov är en konkurrensfördel och använder molnet för att vara värd för alla sina arbetsbelastningar. AnyCompany bestämde sig för att förbättra sättet sina filialer tillhandahåller offerter till sina kunder. För närvarande genererar filialerna kundofferter manuellt, och som ett första steg i denna innovationsresa vill AnyCompany utveckla en företagslösning för generering av kundofferter med förmågan att dynamiskt tillämpa lokal prisinformation vid tidpunkten för offertgenerering.

AnyCompany använder för närvarande Amazon RedShift som deras företagsdatalagerplattform och QuickSight som deras BI-lösning.

Att bygga en ny lösning kommer med följande utmaningar:

  • AnyCompany vill ha en lösning som är enkel att bygga och underhålla, och de vill inte investera i att bygga ett separat användargränssnitt.
  • AnyCompany vill utöka funktionerna i deras befintliga QuickSight BI-instrumentpanel för att även möjliggöra offertgenerering och offertacceptans. Detta kommer att förenkla utrullningen av funktioner eftersom deras anställda redan använder QuickSights instrumentpaneler och njuta av det lättanvända gränssnittet som QuickSight tillhandahåller.
  • AnyCompany vill lagra offertförhandlingshistoriken som inkluderar genererade, granskade och accepterade offerter.
  • AnyCompany vill bygga en ny instrumentpanel med offerthistorikdata för analys och affärsinsikter.

Det här inlägget går igenom stegen för att aktivera återskrivningsfunktioner till Amazon Redshift från QuickSight. Observera att de traditionella BI-verktygen är skrivskyddade med få eller inga alternativ för att uppdatera källdata.

Lösningsöversikt

Denna lösning använder följande AWS-tjänster:

  • Amazon API Gateway – Värdar och säkrar återskrivnings-REST API som kommer att anropas av QuickSight
  • AWS Lambda – Kör den beräkningsfunktion som krävs för att generera hashen och en andra funktion för att säkert utföra återskrivningen
  • Amazon QuickSight – Erbjuder BI-instrumentpaneler och möjlighet att generera offerter
  • Amazon RedShift – Lagrar offerter, priser och andra relevanta datauppsättningar
  • AWS Secrets Manager – Lagrar och hanterar nycklar för att signera hash (meddelandesammandrag)

Även om denna lösning använder Amazon Redshift som datalager, kan ett liknande tillvägagångssätt implementeras med vilken databas som helst som stöder att skapa användardefinierade funktioner (UDF) som kan anropa Lambda.

Följande figur visar arbetsflödet för att utföra återskrivningar från QuickSight.

Det första steget i lösningen är att generera en hash eller ett meddelandesammandrag av uppsättningen attribut i Amazon Redshift genom att anropa en Lambda-funktion. Detta steg förhindrar manipulering av begäran. För att generera en hash anropar Amazon Redshift en skalär Lambda UDF. Hashingmekanismen som används här är den populära BLAKE2 funktion (tillgänglig i Python-biblioteket hashlib). För att ytterligare säkra hashen används keyed hashing vilket är ett snabbare och enklare alternativ till hash-baserat meddelandeautentiseringskod (HMAC). Denna nyckel genereras och lagras av Secrets Manager och bör endast vara tillgänglig för tillåtna applikationer. Efter att den säkra hashen har genererats, returneras den till Amazon Redshift och kombineras i en Amazon Redshift-vy.

Att skriva tillbaka den genererade offerten till Amazon Redshift utförs av funktionen för återskrivning av Lambda, och en API Gateway REST API-slutpunkt skapas för att säkra och skicka förfrågningar till återskrivningsfunktionen. Återskrivningsfunktionen utför följande åtgärder:

  1. Generera hashen baserat på API-indataparametrarna som tagits emot från QuickSight.
  2. Signera hashen genom att använda nyckeln från Secrets Manager.
  3. Jämför den genererade hashen med hashen som tas emot från indataparametrarna med hjälp av metoden compare_digest som är tillgänglig i HMAC modul.
  4. Efter framgångsrik validering, skriv posten till offerttabellen i Amazon Redshift.

Följande avsnitt innehåller detaljerade steg med exempel på nyttolaster och kodavsnitt.

Generera hashen

Hashen genereras med en Lambda UDF i Amazon Redshift. Dessutom används en Secrets Manager-nyckel för att signera hashen. För att skapa hashen, slutför följande steg:

  1. Skapa Secrets Manager-nyckeln från AWS-kommandoradsgränssnitt (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. Skapa en Lambda UDF för att generera en hash för 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. Definiera en Amazon Redshift UDF för att anropa Lambda-funktionen för att skapa 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>';

Smakämnen AWS identitets- och åtkomsthantering (IAM) roll i föregående steg bör ha följande policy kopplad för att kunna anropa Lambda-funktionen:

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

  1. Hämta nyckeln från Secrets Manager.

Denna nyckel används av Lambda-funktionen för att ytterligare säkra hashen. Detta anges i get_hemlig funktion i steg 2.

Konfigurera Amazon Redshift-datauppsättningar i QuickSight

Instrumentpanelen för offertgenerering använder följande Amazon Redshift-vy.

Skapa en Amazon Redshift-vy som använder alla föregående kolumner tillsammans med hashkolumnen:

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

Posterna kommer att se ut som följande skärmdump.

Den föregående vyn kommer att användas som QuickSight-datauppsättning för att generera offerter. En QuickSight-analys kommer att skapas med hjälp av datamängden. För nästan realtidsanalys kan du använda QuickSights direktfrågeläge.

Skapa API Gateway-resurser

Återskrivningsoperationen initieras av att QuickSight anropar en API Gateway-resurs, som anropar Lambda-återskrivningsfunktionen. Som en förutsättning för att skapa det beräknade fältet i QuickSight för att anropa återskrivnings-API:et måste du först skapa dessa resurser.

API Gateway säkrar och anropar återskrivningslamdafunktionen med parametrarna skapade som URL-frågesträngsparametrar med mappningsmallar. Mappningsparametrarna kan undvikas genom att använda Lambda-proxyintegration.

Skapa en REST API-resurs av metodtyp GET som använder Lambda-funktioner (skapas i nästa steg) som integrationstyp. För instruktioner, se Skapa ett REST API i Amazon API Gateway och Konfigurera Lambda-integrationer i API Gateway.

Följande skärmdump visar detaljerna för att skapa en frågesträngsparameter för varje parameter som skickas till API Gateway.

Följande skärmdump visar detaljerna för att skapa en mappningsmallparameter för varje parameter som skickas till API Gateway.

Skapa Lambda-funktionen

Skapa en ny Lambda-funktion för API-gatewayen att anropa. Lambdafunktionen utför följande steg:

  1. Ta emot parametrar från QuickSight via API Gateway och hasha de sammanlänkade parametrarna.

Följande kodexempel hämtar parametrar från API Gateway-anropet med hjälp av händelseobjektet för Lambda-funktionen:

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

Funktionen utför hashlogiken som visas i skapa hash steg tidigare med de sammanlänkade parametrarna som skickats av QuickSight.

  1. Jämför den hashade utdatan med hashparametern.

Om dessa inte stämmer överens kommer återskrivningen inte att ske.

  1. Om hasharna matchar, gör en återskrivning. Kontrollera om det finns en post i offertgenereringstabellen genom att generera en fråga från tabellen med parametrarna som skickas från QuickSight:
query_str = "select * From tbquote where cust = '" + cust + "' and bgc = '" + bgc +"'" +" and skilledtrades = '" + skilledtrades + "' and shift = '" +shift + "' and jobdutydescription ='" + jobdutydescription + "'"

  1. Slutför följande åtgärd baserat på resultaten av frågan:
    1. Om det inte finns någon post för föregående kombination, generera och kör en infogningsfråga med alla parametrar med status som genererad.
    2. Om det finns en post för föregående kombination, generera och kör en infogningsfråga med statusen som under granskning. Quote_Id för den befintliga kombinationen kommer att återanvändas.

Skapa en QuickSight-bild

Det här steget innebär att skapa en tabellvisualisering som använder ett beräknat fält för att skicka parametrar till API Gateway och anropa den föregående Lambda-funktionen.

  1. Lägg till ett QuickSight-beräknat fält med namnet Generate Quote för att hålla URL:en som är värd för API Gateway som kommer att triggas för att skriva tillbaka offerthistoriken till 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. Skapa en QuickSight-tabellvisual.
  2. Lägg till obligatoriska fält som kund, skicklighet och kostnad.
  3. Lägg till fältet Generera offert beräknat och formatera detta som en hyperlänk.

Om du väljer den här länken kommer posten att skrivas in i Amazon Redshift. Detta åligger samma hashvärde som återkommer när lambdafunktionen utför hash på parametrarna.

Följande skärmdump visar ett exempel på en tabell.

Skriv till Amazon Redshift-databasen

Secrets Manager-nyckeln hämtas och används av Lambda-funktionen för att generera hash för jämförelse. Återskrivningen kommer endast att utföras om hashen matchar den hash som skickas i parametern.

Följande Amazon Redshift-tabell kommer att fånga citathistoriken som fylld av Lambda-funktionen. Poster i grönt representerar de senaste posterna för offerten.

Överväganden och nästa steg

Genom att använda säkra hashar förhindras manipulering av nyttolastparametrar som är synliga i webbläsarfönstret när återskrivningsadressen anropas. För att ytterligare säkra återskrivningsadressen kan du använda följande tekniker:

  • Distribuera REST API i en privat VPC som endast är tillgänglig för QuickSight-användare.
  • För att förhindra replay-attacker kan en tidsstämpel genereras vid sidan av hashfunktionen och skickas som en extra parameter i återskrivningsadressen. Backend Lambda-funktionen kan sedan modifieras för att endast tillåta återskrivningar inom en viss tidsbaserad tröskel.
  • Följ API-gatewayen åtkomstkontroll och säkerhet bästa praxis.
  • Mildra potentiellt Denial of Service för offentliga API:er.

Du kan förbättra den här lösningen ytterligare för att återge ett webbaserat formulär när återskrivnings-URLen öppnas. Detta kan implementeras genom att dynamiskt generera ett HTML-formulär i backend Lambda-funktionen för att stödja inmatning av ytterligare information. Om din arbetsbelastning kräver ett stort antal återskrivningar som kräver högre genomströmning eller samtidighet, kan ett specialbyggt datalager som t.ex. Amazon Aurora PostgreSQL-kompatibel utgåva kan vara ett bättre val. För mer information, se Anropar en AWS Lambda-funktion från ett Aurora PostgreSQL DB-kluster. Dessa uppdateringar kan sedan synkroniseras till Amazon Redshift-tabeller med hjälp av federerade frågor.

Slutsats

Det här inlägget visade hur du använder QuickSight tillsammans med Lambda, API Gateway, Secrets Manager och Amazon Redshift för att fånga användarindata och säkert uppdatera ditt Amazon Redshift-datalager utan att lämna din QuickSight BI-miljö. Denna lösning eliminerar behovet av att skapa en extern applikation eller ett användargränssnitt för databasuppdatering eller infogningsoperationer och minskar relaterad utvecklings- och underhållskostnader. API Gateway-anropet kan också säkras med en nyckel eller token för att säkerställa att endast samtal som kommer från QuickSight accepteras av API Gateway. Detta kommer att behandlas i efterföljande inlägg.


Om författarna

Srikanth Baheti är en specialiserad World Wide Principal Solutions Architect för Amazon QuickSight. Han började sin karriär som konsult och arbetade för flera privata och statliga organisationer. Senare arbetade han för PerkinElmer Health and Sciences & eResearch Technology Inc, där han ansvarade för att designa och utveckla webbapplikationer med hög trafik, mycket skalbara och underhållsbara datapipelines för rapporteringsplattformar som använder AWS-tjänster och serverlös datoranvändning.

Raji Sivasubramaniam är Sr. Solutions Architect på AWS, med fokus på Analytics. Raji är specialiserad på att utveckla end-to-end Enterprise Data Management-, Business Intelligence- och Analytics-lösningar för Fortune 500- och Fortune 100-företag över hela världen. Hon har djupgående erfarenhet av integrerad vårddata och analys med ett brett utbud av vårddatauppsättningar, inklusive hanterad marknad, läkarinriktning och patientanalys.

Tidsstämpel:

Mer från AWS Big Data