Scarica i dati da un cluster Amazon Redshift tra più account su Amazon S3 - Prontuario AWS

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Scarica i dati da un cluster Amazon Redshift tra più account su Amazon S3

Creato da Andrew Kamel () AWS

Archivio di codice: -s3-python aws-unload-redshift-to

Ambiente: produzione

Tecnologie: database; analisi; serverless

Carico di lavoro: open source

AWSservizi: AWS Lambda; Amazon Redshift; Amazon S3; Secrets Manager AWS

Riepilogo

Quando si testano le applicazioni, è utile disporre dei dati di produzione nell'ambiente di test. L'utilizzo dei dati di produzione può darvi una valutazione più accurata dell'applicazione che state sviluppando.

Questo modello estrae i dati da un cluster Amazon Redshift in un ambiente di produzione in un bucket Amazon Simple Storage Service (Amazon S3) in un ambiente di sviluppo su Amazon Web Services ().AWS

Il modello illustra la configurazione di entrambi PROD gli account, DEV tra cui:

  • Risorse obbligatorie

  • AWS Identity and Access Management (IAM) ruoli

  • Modifiche di rete a sottoreti, gruppi di sicurezza e cloud privato virtuale (VPC) per supportare la connessione Amazon Redshift

  • Una AWS Lambda funzione di esempio con un runtime Python per testare l'architettura

Per concedere l'accesso al cluster Amazon Redshift, il pattern utilizza il pattern AWS Secrets Manager per memorizzare le credenziali pertinenti. Il vantaggio è avere tutte le informazioni necessarie per connettersi direttamente al cluster Amazon Redshift senza dover sapere dove si trova il cluster Amazon Redshift. Inoltre, puoi monitorare l'uso del segreto.

Il segreto salvato in Secrets Manager include l'host del cluster Amazon Redshift, il nome del database, la porta e le credenziali pertinenti.

Per informazioni sulle considerazioni sulla sicurezza quando si utilizza questo modello, consulta la sezione Best practice.

Prerequisiti e limitazioni

Prerequisiti

Limitazioni

  • A seconda della quantità di dati da interrogare, la funzione Lambda potrebbe scadere.

    Se l'esecuzione richiede più tempo del timeout Lambda massimo (15 minuti), utilizza un approccio asincrono per il codice Lambda. L'esempio di codice per questo pattern utilizza la libreria psycopg2 per Python, che attualmente non supporta l'elaborazione asincrona.

  • Alcuni non sono disponibili in tutti. Servizi AWS Regioni AWS Per la disponibilità per regione, vedi Servizi AWS per regione. Per endpoint specifici, consulta la pagina Endpoint e quote del servizio e scegli il link relativo al servizio.

Architettura

Il diagramma seguente mostra l'architettura, la larghezza e gli account di destinazione. DEV PROD

Lambda VPC nell'DEVaccount e Amazon VPC Redshift nell'account. PROD

Il diagramma mostra il flusso di lavoro seguente:

  1. La funzione Lambda nell'DEVaccount assume il IAM ruolo richiesto per accedere alle credenziali di Amazon Redshift in Secrets Manager nell'account. PROD

    La funzione Lambda recupera quindi il segreto del cluster Amazon Redshift.

  2. La funzione Lambda nell'DEVaccount utilizza le informazioni per connettersi al cluster Amazon Redshift PROD nell'account tramite peering. VPCs

    La funzione Lambda invia quindi un comando unload per interrogare il cluster Amazon Redshift nell'account. PROD

  3. Il cluster Amazon Redshift nell'PRODaccount assume il IAM ruolo pertinente per accedere al bucket S3 nell'account. DEV

    Il cluster Amazon Redshift scarica i dati richiesti nel bucket S3 dell'account. DEV

Interrogazione di dati da Amazon Redshift

Il diagramma seguente mostra i ruoli utilizzati per recuperare le credenziali di Amazon Redshift e connettersi al cluster Amazon Redshift. Il flusso di lavoro viene avviato dalla funzione Lambda.

Il processo in tre fasi per l'assunzione di ruoli tra account.

Il diagramma mostra il flusso di lavoro seguente:

  1. I dati CrossAccount-SM-Read-Role presenti nell'DEVaccount presuppongono quelli SM-Read-Role presenti nell'account. PROD

  2. Il SM-Read-Role ruolo utilizza la policy allegata per recuperare il segreto da Secrets Manager.

  3. Le credenziali vengono utilizzate per accedere al cluster Amazon Redshift.

Caricamento di dati su Amazon S3

Il diagramma seguente mostra il processo di lettura-scrittura tra account per l'estrazione dei dati e il loro caricamento su Amazon S3. Il flusso di lavoro viene avviato dalla funzione Lambda. Il pattern concatena IAM i ruoli in Amazon Redshift. Il comando unload proveniente dal cluster Amazon Redshift presuppone, e CrossAccount-S3-Write-Role quindi assume. S3-Write-Role Questo concatenamento di ruoli consente ad Amazon Redshift di accedere ad Amazon S3.

I ruoli che ottengono le credenziali, accedono ad Amazon Redshift e caricano dati su Amazon S3.

Il flusso di lavoro include i seguenti passaggi:

  1. L'DEVaccesso CrossAccount-SM-Read-Role all'account presuppone l'immissione SM-Read-Role nell'PRODaccount.

  2. SM-Read-Rolerecupera le credenziali di Amazon Redshift da Secrets Manager.

  3. La funzione Lambda si connette al cluster Amazon Redshift e invia una query.

  4. Il cluster Amazon Redshift presuppone il. CrossAccount-S3-Write-Role

  5. CrossAccount-S3-Write-RoleSi presuppone che sia presente S3-Write-Role nell'account. DEV

  6. I risultati della query vengono scaricati nel bucket S3 dell'account. DEV

Strumenti

Servizi AWS

  • AWS Key Management Service (AWS KMS) ti aiuta a creare e controllare chiavi crittografiche per proteggere i tuoi dati.

  • AWS Lambda è un servizio di calcolo che consente di eseguire il codice senza gestire i server o effettuarne il provisioning. Esegue il codice solo quando necessario e si ridimensiona automaticamente, quindi paghi solo per il tempo di elaborazione che utilizzi.

  • Amazon Redshift è un servizio di data warehouse gestito su scala petabyte nel cloud. AWS

  • AWS Secrets Managerconsente di sostituire le credenziali codificate nel codice, comprese le password, con una chiamata a API Secrets Manager per recuperare il segreto a livello di codice.

  • Amazon Simple Storage Service (Amazon S3) è un servizio di archiviazione degli oggetti basato sul cloud che consente di archiviare, proteggere e recuperare qualsiasi quantità di dati.

Archivio di codici

Il codice per questo pattern è disponibile nel repository GitHub unload-redshift-to-s3-python.

Best practice

Dichiarazione di non responsabilità in materia di sicurezza

Prima di implementare questa soluzione, prendete in considerazione i seguenti importanti consigli di sicurezza:

  • Ricorda che collegare gli account di sviluppo e produzione può aumentare l'ambito e ridurre il livello di sicurezza complessivo. Consigliamo di implementare questa soluzione solo temporaneamente, estraendo la parte di dati richiesta e quindi distruggendo immediatamente le risorse distribuite. Per distruggere le risorse, è necessario eliminare la funzione Lambda, rimuovere tutti IAM i ruoli e le politiche creati per questa soluzione e revocare qualsiasi accesso alla rete concesso tra gli account.

  • Consultate i vostri team di sicurezza e conformità prima di copiare qualsiasi dato dagli ambienti di produzione a quelli di sviluppo. Le informazioni di identificazione personale (PII), le informazioni sanitarie protette (PHI) e altri dati riservati o regolamentati in genere non devono essere copiati in questo modo. Copia solo le informazioni non riservate disponibili al pubblico (ad esempio, dati di stock pubblici provenienti dall'interfaccia di un negozio). Prendi in considerazione la tokenizzazione o l'anonimizzazione dei dati o la generazione di dati di test sintetici, invece di utilizzare i dati di produzione quando possibile. Uno dei principi di AWS sicurezza è tenere le persone lontane dai dati. In altre parole, gli sviluppatori non devono eseguire operazioni nell'account di produzione.

  • Limita l'accesso alla funzione Lambda nell'account di sviluppo perché può leggere i dati dal cluster Amazon Redshift nell'ambiente di produzione.

  • Per evitare di interrompere l'ambiente di produzione, implementa i seguenti consigli:

    • Utilizzate un account di sviluppo separato e dedicato per le attività di test e sviluppo.

    • Implementa rigorosi controlli di accesso alla rete e limita il traffico tra gli account solo a quanto necessario.

    • Monitora e verifica l'accesso all'ambiente di produzione e alle fonti di dati.

    • Implementa controlli di accesso con privilegi minimi per tutte le risorse e i servizi coinvolti.

    • Rivedi e modifica regolarmente le credenziali, come AWS Secrets Manager quelle segrete e le chiavi di accesso ai ruoli. IAM

  • Fate riferimento alla seguente documentazione sulla sicurezza per i servizi utilizzati in questo articolo:

La sicurezza è una priorità assoluta quando si accede ai dati e alle risorse di produzione. Segui sempre le migliori pratiche, implementa controlli di accesso con privilegi minimi e rivedi e aggiorna regolarmente le tue misure di sicurezza.

Epiche

AttivitàDescrizioneCompetenze richieste

Crea un segreto per il cluster Amazon Redshift.

Per creare il segreto per il cluster Amazon Redshift, procedi come segue:

  1. Nell'PRODaccount, accedi a e apri AWS Management Console la console Secrets Manager all'indirizzo https://console.aws.amazon.com/secretsmanager/.

  2. Scegli Conserva un nuovo segreto.

  3. Seleziona Credenziali per il data warehouse Amazon Redshift.

  4. Per Nome utente e password, inserisci i valori per l'istanza e conferma o scegli un valore per la chiave di crittografia.

  5. Scegli il data warehouse di Amazon Redshift a cui accederà il tuo segreto.

  6. Inserisci Redshift-Creds-Secret il nome segreto.

  7. Completa i restanti passaggi di creazione con le scelte predefinite, quindi scegli Store.

  8. Visualizza il tuo segreto e annota il ARN valore Segreto che è stato generato per identificare il segreto.

DevOps ingegnere

Crea un ruolo per accedere a Secrets Manager.

Per creare il ruolo, procedi come segue:

  1. Nell'PRODaccount, apri la IAM console all'indirizzo https://console.aws.amazon.com/iam/.

  2. Seleziona Policy.

  3. Scegli Create Policy (Crea policy).

  4. Scegli la JSONscheda, quindi inserisci una IAM politica come la seguente:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetResourcePolicy", "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret", "secretsmanager:ListSecretVersionIds" ], "Resource": [ "<Redshift-Creds-Secret-ARN>" ] }, { "Effect": "Allow", "Action": "secretsmanager:ListSecrets", "Resource": "*" } ] }

    Sostituisci Redshift-Creds-Secret-ARN con l'Amazon Resource Name (ARN) del segreto di Secrets Manager che contiene le informazioni e le credenziali per il cluster Amazon Redshift.

DevOps ingegnere
AttivitàDescrizioneCompetenze richieste

Crea un ruolo per accedere al bucket S3.

Per creare il ruolo per l'accesso al bucket S3, procedi come segue:

  1. Nell'DEVaccount, apri la IAM console.

  2.  Seleziona Policy.

  3. Scegli Create Policy (Crea policy).

  4.  Scegli la JSONscheda, quindi inserisci una IAM politica come la seguente:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "kmsstmt", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:GenerateDataKey" ], "Resource": [ "<kms-key-arn>" ] }, { "Sid": "s3stmt", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::mybucket", "arn:aws:s3:::mybucket/*" ] } ] }

    Sostituisci mybucket con il nome del bucket S3 a cui desideri accedere. Inoltre, se il bucket S3 è crittografato, sostituiscilo kms-key-arn con la ARN chiave AWS Key Management Service (AWS KMS) utilizzata per crittografare il bucket S3. Altrimenti, non è necessaria la sezione della AWS KMS policy.

  5. Scegli Rivedi politica, inserisci S3-Write-Policy come nome della politica, quindi scegli Crea politica.

  6. Nel pannello di navigazione, seleziona Roles (Ruoli).

  7.  Selezionare Create role (Crea ruolo).

  8. Per il ruolo di entità attendibile, scegli Politica di fiducia personalizzata.

  9. Scegli Avanti: Autorizzazioni, quindi seleziona la politica S3-Write-Policy che hai creato.

  10. Immettete S3-Write-Role come nome del ruolo, quindi scegliete Crea ruolo.

DevOps ingegnere

Crea il ruolo Amazon Redshift.

Per creare il ruolo Amazon Redshift, procedi come segue:

  1. Nell'PRODaccount, apri la IAM console.

  2. Seleziona Policy.

  3. Scegli Create Policy (Crea policy).

  4. Scegli la JSONscheda, quindi inserisci una IAM politica come la seguente:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountPolicy", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "S3-Write-Role-ARN" } ] }

    S3-Write-Role-ARNSostituiscilo con il ARN simbolo «for the» presente S3-Write-Role nell'DEVaccount.

  5. Scegli Rivedi politica, inserisci S3-Write-Role-Assume-Policy come nome della politica, quindi scegli Crea politica.

  6. Nel riquadro di navigazione, scegli Ruoli e quindi Crea ruolo.

  7. Scegli il AWSservizio come tipo di entità affidabile, quindi scegli Redshift, Redshift - Personalizzabile.

  8. Scegli Avanti: Autorizzazioni, quindi seleziona la politica S3-Write-Role-Assume-Policy che hai creato.

  9. Immettete CrossAccount-S3-Write-Role come nome del ruolo, quindi scegliete Crea ruolo.

  10. Associa il IAM ruolo al tuo cluster Amazon Redshift.

DevOps ingegnere
AttivitàDescrizioneCompetenze richieste

Distribuire la funzione Lambda.

Per distribuire una funzione Lambda nel VPC peered, procedi come segue:

  1. Apri la console Lambda all'indirizzo. https://console.aws.amazon.com/lambda/

  2. Scegli Funzioni.

  3. Scegli Crea funzione.

  4. In Informazioni di base, immettere un nome per la funzione in Nome funzione.

  5. Per Runtime, scegli Python 3.8.

  6. Espandi Cambia il ruolo di esecuzione predefinito, quindi procedi come segue:

    1. Scegli Usa un ruolo esistente.

    2. Per Ruolo esistente, seleziona il ruolo Lambda CrossAccount-RM-Read-Role creato in precedenza.

  7. Espandi Impostazioni avanzate ed esegui le seguenti operazioni:

    1. Seleziona la casella di VPC controllo Abilita.

    2. Per VPC, seleziona il peered VPC nell'DEVaccount.

    3. Per Sottoreti, seleziona la sottorete privata.

    4. In Security groups (Gruppi di sicurezza), selezionare il gruppo di sicurezza predefinito.

  8. Scegli Crea funzione.

  9. Aggiungi la libreria psycopg2 come livello alla funzione Lambda.

    Nota: è possibile utilizzare un layer già distribuito dal repository psycopg2-lambda-layer. Assicurati di usare il runtime URL basato sul tuo Regione AWS e su Python.

DevOps ingegnere
AttivitàDescrizioneCompetenze richieste

Importa le risorse richieste.

Per importare le risorse richieste, esegui i seguenti comandi:

import ast import boto3 import psycopg2 import base64 from botocore.exceptions import ClientError
Sviluppatore di app

Esegui la funzione di gestione Lambda.

La funzione Lambda utilizza AWS Security Token Service (AWS STS) per l'accesso tra account e la gestione temporanea delle credenziali. La funzione utilizza l' AssumeRole APIoperazione per assumere temporaneamente le autorizzazioni del ruolo. sm_read_role IAM

Per eseguire la funzione Lambda, usa il seguente codice di esempio:

def lambda_handler(event, context): sts_client = boto3.client('sts') # Secrets Manager Configurations secret_name = "redshift_creds" sm_region = "eu-west-1" sm_read_role = "arn:aws:iam::PROD_ACCOUNT_NUMBER:role/SM-Read-Role" # S3 Bucket Configurations s3_bucket_path = "s3://mybucket/" s3_bucket_region = "eu-west-1" s3_write_role = "arn:aws:iam::DEV_ACCOUNT_NUMBER:role/S3-Write-Role" # Redshift Configurations sql_query = "select * from category" redshift_db = "dev" redshift_s3_write_role = "arn:aws:iam::PROD_ACCOUNT_NUMBER:role/CrossAccount-S3-Write-Role" chained_s3_write_role = "%s,%s" % (redshift_s3_write_role, s3_write_role) assumed_role_object = sts_client.assume_role( RoleArn=sm_read_role, RoleSessionName="CrossAccountRoleAssumption", ExternalId="YOUR_EXTERNAL_ID", ) credentials = assumed_role_object['Credentials'] secret_dict = ast.literal_eval(get_secret(credentials, secret_name, sm_region)) execute_query(secret_dict, sql_query, s3_bucket_path, chained_s3_write_role, s3_bucket_region, redshift_db) return { 'statusCode': 200 }
Sviluppatore di app

Scoprite il segreto.

Per ottenere il segreto di Amazon Redshift, usa il seguente codice di esempio:

def get_secret(credentials, secret_name, sm_region): # Create a Secrets Manager client session = boto3.session.Session() sm_client = session.client( service_name='secretsmanager', aws_access_key_id=credentials['AccessKeyId'], aws_secret_access_key=credentials['SecretAccessKey'], aws_session_token=credentials['SessionToken'], region_name=sm_region ) try: get_secret_value_response = sm_client.get_secret_value( SecretId=secret_name ) except ClientError as e: print(e) raise e else: if 'SecretString' in get_secret_value_response: return get_secret_value_response['SecretString'] else: return base64.b64decode(get_secret_value_response['SecretBinary'])
Sviluppatore di app

Esegui il comando unload.

Per scaricare i dati nel bucket S3, usa il seguente codice di esempio.

def execute_query(secret_dict, sql_query, s3_bucket_path, chained_s3_write_role, s3_bucket_region, redshift_db): conn_string = "dbname='%s' port='%s' user='%s' password='%s' host='%s'" \ % (redshift_db, secret_dict["port"], secret_dict["username"], secret_dict["password"], secret_dict["host"]) con = psycopg2.connect(conn_string) unload_command = "UNLOAD ('{}') TO '{}' IAM_ROLE '{}' DELIMITER '|' REGION '{}';" \ .format(sql_query, s3_bucket_path + str(datetime.datetime.now()) + ".csv", chained_s3_write_role, s3_bucket_region) # Opening a cursor and run query cur = con.cursor() cur.execute(unload_command) print(cur.fetchone()) cur.close() con.close()
Sviluppatore di app
AttivitàDescrizioneCompetenze richieste

Elimina la funzione Lambda.

Per evitare di incorrere in costi non pianificati, rimuovi le risorse e la connessione tra gli DEV account e. PROD

Per rimuovere la funzione Lambda, procedi come segue:

  1. Apri la AWS Lambda console all'indirizzo https://console.aws.amazon.com/lambda/.

  2. Individua e seleziona la funzione Lambda che hai creato.

  3. Scegli Azioni, quindi Elimina.

  4. Conferma l'eliminazione.

DevOps ingegnere

Rimuovi i IAM ruoli e le politiche.

Rimuovi i IAM ruoli e le politiche dagli PROD account DEV e.

Nell'DEVaccount, procedi come segue:

  1. Apri la IAM console.

  2. Eliminare i seguenti ruoli:

    • S3-Write-Role

    • CrossAccount-RM-Read-Role(ruolo Lambda)

  3. Eliminare le politiche associate:

    • S3-Write-Policy

    • La CrossAccount politica per l'assunzione dei ruoli degli PROD account

Nell'PRODaccount, procedi come segue:

  1. Apri la IAM console.

  2. Eliminare i seguenti ruoli:

    • SM-Read-Role

    • CrossAccount-S3-Write-Role

  3. Eliminare le politiche associate:

    • La CrossAccount politica di accesso a Secrets Manager

    • S3-Write-Role-Assume-Policy

DevOps ingegnere

Eliminare il segreto in Secrets Manager.

Per eliminare il segreto, procedi come segue:

  1. Nell'PRODaccount, apri la console Secrets Manager.

  2. Individua e seleziona il segreto denominatoRedshift-Creds-Secret.

  3. Scegli Actions (Operazioni) e Delete secret (Elimina segreto).

  4. Conferma l'eliminazione.

DevOps ingegnere

Rimuovi le regole VPC del peering e dei gruppi di sicurezza.

Per rimuovere le regole del VPC peering e dei gruppi di sicurezza, procedi come segue:

  1. Nell'PRODaccount, apri la EC2 console Amazon all'indirizzo https://console.aws.amazon.com/ec2/.

  2. Vai a Gruppi di sicurezza.

  3. Trova il gruppo di sicurezza utilizzato dal cluster Amazon Redshift.

  4. Modifica le regole in entrata e rimuovi la regola che consente le connessioni dalla Lambda VPC dell'DEVaccount.

  5. Passa a VPCPeering Connections ed elimina la connessione peering.

DevOps ingegnere

Rimuovi i dati dal bucket S3.

Per rimuovere i dati da Amazon S3, procedi come segue:

  1. Nell'DEVaccount, apri la console Amazon S3 all'indirizzo. https://console.aws.amazon.com/s3/

  2. Individua il bucket che hai usato per l'archiviazione dei dati.

  3. Elimina gli oggetti all'interno del bucket o elimina l'intero bucket se non è più necessario.

DevOps ingegnere

Pulisci AWS KMS le chiavi.

Se hai creato delle AWS KMS chiavi personalizzate per la crittografia, procedi come segue:

  1. Apri la AWS KMS console all'indirizzo https://console.aws.amazon.com/kms/.

  2. Individua tutte le chiavi create per questo modello.

  3. Pianifica la cancellazione delle chiavi. (Esiste un periodo di attesa obbligatorio per l'eliminazione delle chiavi).

DevOps ingegnere

Controlla ed elimina i CloudWatch log di Amazon.

Per eliminare i CloudWatch log, procedi come segue:

  1. Apri la CloudWatch console all'indirizzo https://console.aws.amazon.com/cloudwatch/.

  2. Verifica la presenza di eventuali gruppi di log creati dalla funzione Lambda o dal cluster Amazon Redshift.

  3. Elimina questi gruppi di log se non sono più necessari.

DevOps ingegnere

Risorse correlate

Informazioni aggiuntive

Dopo aver scaricato i dati da Amazon Redshift ad Amazon S3, puoi analizzarli utilizzando Amazon Athena.

Amazon Athena è un servizio di interrogazione per Big Data utile quando è necessario accedere a grandi volumi di dati. È possibile utilizzare Athena senza dover effettuare il provisioning di server o database. Athena supporta interrogazioni complesse ed è possibile eseguirla su oggetti diversi.

Come per la maggior parte Servizi AWS, il vantaggio principale dell'utilizzo di Athena è che offre una grande flessibilità nel modo in cui vengono eseguite le query senza complessità aggiuntiva. Quando usi Athena, puoi eseguire query su diversi tipi di dati, ad esempio CSV eJSON, in Amazon S3 senza modificare il tipo di dati. Puoi interrogare i dati da varie fonti, anche esterne. AWS Athena riduce la complessità perché non è necessario gestire i server. Athena legge i dati direttamente da Amazon S3 senza caricarli o modificarli prima di eseguire la query.