

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
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl"></a>

*Tabby Ward, Amazon Web Services*

## Riepilogo
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-summary"></a>

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](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html) per trasferire automaticamente i dati (non appena vengono creati) alle classi di storage a basso costo.](https://aws.amazon.com/s3/storage-classes/)

## Prerequisiti e limitazioni
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-prereqs"></a>

**Prerequisiti**
+ Un account AWS attivo.
+ [AWS Command Line Interface (AWS CLI) 1.7 o](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html) versione successiva, installata e configurata su macOS, Linux o Windows.
+ [Python 3.7](https://www.python.org/downloads/release/python-370/) o successivo.
+ [Boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html), installato e configurato. Se Boto3 non è già installato, esegui il `python -m pip install boto3` comando per installarlo.

## Architecture
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-architecture"></a>

**Stack tecnologico**
+ Amazon DynamoDB
+ Amazon DynamoDB Streams
+ Amazon Data Firehose
+ AWS Lambda
+ Simple Storage Service (Amazon S3)

![Processo in quattro fasi da DynamoDB al bucket S3.](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/images/pattern-img/9dbc833f-cf3c-4574-8f09-d0b81134fe41/images/50d9da65-5398-4a99-bc8f-58afc80e9d7b.png)


1. Gli elementi vengono eliminati tramite TTL.

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

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

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

## Tools (Strumenti)
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-tools"></a>
+ [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html): l'AWS Command Line Interface (AWS CLI) è uno strumento unificato per gestire i servizi AWS.
+ [Amazon DynamoDB: Amazon](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 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](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html) ti aiuta a definire un timestamp per articolo per determinare quando un articolo non è più necessario.
+ [Amazon DynamoDB Streams — Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Types_Amazon_DynamoDB_Streams.html) 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](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html) — 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](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html): AWS Lambda esegue codice senza la necessità di effettuare il provisioning o gestire server. I costi saranno calcolati in base al tempo di elaborazione effettivo.
+ [Amazon S3 — Amazon Simple](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html) 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](https://github.com/aws-samples/automatically-archive-items-to-s3-using-dynamodb-ttl).

## Epiche
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-epics"></a>

### Configurare una tabella DynamoDB, TTL e un flusso DynamoDB
<a name="set-up-a-dynamodb-table-ttl-and-a-dynamodb-stream"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea 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` <pre>aws dynamodb create-table \<br />--table-name Reservation \<br />--attribute-definitions AttributeName=ReservationID,AttributeType=S AttributeName=ReservationDate,AttributeType=N \<br />--key-schema AttributeName=ReservationID,KeyType=HASH AttributeName=ReservationDate,KeyType=RANGE \<br />--provisioned-throughput ReadCapacityUnits=100,WriteCapacityUnits=100 </pre><br />`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`<pre>aws dynamodb update-time-to-live \<br />--table-name Reservation\<br />  --time-to-live-specification Enabled=true,AttributeName=ReservationDate</pre> | 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` <pre>aws dynamodb update-table \<br />--table-name Reservation \<br />  --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES</pre><br />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. <br />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 | 

### Crea e configura un bucket S3
<a name="create-and-configure-an-s3-bucket"></a>


| Operazione | Description | Competenze 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 e amzn-s3- con il nome del tuo bucket. demo-destination-bucket  <pre>aws s3api create-bucket \<br />--bucket amzn-s3-demo-destination-bucket \<br />--region us-east-1</pre><br />Assicurati che il nome del tuo bucket S3 sia unico 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. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/automatically-archive-items-to-amazon-s3-using-dynamodb-ttl.html) | Architetto del cloud, sviluppatore di app | 

### Creare un flusso di distribuzione Firehose
<a name="create-a-akf-delivery-stream"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea e configura un flusso di distribuzione Firehose. | Scarica e modifica l'esempio di `CreateFireHoseToS3.py` codice dal GitHub repository. <br />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.<br />Per eseguire lo script, utilizzate i seguenti argomenti di comando e riga di comando.<br />Argomento 1=`<Your_S3_bucket_ARN>`, che è l'Amazon Resource Name (ARN) per il bucket creato in precedenza<br />Argomento 2= Il nome del tuo Firehose (questo pilota lo sta `firehose_to_s3_stream` usando).<br />Argomento 3= Il nome del ruolo IAM (questo programma pilota lo utilizza). `firehose_to_s3`<pre>python CreateFireHoseToS3.py <Your_S3_Bucket_ARN> firehose_to_s3_stream firehose_to_s3</pre><br />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.<pre>aws firehose describe-delivery-stream --delivery-stream-name firehose_to_s3_stream </pre> | Architetto del cloud, sviluppatore di app | 

### Creare una funzione Lambda per elaborare il flusso di distribuzione di Firehose
<a name="create-a-lambda-function-to-process-the-akf-delivery-stream"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea una politica di fiducia per la funzione Lambda. | Crea un file di criteri di fiducia con le seguenti informazioni.<pre> {<br />     "Version": "2012-10-17",		 	 	 <br />     "Statement": [<br />      {<br />          "Effect": "Allow",<br />          "Principal": {<br />              "Service": "lambda.amazonaws.com"<br />           },<br />           "Action": "sts:AssumeRole"<br />      }<br />    ]<br />  } </pre><br />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.<pre>aws iam create-role --role-name lambda-ex --assume-role-policy-document file://TrustPolicy.json</pre> | Architetto del cloud, sviluppatore di app | 
| Aggiungi l'autorizzazione al ruolo. | Per aggiungere l'autorizzazione al ruolo, usa il `attach-policy-to-role` comando.<pre>aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole<br />aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole<br />aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/AmazonKinesisFirehoseFullAccess<br />aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/IAMFullAccess </pre> | Architetto del cloud, sviluppatore di app | 
| Creazione di una funzione Lambda. | Comprimi il `LambdaStreamProcessor.py` file dal repository di codice eseguendo il seguente comando.<pre>zip function.zip LambdaStreamProcessor.py</pre><br />Quando crei la funzione Lambda, avrai bisogno del ruolo di esecuzione Lambda ARN. Per ottenere l'ARN, esegui il codice seguente.<pre>aws iam get-role \<br />--role-name lambda-ex </pre><br />Per creare la funzione Lambda, esegui il codice seguente.<pre># Review the environment variables and replace them with your values.<br /><br />aws lambda create-function --function-name LambdaStreamProcessor \<br />--zip-file fileb://function.zip --handler LambdaStreamProcessor.handler --runtime python3.8 \<br />--role {Your Lamda Execution Role ARN}\<br />  --environment Variables="{firehose_name=firehose_to_s3_stream,bucket_arn = <Your_S3_bucket_ARN>,iam_role_name = firehose_to_s3, batch_size=400}"</pre> | 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 di incorrere in problemi di concorrenza Lambda.<pre>aws lambda create-event-source-mapping --function-name LambdaStreamProcessor \<br />--batch-size 400 --starting-position LATEST \<br />--event-source-arn <Your Latest Stream ARN From DynamoDB Console></pre> | Architetto del cloud, sviluppatore di app | 

### Prova la funzionalità
<a name="test-the-functionality"></a>


| Operazione | Description | Competenze 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. <br />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.<br />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/`Per ottimizzare il recupero dei dati, configura Amazon S3 con `Prefix` `ErrorOutputPrefix` le informazioni dettagliate *nella* sezione Informazioni aggiuntive. | Architetto del cloud  | 

### Pulisci le risorse
<a name="clean-up-the-resources"></a>


| Operazione | Description | Competenze 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
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-resources"></a>
+ [Gestione del ciclo di vita dello storage](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html)
+ [Classi di storage Amazon S3](https://aws.amazon.com/s3/storage-classes/)
+ [Documentazione dell'SDK AWS per Python (Boto3)](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)

## Informazioni aggiuntive
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-additional"></a>

**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 e l'anno `!{timestamp:yyyy}``!{timestamp:MM}`, il mese`!{timestamp:dd}`, `!{timestamp:HH}` il giorno e l'ora utilizzando il formato Java. [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)

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/`