Archivia automaticamente gli elementi su Amazon S3 utilizzando DynamoDB TTL - 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à.

Archivia automaticamente gli elementi su Amazon S3 utilizzando DynamoDB TTL

Creato da Tabby Ward (AWS)

Repository di codice: archivia gli elementi su S3 utilizzando DynamoDB TLL

Ambiente: PoC o pilota

Tecnologie: modernizzazione; database; serverless; storage e backup; gestione dei costi

Carico di lavoro: open source

Servizi AWS: Amazon S3; Amazon DynamoDB; Amazon Kinesis; AWS Lambda

Riepilogo

Questo modello fornisce i passaggi per rimuovere i dati più vecchi da una tabella Amazon DynamoDB e archiviarli in un bucket Amazon Simple Storage Service (Amazon S3) su Amazon Web Services (AWS) senza dover gestire una flotta di server. 

Questo modello utilizza Amazon DynamoDB Time to Live (TTL) per eliminare automaticamente i vecchi elementi e Amazon DynamoDB Streams per acquisire gli elementi TTL scaduti. Quindi collega DynamoDB Streams ad AWS Lambda, che esegue il codice senza effettuare il provisioning o gestire alcun server. 

Quando vengono aggiunti nuovi elementi al flusso DynamoDB, viene avviata la funzione Lambda e scrive i dati in un flusso di distribuzione Amazon Data Firehose. Firehose offre una soluzione semplice e completamente gestita per caricare i dati come archivio in Amazon S3.

DynamoDB viene spesso utilizzato per archiviare dati di serie temporali, come dati click-stream di pagine Web o dati Internet of Things (IoT) provenienti da sensori e dispositivi connessi. Invece di eliminare gli elementi a cui si accede meno frequentemente, molti clienti desiderano archiviarli per scopi di controllo. TTL semplifica questa archiviazione eliminando automaticamente gli elementi in base all'attributo timestamp. 

Gli elementi eliminati tramite TTL possono essere identificati in DynamoDB Streams, che acquisisce una sequenza di modifiche a livello di elemento ordinata nel tempo e archivia la sequenza in un registro per un massimo di 24 ore. Questi dati possono essere utilizzati da una funzione Lambda e archiviati in un bucket Amazon S3 per ridurre i costi di storage. Per ridurre ulteriormente i costi, è possibile creare regole del ciclo di vita di Amazon S3 per trasferire automaticamente i dati (non appena vengono creati) a classi di storage a basso costo, come S3 Glacier Instant Retrieval o S3 Glacier Flexible Retrieval o Amazon S3 Glacier Deep Archive per lo storage a lungo termine.

Prerequisiti e limitazioni

Prerequisiti

  • Un account AWS attivo.

  • AWS Command Line Interface (AWS CLI) 1.7 o versione successiva, installata e configurata su macOS, Linux o Windows.

  • Python 3.7 o successivo.

  • Boto3, installato e configurato. Se Boto3 non è già installato, esegui il python -m pip install boto3 comando per installarlo.

Architettura

Stack tecnologico

  • Amazon DynamoDB

  • Amazon DynamoDB Streams

  • Amazon Data Firehose

  • AWS Lambda

  • Amazon S3

  1. Gli elementi vengono eliminati tramite TTL.

  2. Il trigger di flusso DynamoDB richiama la funzione del processore di flusso Lambda.

  3. La funzione Lambda inserisce i record nel flusso di distribuzione di Firehose in formato batch.

  4. I record di dati vengono archiviati nel bucket S3.

Strumenti

  • AWS CLI — L'AWS Command Line Interface (AWS CLI) è uno strumento unificato per gestire i servizi AWS.

  • Amazon DynamoDB: Amazon DynamoDB è un database di chiave-valore e documenti che offre prestazioni a una cifra in millisecondi su qualsiasi scala.

  • Amazon DynamoDB Time to Live (TTL): Amazon DynamoDB TTL ti aiuta a definire un timestamp per articolo per determinare quando un articolo non è più necessario.

  • Amazon DynamoDB Streams — Amazon DynamoDB Streams acquisisce una sequenza ordinata nel tempo di modifiche a livello di elemento in qualsiasi tabella DynamoDB e archivia queste informazioni in un registro per un massimo di 24 ore.

  • Amazon Data Firehose — Amazon Data Firehose è il modo più semplice per caricare in modo affidabile lo streaming di dati in data lake, data store e servizi di analisi.

  • AWS Lambda: AWS Lambda esegue codice senza la necessità di fornire o gestire server. I costi saranno calcolati in base al tempo di elaborazione effettivo.

  • Amazon S3 — Amazon Simple Storage Service (Amazon S3) è un servizio di storage di oggetti che offre scalabilità, disponibilità dei dati, sicurezza e prestazioni leader del settore.

Codice

Il codice per questo modello è disponibile nel repository GitHub Archive items to S3 using DynamoDB TTL.

Epiche

AttivitàDescrizioneCompetenze richieste

Creazione di una tabella DynamoDB

Utilizza l'AWS CLI per creare una tabella in DynamoDB chiamata. Reservation Scegli l'unità di capacità di lettura casuale (RCU) e l'unità di capacità di scrittura (WCU) e assegna alla tabella due attributi: e. ReservationID ReservationDate 

aws dynamodb create-table \ --table-name Reservation \ --attribute-definitions AttributeName=ReservationID,AttributeType=S AttributeName=ReservationDate,AttributeType=N \ --key-schema AttributeName=ReservationID,KeyType=HASH AttributeName=ReservationDate,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=100,WriteCapacityUnits=100

ReservationDateè un timestamp epocale che verrà utilizzato per attivare il TTL.

Architetto del cloud, sviluppatore di app

Attiva DynamoDB TTL.

Utilizza l'AWS CLI per attivare DynamoDB TTL per l'attributo. ReservationDate

aws dynamodb update-time-to-live \ --table-name Reservation\ --time-to-live-specification Enabled=true,AttributeName=ReservationDate
Architetto del cloud, sviluppatore di app

Attiva uno stream DynamoDB.

Utilizza l'AWS CLI per attivare un flusso DynamoDB per la Reservation tabella utilizzando il tipo di flusso. NEW_AND_OLD_IMAGES 

aws dynamodb update-table \ --table-name Reservation \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES

Questo flusso conterrà i record relativi a nuovi elementi, elementi aggiornati, elementi eliminati e elementi eliminati tramite TTL. I record relativi agli elementi eliminati tramite TTL contengono un attributo di metadati aggiuntivo per distinguerli dagli elementi eliminati manualmente. Il userIdentity campo per le eliminazioni TTL indica che il servizio DynamoDB ha eseguito l'azione di eliminazione. 

In questo modello, vengono archiviati solo gli elementi eliminati da TTL, ma è possibile archiviare solo i record in cui eventName è e contiene valori uguali a. REMOVE userIdentity principalId dynamodb.amazonaws.com

Architetto del cloud, sviluppatore di app
AttivitàDescrizioneCompetenze richieste

Crea un bucket S3.

Utilizza l'AWS CLI per creare un bucket S3 di destinazione nella tua regione AWS, sostituendolo us-east-1 con la tua regione. 

aws s3api create-bucket \ --bucket reservationfirehosedestinationbucket \ --region us-east-1

Assicurati che il nome del bucket S3 sia univoco a livello globale, poiché lo spazio dei nomi è condiviso da tutti gli account AWS.

Architetto del cloud, sviluppatore di app

Crea una politica del ciclo di vita di 30 giorni per il bucket S3.

  1. Accedi alla Console di gestione AWS e apri la console Amazon S3. 

  2. Scegliete il bucket S3 che contiene i dati di Firehose. 

  3. Nel bucket S3, scegli la scheda Gestione e scegli Aggiungi regola del ciclo di vita. 

  4. Inserisci un nome per la regola nella finestra di dialogo delle regole del ciclo di vita e configura una regola del ciclo di vita di 30 giorni per il tuo bucket.

Architetto del cloud, sviluppatore di app
AttivitàDescrizioneCompetenze richieste

Crea e configura un flusso di distribuzione Firehose.

Scarica e modifica l'esempio di CreateFireHoseToS3.py codice dal GitHub repository. 

Questo codice è scritto in Python e mostra come creare un flusso di distribuzione Firehose e un ruolo AWS Identity and Access Management (IAM). Il ruolo IAM avrà una policy che può essere utilizzata da Firehose per scrivere nel bucket S3 di destinazione.

Per eseguire lo script, utilizzate i seguenti argomenti di comando e riga di comando.

Argomento 1=<Your_S3_bucket_ARN>, che è l'Amazon Resource Name (ARN) per il bucket creato in precedenza

Argomento 2= Il nome del tuo Firehose (questo pilota lo sta firehose_to_s3_stream usando).

Argomento 3= Il nome del ruolo IAM (questo programma pilota lo utilizza). firehose_to_s3

python CreateFireHoseToS3.py <Your_S3_Bucket_ARN> firehose_to_s3_stream firehose_to_s3

Se il ruolo IAM specificato non esiste, lo script creerà un ruolo di assunzione con una politica di relazione affidabile, nonché una politica che concede autorizzazioni Amazon S3 sufficienti. Per esempi di queste politiche, consulta la sezione Informazioni aggiuntive.

Architetto del cloud, sviluppatore di app

Verifica lo stream di distribuzione di Firehose.

Descrivi il flusso di distribuzione di Firehose utilizzando la CLI di AWS per verificare che il flusso di distribuzione sia stato creato correttamente.

aws firehose describe-delivery-stream --delivery-stream-name firehose_to_s3_stream
Architetto del cloud, sviluppatore di app
AttivitàDescrizioneCompetenze richieste

Crea una politica di fiducia per la funzione Lambda.

Crea un file di criteri di fiducia con le seguenti informazioni.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

Ciò consente alla funzione di accedere alle risorse AWS.

Architetto del cloud, sviluppatore di app

Crea un ruolo di esecuzione per la funzione Lambda.

Per creare il ruolo di esecuzione, esegui il codice seguente.

aws iam create-role --role-name lambda-ex --assume-role-policy-document file://TrustPolicy.json
Architetto del cloud, sviluppatore di app

Aggiungi l'autorizzazione al ruolo.

Per aggiungere l'autorizzazione al ruolo, usa il attach-policy-to-role comando.

aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/AmazonKinesisFirehoseFullAccess aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/IAMFullAccess
Architetto cloud, sviluppatore di app

Creazione di una funzione Lambda.

Comprimi il LambdaStreamProcessor.py file dal repository di codice eseguendo il seguente comando.

zip function.zip LambdaStreamProcessor.py

Quando crei la funzione Lambda, avrai bisogno del ruolo di esecuzione Lambda ARN. Per ottenere l'ARN, esegui il codice seguente.

aws iam get-role \ --role-name lambda-ex

Per creare la funzione Lambda, esegui il codice seguente.

aws lambda create-function --function-name LambdaStreamProcessor \ --zip-file fileb://function.zip --handler LambdaStreamProcessor.handler --runtime python3.8 \ --role {Your Lamda Execution Role ARN}\ --environment Variables="{firehose_name=firehose_to_s3_stream,bucket_arn = arn:aws:s3:::reservationfirehosedestinationbucket,iam_role_name = firehose_to_s3, batch_size=400}"
Architetto del cloud, sviluppatore di app

Configura il trigger della funzione Lambda.

Utilizza l'AWS CLI per configurare il trigger (DynamoDB Streams), che richiama la funzione Lambda. La dimensione del batch di 400 serve per evitare problemi di concorrenza Lambda.

aws lambda create-event-source-mapping --function-name LambdaStreamProcessor \ --batch-size 400 --starting-position LATEST \ --event-source-arn <Your Latest Stream ARN From DynamoDB Console>
Architetto del cloud, sviluppatore di app
AttivitàDescrizioneCompetenze richieste

Aggiungi articoli con timestamp scaduti alla tabella delle prenotazioni.

Per testare la funzionalità, aggiungi alla tabella elementi con timestamp d'epoca scaduti. Reservation TTL eliminerà automaticamente gli elementi in base al timestamp. 

La funzione Lambda viene avviata sulle attività di DynamoDB Stream e filtra l'evento per identificare l'attività o gli elementi eliminati. REMOVE Quindi inserisce i record nel flusso di distribuzione di Firehose in formato batch.

Il flusso di distribuzione Firehose trasferisce gli articoli a un bucket S3 di destinazione con il prefisso. firehosetos3example/year=current year/month=current month/ day=current day/hour=current hour/

Importante: per ottimizzare il recupero dei dati, configura Amazon S3 con Prefix ErrorOutputPrefix le informazioni dettagliate nella sezione Informazioni aggiuntive.

Architetto del cloud
AttivitàDescrizioneCompetenze richieste

Eliminare tutte le risorse.

Elimina tutte le risorse per assicurarti che non ti vengano addebitati costi per i servizi che non utilizzi.  

Architetto del cloud, sviluppatore di app

Risorse correlate

Informazioni aggiuntive

Creare e configurare un flusso di distribuzione Firehose — Esempi di policy

Documento di esempio sulla politica delle relazioni di fiducia di Firehose

firehose_assume_role = { 'Version': '2012-10-17', 'Statement': [ { 'Sid': '', 'Effect': 'Allow', 'Principal': { 'Service': 'firehose.amazonaws.com' }, 'Action': 'sts:AssumeRole' } ] }

Esempio di politica di autorizzazione S3

s3_access = { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject" ], "Resource": [ "{your s3_bucket ARN}/*", "{Your s3 bucket ARN}" ] } ] }

Verifica la funzionalità: configurazione Amazon S3

La configurazione Amazon S3 con la seguente Prefix e ErrorOutputPrefix viene scelta per ottimizzare il recupero dei dati. 

prefisso

firehosetos3example/year=! {timestamp: yyyy}/month=! {timestamp:MM}/day=! {timestamp:dd}/hour=!{timestamp:HH}/

Firehose crea innanzitutto una cartella di base chiamata firehosetos3example direttamente sotto il bucket S3. Quindi valuta le espressioni!{timestamp:yyyy},, e l'anno !{timestamp:MM}!{timestamp:dd}, il mese, !{timestamp:HH} il giorno e l'ora utilizzando il formato Java. DateTimeFormatter

Ad esempio, un timestamp di arrivo approssimativo di 1604683577 in Unix epoch Time restituisce,, e. year=2020 month=11 day=06 hour=05 Pertanto, viene valutata la posizione in Amazon S3, in cui vengono distribuiti i record di dati. firehosetos3example/year=2020/month=11/day=06/hour=05/

ErrorOutputPrefix

firehosetos3erroroutputbase/!{firehose:random-string}/!{firehose:error-output-type}/!{timestamp:yyyy/MM/dd}/

I ErrorOutputPrefix risultati sono in una cartella di base richiamata firehosetos3erroroutputbase direttamente sotto il bucket S3. L'espressione !{firehose:random-string} restituisce una stringa casuale di 11 caratteri come. ztWxkdg3Thg Potrebbe essere valutata la posizione di un oggetto Amazon S3 in cui vengono consegnati i record non riusciti. firehosetos3erroroutputbase/ztWxkdg3Thg/processing-failed/2020/11/06/