Esegui riscritture sicure del database con Amazon QuickSight

Esegui riscritture sicure del database con Amazon QuickSight

Nodo di origine: 2641420

Amazon QuickSight è una soluzione di business intelligence (BI) scalabile, serverless e basata sul machine learning (ML) che semplifica la connessione ai dati, la creazione di dashboard interattive, l'accesso a informazioni approfondite abilitate al machine learning e la condivisione di elementi visivi e dashboard con decine di migliaia di persone di utenti interni ed esterni, all'interno di QuickSight stesso o incorporato in qualsiasi applicazione.

Un write-back è la possibilità di aggiornare un data mart, un data warehouse o qualsiasi altro backend di database dai dashboard BI e analizzare i dati aggiornati in tempo quasi reale all'interno del dashboard stesso. In questo post mostriamo come eseguire writeback sicuri del database con QuickSight.

Panoramica dei casi d'uso

Per dimostrare come abilitare una funzionalità di write-back con QuickSight, consideriamo una società fittizia, AnyCompany Inc. AnyCompany è una società di servizi professionali specializzata nella fornitura di soluzioni per la forza lavoro ai propri clienti. AnyCompany ha stabilito che l'esecuzione dei carichi di lavoro nel cloud per supportare le crescenti esigenze aziendali globali rappresenta un vantaggio competitivo e utilizza il cloud per ospitare tutti i suoi carichi di lavoro. AnyCompany ha deciso di migliorare il modo in cui le sue filiali forniscono preventivi ai propri clienti. Attualmente, le filiali generano manualmente i preventivi dei clienti e, come primo passo in questo percorso di innovazione, AnyCompany sta cercando di sviluppare una soluzione aziendale per la generazione dei preventivi dei clienti con la capacità di applicare dinamicamente i dati sui prezzi locali al momento della generazione del preventivo.

AnyCompany attualmente utilizza Amazon RedShift come piattaforma di data warehouse aziendale e QuickSight come soluzione BI.

La creazione di una nuova soluzione comporta le seguenti sfide:

  • AnyCompany desidera una soluzione facile da creare e gestire e non vuole investire nella creazione di un'interfaccia utente separata.
  • AnyCompany desidera estendere le funzionalità del dashboard QuickSight BI esistente per consentire anche la generazione e l'accettazione dei preventivi. Ciò semplificherà l'implementazione delle funzionalità perché i loro dipendenti utilizzano già i dashboard QuickSight e apprezzano l'interfaccia facile da usare fornita da QuickSight.
  • AnyCompany desidera archiviare la cronologia delle negoziazioni dei preventivi che include preventivi generati, esaminati e accettati.
  • AnyCompany desidera creare una nuova dashboard con dati storici sui preventivi per analisi e approfondimenti aziendali.

Questo post illustra i passaggi per abilitare la funzionalità di write-back su Amazon Redshift da QuickSight. Tieni presente che gli strumenti di BI tradizionali sono di sola lettura con poche o nessuna opzione per aggiornare i dati di origine.

Panoramica della soluzione

Questa soluzione utilizza i seguenti servizi AWS:

  • Gateway API Amazon – Ospita e protegge l'API REST di write-back che verrà richiamata da QuickSight
  • AWS Lambda – Esegue la funzione di calcolo richiesta per generare l'hash e una seconda funzione per eseguire in modo sicuro il writeback
  • Amazon QuickSight – Offre dashboard BI e funzionalità di generazione di preventivi
  • Amazon RedShift – Memorizza preventivi, prezzi e altri set di dati rilevanti
  • AWS Secrets Manager – Memorizza e gestisce le chiavi per firmare gli hash (message digest)

Sebbene questa soluzione utilizzi Amazon Redshift come archivio dati, un approccio simile può essere implementato con qualsiasi database che supporti la creazione di funzioni definite dall'utente (UDF) in grado di richiamare Lambda.

La figura seguente mostra il flusso di lavoro per eseguire le operazioni di ripristino da QuickSight.

Il primo passaggio della soluzione consiste nel generare un hash o un digest del messaggio del set di attributi in Amazon Redshift richiamando una funzione Lambda. Questo passaggio impedisce la manomissione delle richieste. Per generare un hash, Amazon Redshift richiama a scalare Lambda UDF. Il meccanismo di hashing utilizzato qui è il più popolare BLAKE2 funzione (disponibile nella libreria Python hashlib). Per proteggere ulteriormente l'hash, viene utilizzato l'hashing con chiave, che rappresenta un'alternativa più rapida e semplice a codice di autenticazione del messaggio basato su hash (HMAC). Questa chiave viene generata e archiviata da Secrets Manager e deve essere accessibile solo alle applicazioni consentite. Una volta generato, l'hash sicuro viene restituito ad Amazon Redshift e combinato in una vista Amazon Redshift.

La riscrittura del preventivo generato su Amazon Redshift viene eseguita dalla funzione Lambda di write-back e viene creato un endpoint API REST di API Gateway per proteggere e trasmettere le richieste alla funzione di write-back. La funzione di write-back esegue le seguenti azioni:

  1. Genera l'hash in base ai parametri di input API ricevuti da QuickSight.
  2. Firma l'hash applicando la chiave da Secrets Manager.
  3. Confronta l'hash generato con l'hash ricevuto dai parametri di input utilizzando il metodo compare_digest disponibile nel file HMAC modulo.
  4. Una volta completata la convalida, scrivi il record nella tabella di invio del preventivo in Amazon Redshift.

La sezione seguente fornisce passaggi dettagliati con payload di esempio e snippet di codice.

Genera l'hash

L'hash viene generato utilizzando una UDF Lambda in Amazon Redshift. Inoltre, per firmare l'hash viene utilizzata una chiave Secrets Manager. Per creare l'hash, completare i seguenti passaggi:

  1. Crea la chiave Secrets Manager dal file Interfaccia della riga di comando di AWS (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. Crea una UDF Lambda per generare un hash per la crittografia:
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. Definisci un'UDF di Amazon Redshift per chiamare la funzione Lambda per creare un 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>';

Il Gestione dell'identità e dell'accesso di AWS (IAM) nel passaggio precedente dovrebbe avere la seguente policy allegata per poter richiamare la funzione Lambda:

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

  1. Prendi la chiave dal Secrets Manager.

Questa chiave viene utilizzata dalla funzione Lambda per proteggere ulteriormente l'hash. Ciò è indicato nel get_secret funzione al passaggio 2.

Configura i set di dati Amazon Redshift in QuickSight

Il dashboard di generazione del preventivo utilizza la seguente visualizzazione Amazon Redshift.

Crea una vista Amazon Redshift che utilizzi tutte le colonne precedenti insieme alla colonna hash:

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

I record appariranno come nella schermata seguente.

La vista precedente verrà utilizzata come set di dati QuickSight per generare quotazioni. Verrà creata un'analisi QuickSight utilizzando il set di dati. Per l'analisi quasi in tempo reale, è possibile utilizzare la modalità di query diretta di QuickSight.

Crea risorse API Gateway

L'operazione di writeback viene avviata da QuickSight che richiama una risorsa API Gateway, che richiama la funzione di writeback Lambda. Come prerequisito per creare il campo calcolato in QuickSight per chiamare l'API di write-back, devi prima creare queste risorse.

API Gateway protegge e richiama la funzione Lambda di write-back con i parametri creati come parametri della stringa di query URL con modelli di mappatura. I parametri di mappatura possono essere evitati utilizzando l'integrazione proxy Lambda.

Crea una risorsa API REST di tipo di metodo GET che utilizza le funzioni Lambda (create nel passaggio successivo) come tipo di integrazione. Per istruzioni, fare riferimento a Creazione di un'API REST in Amazon API Gateway ed Configura le integrazioni Lambda in API Gateway.

Lo screenshot seguente mostra i dettagli per la creazione di un parametro della stringa di query per ogni parametro passato ad API Gateway.

Lo screenshot seguente mostra i dettagli per la creazione di un parametro del modello di mappatura per ogni parametro passato ad API Gateway.

Crea la funzione Lambda

Crea una nuova funzione Lambda che API Gateway possa richiamare. La funzione Lambda esegue i seguenti passaggi:

  1. Ricevi parametri da QuickSight tramite API Gateway ed esegui l'hashing dei parametri concatenati.

Il seguente esempio di codice recupera i parametri dalla chiamata API Gateway utilizzando l'oggetto evento della funzione Lambda:

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

La funzione esegue la logica di hashing come mostrato nel file creare hash passaggio precedente utilizzando i parametri concatenati passati da QuickSight.

  1. Confronta l'output con hash con il parametro hash.

Se questi non corrispondono, la riscrittura non avverrà.

  1. Se gli hash corrispondono, esegui un write-back. Verifica la presenza di un record nella tabella di generazione del preventivo generando una query dalla tabella utilizzando i parametri passati da QuickSight:
query_str = "select * From tbquote where cust = '" + cust + "' and bgc = '" + bgc +"'" +" and skilledtrades = '" + skilledtrades + "' and shift = '" +shift + "' and jobdutydescription ='" + jobdutydescription + "'"

  1. Completa la seguente azione in base ai risultati della query:
    1. Se non esiste alcun record per la combinazione precedente, genera ed esegui una query di inserimento utilizzando tutti i parametri con lo stato generato.
    2. Se esiste un record per la combinazione precedente, genera ed esegui una query di inserimento con lo stato in revisione. Il quote_Id per la combinazione esistente verrà riutilizzato.

Creare un oggetto visivo QuickSight

Questo passaggio prevede la creazione di un oggetto visivo tabella che utilizza un campo calcolato per passare i parametri ad API Gateway e richiamare la funzione Lambda precedente.

  1. Aggiungi un campo calcolato QuickSight denominato Genera preventivo per contenere l'URL ospitato dal gateway API che verrà attivato per riscrivere la cronologia dei preventivi in ​​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. Creare un oggetto visivo della tabella QuickSight.
  2. Aggiungi campi obbligatori come Cliente, Competenza e Costo.
  3. Aggiungi il campo calcolato Genera preventivo e definiscilo come collegamento ipertestuale.

Scegliendo questo collegamento il record verrà scritto in Amazon Redshift. Ciò dipende dallo stesso valore hash restituito quando la funzione Lambda esegue l'hash sui parametri.

Lo screenshot seguente mostra un esempio visivo di tabella.

Scrivi nel database Amazon Redshift

La chiave Secrets Manager viene recuperata e utilizzata dalla funzione Lambda per generare l'hash per il confronto. Il writeback verrà eseguito solo se l'hash corrisponde all'hash passato nel parametro.

La seguente tabella Amazon Redshift acquisirà la cronologia delle quotazioni popolata dalla funzione Lambda. I record in verde rappresentano i record più recenti per il preventivo.

Considerazioni e prossimi passi

L'utilizzo di hash sicuri impedisce la manomissione dei parametri del payload visibili nella finestra del browser quando viene richiamato l'URL di writeback. Per proteggere ulteriormente l'URL di writeback, è possibile utilizzare le seguenti tecniche:

  • Distribuisci l'API REST in un VPC privato accessibile solo agli utenti QuickSight.
  • Per prevenire attacchi di tipo replay, è possibile generare un timestamp insieme alla funzione di hashing e passarlo come parametro aggiuntivo nell'URL di write-back. La funzione Lambda di backend può quindi essere modificata per consentire solo i write-back entro una determinata soglia basata sul tempo.
  • Segui il gateway API controllo degli accessi ed problemi di migliori pratiche.
  • Ridurre la perdita dienergia con una potenziale Denial of Service per le API rivolte al pubblico.

È possibile migliorare ulteriormente questa soluzione per eseguire il rendering di un modulo basato sul Web quando viene aperto l'URL di write-back. Ciò potrebbe essere implementato generando dinamicamente un modulo HTML nella funzione Lambda di backend per supportare l'input di informazioni aggiuntive. Se il carico di lavoro richiede un numero elevato di write-back che richiedono throughput o concorrenza più elevati, un archivio dati appositamente creato come Edizione compatibile con Amazon Aurora PostgreSQL potrebbe essere una scelta migliore. Per ulteriori informazioni, fare riferimento a Richiamo di una funzione AWS Lambda da un cluster database Aurora PostgreSQL. Questi aggiornamenti possono quindi essere sincronizzati nelle tabelle Amazon Redshift utilizzando interrogazioni federate.

Conclusione

Questo post ha mostrato come utilizzare QuickSight insieme a Lambda, API Gateway, Secrets Manager e Amazon Redshift per acquisire i dati di input degli utenti e aggiornare in modo sicuro il tuo data warehouse Amazon Redshift senza uscire dall'ambiente BI QuickSight. Questa soluzione elimina la necessità di creare un'applicazione esterna o un'interfaccia utente per le operazioni di aggiornamento o inserimento del database e riduce i relativi costi di sviluppo e manutenzione. La chiamata API Gateway può anche essere protetta utilizzando una chiave o un token per garantire che solo le chiamate provenienti da QuickSight vengano accettate dall'API Gateway. Questo sarà trattato nei post successivi.


Informazioni sugli autori

Srikanth Baheti è uno Specialized World Wide Principal Solutions Architect per Amazon QuickSight. Ha iniziato la sua carriera come consulente e ha lavorato per diverse organizzazioni private e governative. Successivamente ha lavorato per PerkinElmer Health and Sciences & eResearch Technology Inc, dove era responsabile della progettazione e dello sviluppo di applicazioni Web ad alto traffico, pipeline di dati altamente scalabili e gestibili per piattaforme di reporting che utilizzano i servizi AWS e l'elaborazione serverless.

Raji Sivasubramaniam è Sr. Solutions Architect presso AWS, specializzato in Analytics. Raji è specializzato nell'architettura di soluzioni end-to-end per la gestione dei dati aziendali, la business intelligence e l'analisi per le aziende Fortune 500 e Fortune 100 in tutto il mondo. Ha un'esperienza approfondita nei dati e nell'analisi sanitaria integrati con un'ampia varietà di set di dati sanitari tra cui mercato gestito, targeting medico e analisi dei pazienti.

Timestamp:

Di più da Big Data di AWS