Voer veilige database-write-backs uit met Amazon QuickSight

Voer veilige database-write-backs uit met Amazon QuickSight

Bronknooppunt: 2641420

Amazon QuickSight is een schaalbare, serverloze, door machine learning (ML) aangedreven business intelligence (BI)-oplossing die het gemakkelijk maakt om verbinding te maken met uw gegevens, interactieve dashboards te creëren, toegang te krijgen tot ML-inzichten en visuals en dashboards te delen met tienduizenden van interne en externe gebruikers, hetzij binnen QuickSight zelf of ingebed in een applicatie.

Terugschrijven is de mogelijkheid om een ​​datamart, datawarehouse of een andere database-backend bij te werken vanuit BI-dashboards en de bijgewerkte gegevens in bijna realtime te analyseren binnen het dashboard zelf. In dit bericht laten we zien hoe u beveiligde database-write-backs kunt uitvoeren met QuickSight.

Gebruik case-overzicht

Om te laten zien hoe u met QuickSight terugschrijfmogelijkheden kunt inschakelen, nemen we een fictief bedrijf, AnyCompany Inc. AnyCompany is een professioneel dienstverlenend bedrijf dat gespecialiseerd is in het leveren van personeelsoplossingen aan hun klanten. AnyCompany heeft vastgesteld dat het uitvoeren van workloads in de cloud ter ondersteuning van de groeiende wereldwijde bedrijfsbehoeften een concurrentievoordeel is en gebruikt de cloud om al zijn workloads te hosten. AnyCompany heeft besloten om de manier waarop haar filialen offertes aan klanten verstrekken, te verbeteren. Momenteel genereren de filialen klantoffertes handmatig, en als eerste stap in dit innovatietraject wil AnyCompany een bedrijfsoplossing ontwikkelen voor het genereren van offertes van klanten met de mogelijkheid om lokale prijsgegevens dynamisch toe te passen op het moment dat offertes worden gegenereerd.

AnyCompany gebruikt momenteel Amazon roodverschuiving als hun enterprise datawarehouse-platform en QuickSight als hun BI-oplossing.

Het bouwen van een nieuwe oplossing brengt de volgende uitdagingen met zich mee:

  • AnyCompany wil een oplossing die eenvoudig te bouwen en te onderhouden is, en ze willen niet investeren in het bouwen van een aparte gebruikersinterface.
  • AnyCompany wil de mogelijkheden van hun bestaande QuickSight BI-dashboard uitbreiden om ook het genereren en accepteren van offertes mogelijk te maken. Dit vereenvoudigt de uitrol van functies omdat hun werknemers al QuickSight-dashboards gebruiken en genieten van de gebruiksvriendelijke interface die QuickSight biedt.
  • AnyCompany wil de onderhandelingsgeschiedenis van offertes opslaan, inclusief gegenereerde, beoordeelde en geaccepteerde offertes.
  • AnyCompany wil een nieuw dashboard bouwen met gegevens uit de offertegeschiedenis voor analyse en zakelijke inzichten.

Dit bericht doorloopt de stappen om terugschrijffunctionaliteit naar Amazon Redshift vanuit QuickSight in te schakelen. Merk op dat de traditionele BI-tools alleen-lezen zijn met weinig tot geen opties om brongegevens bij te werken.

Overzicht oplossingen

Deze oplossing maakt gebruik van de volgende AWS-services:

  • Amazon API-gateway – Host en beveiligt de terugschrijf-REST API die wordt aangeroepen door QuickSight
  • AWS Lambda – Voert de rekenfunctie uit die nodig is om de hash te genereren en een tweede functie om het terugschrijven veilig uit te voeren
  • Amazon QuickSight – Biedt BI-dashboards en mogelijkheden voor het genereren van offertes
  • Amazon roodverschuiving – Slaat offertes, prijzen en andere relevante datasets op
  • AWS-geheimenmanager - Bewaart en beheert sleutels om hashes te ondertekenen (berichtsamenvatting)

Hoewel deze oplossing Amazon Redshift als gegevensopslag gebruikt, kan een vergelijkbare aanpak worden geïmplementeerd met elke database die ondersteuning biedt voor het maken van door de gebruiker gedefinieerde functies (UDF's) die Lambda kunnen aanroepen.

De volgende afbeelding toont de workflow voor het uitvoeren van terugschrijvingen vanuit QuickSight.

De eerste stap in de oplossing is het genereren van een hash of een berichtsamenvatting van de set attributen in Amazon Redshift door een Lambda-functie aan te roepen. Deze stap voorkomt dat er met verzoeken wordt geknoeid. Om een ​​hash te genereren, roept Amazon Redshift een scalaire Lambda UDF. Het hash-mechanisme dat hier wordt gebruikt, is populair BLAKE2 functie (beschikbaar in de Python-bibliotheek hasjlib). Om de hash verder te beveiligen, wordt keyed hashing gebruikt, wat een sneller en eenvoudiger alternatief is voor hash-gebaseerde berichtverificatiecode (HMAC). Deze sleutel wordt gegenereerd en opgeslagen door Secrets Manager en zou alleen toegankelijk moeten zijn voor toegestane applicaties. Nadat de beveiligde hash is gegenereerd, wordt deze teruggestuurd naar Amazon Redshift en gecombineerd in een Amazon Redshift-weergave.

Het terugschrijven van de gegenereerde quote naar Amazon Redshift wordt uitgevoerd door de Lambda-functie voor terugschrijven en er wordt een API Gateway REST API-eindpunt gemaakt om verzoeken te beveiligen en door te geven aan de terugschrijffunctie. De terugschrijffunctie voert de volgende acties uit:

  1. Genereer de hash op basis van de API-invoerparameters die zijn ontvangen van QuickSight.
  2. Onderteken de hash door de sleutel van Secrets Manager toe te passen.
  3. Vergelijk de gegenereerde hash met de hash die is ontvangen van de invoerparameters met behulp van de Compare_digest-methode die beschikbaar is in de HMAC module.
  4. Na succesvolle validatie schrijft u het record naar de tabel voor het indienen van offertes in Amazon Redshift.

De volgende sectie bevat gedetailleerde stappen met voorbeeldpayloads en codefragmenten.

Genereer de hasj

De hash wordt gegenereerd met behulp van een Lambda UDF in Amazon Redshift. Bovendien wordt een Secrets Manager-sleutel gebruikt om de hash te ondertekenen. Voer de volgende stappen uit om de hash te maken:

  1. Maak de Secrets Manager-sleutel van de AWS-opdrachtregelinterface (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. Maak een Lambda UDF om een ​​hash voor codering te genereren:
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. Definieer een Amazon Redshift UDF om de Lambda-functie aan te roepen om een ​​hash te maken:
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 Identiteits- en toegangsbeheer (IAM)-rol in de voorgaande stap moet het volgende beleid bevatten om de Lambda-functie te kunnen aanroepen:

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

  1. Haal de sleutel op bij Secrets Manager.

Deze sleutel wordt gebruikt door de Lambda-functie om de hash verder te beveiligen. Dit staat aangegeven in de krijg_geheim functie in stap 2.

Stel Amazon Redshift-datasets in QuickSight in

Het dashboard voor het genereren van offertes gebruikt de volgende Amazon Redshift-weergave.

Maak een Amazon Redshift-weergave die alle voorgaande kolommen samen met de hash-kolom gebruikt:

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

De records zien eruit als de volgende schermafbeelding.

De voorgaande weergave wordt gebruikt als de QuickSight-gegevensset om offertes te genereren. Met behulp van de dataset wordt een QuickSight-analyse gemaakt. Voor bijna-realtime analyse kunt u de QuickSight directe querymodus gebruiken.

Maak API Gateway-resources

De terugschrijfbewerking wordt geïnitieerd doordat QuickSight een API Gateway-resource aanroept, die de Lambda-terugschrijffunctie aanroept. Als vereiste voor het maken van het berekende veld in QuickSight om de terugschrijf-API aan te roepen, moet u eerst deze bronnen maken.

API Gateway beveiligt en roept de Lambda-functie voor terugschrijven op met de parameters die zijn gemaakt als URL-queryreeksparameters met toewijzingssjablonen. De toewijzingsparameters kunnen worden vermeden door de Lambda-proxy-integratie te gebruiken.

Maak een REST API-resource van het methodetype GET die Lambda-functies gebruikt (gemaakt in de volgende stap) als het integratietype. Raadpleeg voor instructies Een REST API maken in Amazon API Gateway en Stel Lambda-integraties in API Gateway in.

De volgende schermafbeelding toont de details voor het maken van een querytekenreeksparameter voor elke parameter die wordt doorgegeven aan API Gateway.

De volgende schermafbeelding toont de details voor het maken van een toewijzingssjabloonparameter voor elke parameter die wordt doorgegeven aan API Gateway.

De Lambda-functie maken

Maak een nieuwe Lambda-functie voor de API Gateway om aan te roepen. De Lambda-functie voert de volgende stappen uit:

  1. Ontvang parameters van QuickSight via API Gateway en hash de samengevoegde parameters.

Het volgende codevoorbeeld haalt parameters op uit de API Gateway-aanroep met behulp van het gebeurtenisobject van de Lambda-functie:

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

De functie voert de hash-logica uit zoals weergegeven in de hasj maken stap eerder met behulp van de samengevoegde parameters die door QuickSight zijn doorgegeven.

  1. Vergelijk de gehashte uitvoer met de hash-parameter.

Als deze niet overeenkomen, vindt het terugschrijven niet plaats.

  1. Voer een write-back uit als de hashes overeenkomen. Controleer op de aanwezigheid van een record in de tabel voor het genereren van offertes door een query uit de tabel te genereren met behulp van de parameters die zijn doorgegeven vanuit QuickSight:
query_str = "select * From tbquote where cust = '" + cust + "' and bgc = '" + bgc +"'" +" and skilledtrades = '" + skilledtrades + "' and shift = '" +shift + "' and jobdutydescription ='" + jobdutydescription + "'"

  1. Voer de volgende actie uit op basis van de resultaten van de query:
    1. Als er geen record bestaat voor de voorgaande combinatie, genereert en voert u een invoegquery uit met alle parameters met de status zoals gegenereerd.
    2. Als er een record bestaat voor de voorgaande combinatie, genereert en voert u een invoegquery uit met de status In beoordeling. De quote_Id voor de bestaande combinatie wordt opnieuw gebruikt.

Maak een QuickSight-visual

Deze stap omvat het maken van een tabelvisual die een berekend veld gebruikt om parameters door te geven aan API Gateway en de voorgaande Lambda-functie aan te roepen.

  1. Voeg een door QuickSight berekend veld met de naam Generate Quote toe om de door de API Gateway gehoste URL vast te houden die wordt geactiveerd om de quotegeschiedenis terug te schrijven naar 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. Maak een QuickSight-tabelvisual.
  2. Voeg vereiste velden toe, zoals Klant, Vaardigheid en Kosten.
  3. Voeg het berekende veld Offerte genereren toe en style dit als een hyperlink.

Als u deze koppeling kiest, wordt het record naar Amazon Redshift geschreven. Dit is afhankelijk van dezelfde hash-waarde die terugkeert wanneer de Lambda-functie de hash op de parameters uitvoert.

De volgende schermafbeelding toont een voorbeeld van een tabelvisual.

Schrijf naar de Amazon Redshift-database

De Secrets Manager-sleutel wordt opgehaald en gebruikt door de Lambda-functie om de hash ter vergelijking te genereren. Het terugschrijven wordt alleen uitgevoerd als de hash overeenkomt met de hash die in de parameter is doorgegeven.

De volgende Amazon Redshift-tabel legt de citaatgeschiedenis vast zoals ingevuld door de Lambda-functie. Records in groen vertegenwoordigen de meest recente records voor de offerte.

Overwegingen en volgende stappen

Het gebruik van veilige hashes voorkomt dat er wordt geknoeid met payloadparameters die zichtbaar zijn in het browservenster wanneer de terugschrijf-URL wordt aangeroepen. Om de terugschrijf-URL verder te beveiligen, kunt u de volgende technieken gebruiken:

  • Implementeer de REST API in een privé-VPC die alleen toegankelijk is voor QuickSight-gebruikers.
  • Om replay-aanvallen te voorkomen, kan naast de hashing-functie een tijdstempel worden gegenereerd en als extra parameter in de terugschrijf-URL worden doorgegeven. De backend Lambda-functie kan vervolgens worden gewijzigd om alleen terugschrijven toe te staan ​​binnen een bepaalde op tijd gebaseerde drempel.
  • Volg de API-gateway toegangscontrole en veiligheid beste praktijken.
  • Verzachten potentiële Denial of Service voor openbare API's.

U kunt deze oplossing verder verbeteren om een ​​webgebaseerd formulier weer te geven wanneer de terugschrijf-URL wordt geopend. Dit kan worden geïmplementeerd door dynamisch een HTML-formulier te genereren in de backend Lambda-functie om de invoer van aanvullende informatie te ondersteunen. Als uw workload een groot aantal terugschrijvingen vereist die een hogere doorvoer of gelijktijdigheid vereisen, is een speciaal gebouwde gegevensopslag zoals Amazon Aurora PostgreSQL-compatibele editie misschien een betere keuze. Voor meer informatie, zie Een AWS Lambda-functie aanroepen vanuit een Aurora PostgreSQL DB-cluster. Deze updates kunnen vervolgens worden gesynchroniseerd in Amazon Redshift-tabellen met behulp van federatieve zoekopdrachten.

Conclusie

Dit bericht liet zien hoe je QuickSight samen met Lambda, API Gateway, Secrets Manager en Amazon Redshift kunt gebruiken om gebruikersinvoergegevens vast te leggen en je Amazon Redshift-datawarehouse veilig bij te werken zonder je QuickSight BI-omgeving te verlaten. Deze oplossing elimineert de noodzaak om een ​​externe applicatie of gebruikersinterface te maken voor database-updates of invoegbewerkingen, en vermindert de gerelateerde ontwikkelings- en onderhoudskosten. De API Gateway-oproep kan ook worden beveiligd met een sleutel of token om ervoor te zorgen dat alleen oproepen afkomstig van QuickSight worden geaccepteerd door de API Gateway. Dit komt aan bod in volgende posts.


Over de auteurs

Srikanth Baheti is een gespecialiseerde World Wide Principal Solutions Architect voor Amazon QuickSight. Hij begon zijn carrière als consultant en werkte voor meerdere particuliere en overheidsorganisaties. Later werkte hij voor PerkinElmer Health and Sciences & eResearch Technology Inc, waar hij verantwoordelijk was voor het ontwerpen en ontwikkelen van high-traffic webapplicaties, zeer schaalbare en onderhoudbare datapijplijnen voor rapportageplatforms die gebruikmaken van AWS-services en Serverless computing.

Raji Sivasubramaniam is Sr. Solutions Architect bij AWS, met een focus op Analytics. Raji is gespecialiseerd in het ontwerpen van end-to-end Enterprise Data Management, Business Intelligence en Analytics-oplossingen voor Fortune 500- en Fortune 100-bedrijven over de hele wereld. Ze heeft diepgaande ervaring in geïntegreerde zorggegevens en -analyses met een breed scala aan gegevenssets in de gezondheidszorg, waaronder beheerde markt, targeting op artsen en patiëntanalyses.

Tijdstempel:

Meer van AWS-bigdata