Führen Sie mit Amazon QuickSight sichere Datenbankrückschreibungen durch

Führen Sie mit Amazon QuickSight sichere Datenbankrückschreibungen durch

Quellknoten: 2641420

Amazon QuickSight ist eine skalierbare, serverlose, auf maschinellem Lernen (ML) basierende Business Intelligence (BI)-Lösung, die es einfach macht, eine Verbindung zu Ihren Daten herzustellen, interaktive Dashboards zu erstellen, Zugriff auf ML-gestützte Erkenntnisse zu erhalten und Visuals und Dashboards mit Zehntausenden zu teilen von internen und externen Benutzern, entweder innerhalb von QuickSight selbst oder eingebettet in eine beliebige Anwendung.

Ein Zurückschreiben ist die Möglichkeit, einen Data Mart, ein Data Warehouse oder ein anderes Datenbank-Backend aus BI-Dashboards heraus zu aktualisieren und die aktualisierten Daten nahezu in Echtzeit im Dashboard selbst zu analysieren. In diesem Beitrag zeigen wir, wie Sie mit QuickSight sichere Datenbank-Rückschreibungen durchführen.

Anwendungsfallübersicht

Um zu veranschaulichen, wie man mit QuickSight eine Rückschreibfunktion ermöglicht, betrachten wir ein fiktives Unternehmen, AnyCompany Inc. AnyCompany ist ein professionelles Dienstleistungsunternehmen, das sich auf die Bereitstellung von Personallösungen für seine Kunden spezialisiert hat. AnyCompany kam zu dem Schluss, dass die Ausführung von Workloads in der Cloud zur Unterstützung seiner wachsenden globalen Geschäftsanforderungen einen Wettbewerbsvorteil darstellt und nutzt die Cloud zum Hosten aller Workloads. AnyCompany hat beschlossen, die Art und Weise, wie seine Filialen seinen Kunden Angebote unterbreiten, zu verbessern. Derzeit erstellen die Filialen Kundenangebote manuell, und als ersten Schritt auf diesem Innovationsweg möchte AnyCompany eine Unternehmenslösung für die Erstellung von Kundenangeboten entwickeln, mit der Möglichkeit, lokale Preisdaten zum Zeitpunkt der Angebotserstellung dynamisch anzuwenden.

AnyCompany verwendet derzeit Amazon RedShift als Unternehmens-Data-Warehouse-Plattform und QuickSight als BI-Lösung.

Der Aufbau einer neuen Lösung bringt folgende Herausforderungen mit sich:

  • AnyCompany möchte eine Lösung, die einfach zu erstellen und zu warten ist, und möchte nicht in den Aufbau einer separaten Benutzeroberfläche investieren.
  • AnyCompany möchte die Funktionen seines bestehenden QuickSight BI-Dashboards erweitern, um auch die Angebotserstellung und Angebotsannahme zu ermöglichen. Dies vereinfacht die Einführung von Funktionen, da ihre Mitarbeiter bereits QuickSight-Dashboards verwenden und die benutzerfreundliche Oberfläche von QuickSight nutzen.
  • AnyCompany möchte den Angebotsverhandlungsverlauf speichern, der generierte, überprüfte und akzeptierte Angebote umfasst.
  • AnyCompany möchte ein neues Dashboard mit Angebotsverlaufsdaten für Analysen und Geschäftseinblicke erstellen.

In diesem Beitrag werden die Schritte zum Aktivieren der Rückschreibfunktion für Amazon Redshift von QuickSight beschrieben. Beachten Sie, dass die herkömmlichen BI-Tools schreibgeschützt sind und kaum oder gar keine Optionen zum Aktualisieren der Quelldaten bieten.

Lösungsüberblick

Diese Lösung nutzt die folgenden AWS-Dienste:

  • Amazon API-Gateway – Hostet und sichert die Write-Back-REST-API, die von QuickSight aufgerufen wird
  • AWS Lambda – Führt die zum Generieren des Hashs erforderliche Rechenfunktion und eine zweite Funktion zum sicheren Durchführen des Zurückschreibens aus
  • Amazon QuickSight – Bietet BI-Dashboards und Funktionen zur Angebotserstellung
  • Amazon RedShift – Speichert Angebote, Preise und andere relevante Datensätze
  • AWS Secrets Manager – Speichert und verwaltet Schlüssel zum Signieren von Hashes (Message Digest)

Obwohl diese Lösung Amazon Redshift als Datenspeicher verwendet, kann ein ähnlicher Ansatz mit jeder Datenbank implementiert werden, die die Erstellung benutzerdefinierter Funktionen (UDFs) unterstützt, die Lambda aufrufen können.

Die folgende Abbildung zeigt den Workflow zum Durchführen von Rückschreibungen aus QuickSight.

Der erste Schritt der Lösung besteht darin, durch Aufrufen einer Lambda-Funktion einen Hash oder einen Nachrichten-Digest des Attributsatzes in Amazon Redshift zu generieren. Dieser Schritt verhindert die Manipulation von Anforderungen. Um einen Hash zu generieren, ruft Amazon Redshift a auf Skalar Lambda UDF. Der hier verwendete Hashing-Mechanismus ist der beliebteste BLAKE2 Funktion (verfügbar in der Python-Bibliothek Hashlib). Um den Hash weiter abzusichern, wird Keyed Hashing verwendet, was eine schnellere und einfachere Alternative darstellt Hash-basierter Nachrichtenauthentifizierungscode (HMAC). Dieser Schlüssel wird von Secrets Manager generiert und gespeichert und sollte nur für zugelassene Anwendungen zugänglich sein. Nachdem der sichere Hash generiert wurde, wird er an Amazon Redshift zurückgegeben und in einer Amazon Redshift-Ansicht kombiniert.

Das Zurückschreiben des generierten Angebots an Amazon Redshift erfolgt durch die Funktion „Rückschreiben“ von Lambda, und es wird ein API Gateway-REST-API-Endpunkt erstellt, um Anforderungen zu sichern und an die Funktion „Rückschreiben“ weiterzuleiten. Die Rückschreibfunktion führt die folgenden Aktionen aus:

  1. Generieren Sie den Hash basierend auf den von QuickSight empfangenen API-Eingabeparametern.
  2. Signieren Sie den Hash, indem Sie den Schlüssel von Secrets Manager anwenden.
  3. Vergleichen Sie den generierten Hash mit dem von den Eingabeparametern empfangenen Hash mithilfe der in der verfügbaren Methode „compare_digest“. HMAC Modul.
  4. Schreiben Sie den Datensatz nach erfolgreicher Validierung in die Angebotsübermittlungstabelle in Amazon Redshift.

Der folgende Abschnitt enthält detaillierte Schritte mit Beispielnutzlasten und Codeausschnitten.

Generieren Sie den Hash

Der Hash wird mithilfe einer Lambda-UDF in Amazon Redshift generiert. Zusätzlich wird ein Secrets Manager-Schlüssel zum Signieren des Hashs verwendet. Führen Sie die folgenden Schritte aus, um den Hash zu erstellen:

  1. Erstellen Sie den Secrets Manager-Schlüssel aus dem AWS-Befehlszeilenschnittstelle (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. Erstellen Sie eine Lambda-UDF, um einen Hash für die Verschlüsselung zu generieren:
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. Definieren Sie eine Amazon Redshift UDF, um die Lambda-Funktion aufzurufen und einen Hash zu erstellen:
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>';

Das AWS Identity and Access Management and (IAM)-Rolle im vorherigen Schritt sollte die folgende Richtlinie angehängt sein, um die Lambda-Funktion aufrufen zu können:

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

  1. Holen Sie sich den Schlüssel vom Secrets Manager.

Dieser Schlüssel wird von der Lambda-Funktion verwendet, um den Hash weiter zu sichern. Dies ist in der angegeben get_secret Funktion in Schritt 2.

Richten Sie Amazon-Redshift-Datensätze in QuickSight ein

Das Dashboard zur Angebotserstellung verwendet die folgende Amazon-Redshift-Ansicht.

Erstellen Sie eine Amazon-Redshift-Ansicht, die alle vorhergehenden Spalten zusammen mit der Hash-Spalte verwendet:

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

Die Datensätze sehen wie im folgenden Screenshot aus.

Die vorherige Ansicht wird als QuickSight-Datensatz zum Generieren von Angeboten verwendet. Anhand des Datensatzes wird eine QuickSight-Analyse erstellt. Für Analysen nahezu in Echtzeit können Sie den QuickSight-Direktabfragemodus verwenden.

Erstellen Sie API-Gateway-Ressourcen

Der Rückschreibvorgang wird initiiert, indem QuickSight eine API-Gateway-Ressource aufruft, die die Lambda-Rückschreibfunktion aufruft. Als Voraussetzung für die Erstellung des berechneten Felds in QuickSight zum Aufruf der Rückschreib-API müssen Sie zunächst diese Ressourcen erstellen.

API Gateway sichert und ruft die Lambda-Rückschreibfunktion mit den Parametern auf, die als URL-Abfragezeichenfolgenparameter mit Zuordnungsvorlagen erstellt wurden. Die Mapping-Parameter können durch die Verwendung der Lambda-Proxy-Integration umgangen werden.

Erstellen Sie eine REST-API-Ressource vom Methodentyp GET, die Lambda-Funktionen (im nächsten Schritt erstellt) als Integrationstyp verwendet. Anweisungen finden Sie unter Erstellen einer REST-API in Amazon API Gateway und Richten Sie Lambda-Integrationen in API Gateway ein.

Der folgende Screenshot zeigt die Details zum Erstellen eines Abfragezeichenfolgenparameters für jeden an API Gateway übergebenen Parameter.

Der folgende Screenshot zeigt die Details zum Erstellen eines Zuordnungsvorlagenparameters für jeden an API Gateway übergebenen Parameter.

Erstellen Sie die Lambda-Funktion

Erstellen Sie eine neue Lambda-Funktion, die das API Gateway aufrufen soll. Die Lambda-Funktion führt die folgenden Schritte aus:

  1. Empfangen Sie Parameter von QuickSight über API Gateway und hashen Sie die verketteten Parameter.

Das folgende Codebeispiel ruft mithilfe des Ereignisobjekts der Lambda-Funktion Parameter aus dem API Gateway-Aufruf ab:

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

Die Funktion führt die Hashing-Logik aus, wie in der Abbildung gezeigt Hash erstellen Schritt zuvor mithilfe der verketteten Parameter, die von QuickSight übergeben werden.

  1. Vergleichen Sie die gehashte Ausgabe mit dem Hash-Parameter.

Wenn diese nicht übereinstimmen, erfolgt das Zurückschreiben nicht.

  1. Wenn die Hashes übereinstimmen, führen Sie ein Zurückschreiben durch. Überprüfen Sie, ob in der Angebotserstellungstabelle ein Datensatz vorhanden ist, indem Sie mithilfe der von QuickSight übergebenen Parameter eine Abfrage aus der Tabelle generieren:
query_str = "select * From tbquote where cust = '" + cust + "' and bgc = '" + bgc +"'" +" and skilledtrades = '" + skilledtrades + "' and shift = '" +shift + "' and jobdutydescription ='" + jobdutydescription + "'"

  1. Führen Sie basierend auf den Ergebnissen der Abfrage die folgende Aktion aus:
    1. Wenn für die vorhergehende Kombination kein Datensatz vorhanden ist, generieren Sie eine Einfügeabfrage und führen Sie sie mit allen Parametern und dem Status „generiert“ aus.
    2. Wenn für die vorhergehende Kombination ein Datensatz vorhanden ist, generieren Sie eine Einfügeabfrage mit dem Status „Wird überprüft“ und führen Sie sie aus. Die quote_Id für die bestehende Kombination wird wiederverwendet.

Erstellen Sie ein QuickSight-Visual

Dieser Schritt umfasst das Erstellen einer visuellen Tabelle, die ein berechnetes Feld verwendet, um Parameter an API Gateway zu übergeben und die vorhergehende Lambda-Funktion aufzurufen.

  1. Fügen Sie ein von QuickSight berechnetes Feld mit dem Namen „Angebot generieren“ hinzu, um die vom API Gateway gehostete URL zu speichern, die ausgelöst wird, um den Angebotsverlauf in Amazon Redshift zurückzuschreiben:
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. Erstellen Sie ein QuickSight-Tabellenvisual.
  2. Fügen Sie erforderliche Felder wie „Kunde“, „Fähigkeit“ und „Kosten“ hinzu.
  3. Fügen Sie das berechnete Feld „Angebot generieren“ hinzu und formatieren Sie es als Hyperlink.

Wenn Sie diesen Link wählen, wird der Datensatz in Amazon Redshift geschrieben. Dies setzt voraus, dass derselbe Hash-Wert zurückgegeben wird, wenn die Lambda-Funktion den Hash für die Parameter durchführt.

Der folgende Screenshot zeigt ein visuelles Beispiel einer Tabelle.

Schreiben Sie in die Amazon-Redshift-Datenbank

Der Secrets Manager-Schlüssel wird abgerufen und von der Lambda-Funktion verwendet, um den Hash zum Vergleich zu generieren. Das Zurückschreiben wird nur durchgeführt, wenn der Hash mit dem im Parameter übergebenen Hash übereinstimmt.

Die folgende Amazon-Redshift-Tabelle erfasst den Angebotsverlauf, wie er von der Lambda-Funktion ausgefüllt wird. Datensätze in Grün stellen die neuesten Datensätze für das Angebot dar.

Überlegungen und nächste Schritte

Die Verwendung sicherer Hashes verhindert die Manipulation von Nutzlastparametern, die im Browserfenster sichtbar sind, wenn die Rückschreib-URL aufgerufen wird. Um die Rückschreib-URL weiter zu sichern, können Sie die folgenden Techniken anwenden:

  • Stellen Sie die REST-API in einer privaten VPC bereit, auf die nur QuickSight-Benutzer zugreifen können.
  • Um Replay-Angriffe zu verhindern, kann neben der Hashing-Funktion ein Zeitstempel generiert und als zusätzlicher Parameter in der Write-Back-URL übergeben werden. Die Backend-Lambda-Funktion kann dann so geändert werden, dass Rückschreibungen nur innerhalb eines bestimmten zeitbasierten Schwellenwerts zulässig sind.
  • Folgen Sie dem API-Gateway Zutrittskontrolle und Sicherheitdienst Best Practices.
  • Mildern potenzieller Denial-of-Service für öffentlich zugängliche APIs.

Sie können diese Lösung weiter verbessern, um ein webbasiertes Formular zu rendern, wenn die Rückschreib-URL geöffnet wird. Dies könnte durch die dynamische Generierung eines HTML-Formulars in der Backend-Lambda-Funktion implementiert werden, um die Eingabe zusätzlicher Informationen zu unterstützen. Wenn Ihre Arbeitslast eine hohe Anzahl von Rückschreibvorgängen erfordert, die einen höheren Durchsatz oder Parallelität erfordern, ist ein speziell entwickelter Datenspeicher wie z Amazon Aurora PostgreSQL-kompatible Edition könnte eine bessere Wahl sein. Weitere Informationen finden Sie unter Aufrufen einer AWS Lambda-Funktion aus einem Aurora PostgreSQL-DB-Cluster. Diese Aktualisierungen können dann mit in Amazon Redshift-Tabellen synchronisiert werden föderierte Abfragen.

Zusammenfassung

In diesem Beitrag wurde gezeigt, wie Sie QuickSight zusammen mit Lambda, API Gateway, Secrets Manager und Amazon Redshift verwenden, um Benutzereingabedaten zu erfassen und Ihr Amazon Redshift Data Warehouse sicher zu aktualisieren, ohne Ihre QuickSight BI-Umgebung zu verlassen. Diese Lösung macht die Erstellung einer externen Anwendung oder Benutzeroberfläche für Datenbankaktualisierungs- oder -einfügevorgänge überflüssig und reduziert den damit verbundenen Entwicklungs- und Wartungsaufwand. Der API-Gateway-Aufruf kann auch mit einem Schlüssel oder Token gesichert werden, um sicherzustellen, dass nur von QuickSight ausgehende Aufrufe vom API-Gateway akzeptiert werden. Dies wird in den folgenden Beiträgen behandelt.


Über die Autoren

Srikanth Baheti ist ein spezialisierter weltweiter Hauptlösungsarchitekt für Amazon QuickSight. Er begann seine Karriere als Berater und arbeitete für mehrere private und staatliche Organisationen. Später arbeitete er für PerkinElmer Health and Sciences & eResearch Technology Inc., wo er für den Entwurf und die Entwicklung von Webanwendungen mit hohem Datenverkehr, hoch skalierbaren und wartbaren Datenpipelines für Berichtsplattformen unter Verwendung von AWS-Diensten und serverlosem Computing verantwortlich war.

Raji Sivasubramaniam ist Sr. Solutions Architect bei AWS mit Schwerpunkt auf Analytics. Raji ist auf die Entwicklung von End-to-End-Unternehmensdatenmanagement-, Business Intelligence- und Analyselösungen für Fortune-500- und Fortune-100-Unternehmen auf der ganzen Welt spezialisiert. Sie verfügt über fundierte Erfahrung in integrierten Gesundheitsdaten und -analysen mit einer Vielzahl von Gesundheitsdatensätzen, einschließlich Managed Market, Arzt-Targeting und Patientenanalysen.

Zeitstempel:

Mehr von AWS Big Data