

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Archivez automatiquement les éléments sur Amazon S3 à l'aide de DynamoDB TTL
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl"></a>

*Tabby Ward, Amazon Web Services*

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

Ce modèle fournit des étapes pour supprimer les anciennes données d'une table Amazon DynamoDB et les archiver dans un bucket Amazon Simple Storage Service (Amazon S3) sur Amazon Web Services (AWS) sans avoir à gérer un parc de serveurs. 

Ce modèle utilise Amazon DynamoDB Time to Live (TTL) pour supprimer automatiquement les anciens éléments et Amazon DynamoDB Streams pour capturer les articles dont le TTL a expiré. Il connecte ensuite DynamoDB Streams à AWS Lambda, qui exécute le code sans provisionner ni gérer de serveurs. 

Lorsque de nouveaux éléments sont ajoutés au flux DynamoDB, la fonction Lambda est lancée et écrit les données dans un flux de diffusion Amazon Data Firehose. Firehose fournit une solution simple et entièrement gérée pour charger les données sous forme d'archive dans Amazon S3.

DynamoDB est souvent utilisé pour stocker des données de séries chronologiques, telles que les données de clics sur les pages Web ou les données de l'Internet des objets (IoT) provenant de capteurs et d'appareils connectés. Plutôt que de supprimer les éléments les moins fréquemment consultés, de nombreux clients souhaitent les archiver à des fins d'audit. Le TTL simplifie cet archivage en supprimant automatiquement les éléments en fonction de l'attribut timestamp. 

Les éléments supprimés par TTL peuvent être identifiés dans DynamoDB Streams, qui capture une séquence chronologique de modifications au niveau des éléments et stocke la séquence dans un journal pendant 24 heures au maximum. Ces données peuvent être consommées par une fonction Lambda et archivées dans un compartiment Amazon S3 afin de réduire les coûts de stockage. Pour réduire davantage les coûts, des [règles de cycle de vie Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html) peuvent être créées pour transférer automatiquement les données (dès leur création) vers les classes de [stockage](https://aws.amazon.com/s3/storage-classes/) les moins coûteuses.

## Conditions préalables et limitations
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-prereqs"></a>

**Conditions préalables**
+ Un compte AWS actif.
+ [AWS Command Line Interface (AWS CLI) 1.7 ou](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html) version ultérieure, installée et configurée sous macOS, Linux ou Windows.
+ [Python 3.7](https://www.python.org/downloads/release/python-370/) ou version ultérieure.
+ [Boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html), installé et configuré. Si Boto3 n'est pas déjà installé, exécutez la `python -m pip install boto3` commande pour l'installer.

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

**Pile technologique**
+ Amazon DynamoDB
+ Amazon DynamoDB Streams
+ Amazon Data Firehose
+ AWS Lambda
+ Amazon S3

![\[Processus en quatre étapes entre DynamoDB et le compartiment S3.\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/9dbc833f-cf3c-4574-8f09-d0b81134fe41/images/50d9da65-5398-4a99-bc8f-58afc80e9d7b.png)


1. Les éléments sont supprimés par TTL.

1. Le déclencheur de flux DynamoDB invoque la fonction de processeur de flux Lambda.

1. La fonction Lambda place les enregistrements dans le flux de diffusion Firehose au format batch.

1. Les enregistrements de données sont archivés dans le compartiment S3.

## Outils
<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'interface de ligne de commande AWS (AWS CLI) est un outil unifié permettant de gérer vos services AWS.
+ [Amazon DynamoDB — Amazon](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) DynamoDB est une base de données de documents et de valeurs clés qui fournit des performances à un chiffre en millisecondes à n'importe quelle échelle.
+ [Amazon DynamoDB Time to Live (TTL) : Amazon DynamoDB TTL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html) vous aide à définir un horodatage par article afin de déterminer à quel moment un article n'est plus nécessaire.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Types_Amazon_DynamoDB_Streams.html) Streams — Amazon DynamoDB Streams capture une séquence chronologique de modifications au niveau des éléments dans n'importe quelle table DynamoDB et stocke ces informations dans un journal pendant 24 heures maximum.
+ [Amazon Data Firehose — Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html) est le moyen le plus simple de charger de manière fiable des données de streaming dans des lacs de données, des magasins de données et des services d'analyse.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) — AWS Lambda exécute du code sans qu'il soit nécessaire de configurer ou de gérer des serveurs. Vous payez uniquement pour le temps de calcul consommé.
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html) — Amazon Simple Storage Service (Amazon S3) est un service de stockage d'objets qui offre une évolutivité, une disponibilité des données, une sécurité et des performances de pointe.

**Code**

Le code de ce modèle est disponible dans les [éléments d' GitHub archivage vers S3 à l'aide du référentiel TTL DynamoDB](https://github.com/aws-samples/automatically-archive-items-to-s3-using-dynamodb-ttl).

## Épopées
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-epics"></a>

### Configuration d'une table DynamoDB, d'un TTL et d'un flux DynamoDB
<a name="set-up-a-dynamodb-table-ttl-and-a-dynamodb-stream"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez une table DynamoDB. | Utilisez l'AWS CLI pour créer une table dans DynamoDB appelée. `Reservation` Choisissez une unité de capacité de lecture aléatoire (RCU) et une unité de capacité d'écriture (WCU), et attribuez deux attributs à votre table : `ReservationID` et. `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>`ReservationDate`est un horodatage d'époque qui sera utilisé pour activer le TTL. | Architecte cloud, développeur d'applications | 
| Activez DynamoDB TTL. | Utilisez l'AWS CLI pour activer DynamoDB TTL pour l'attribut. `ReservationDate`<pre>aws dynamodb update-time-to-live \<br />--table-name Reservation\<br />  --time-to-live-specification Enabled=true,AttributeName=ReservationDate</pre> | Architecte cloud, développeur d'applications | 
| Activez un flux DynamoDB. | Utilisez l'AWS CLI pour activer un flux DynamoDB pour `Reservation` la table en utilisant `NEW_AND_OLD_IMAGES` le type de flux. <pre>aws dynamodb update-table \<br />--table-name Reservation \<br />  --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES</pre>Ce flux contiendra des enregistrements pour les nouveaux éléments, les éléments mis à jour, les éléments supprimés et les éléments supprimés par TTL. Les enregistrements des éléments supprimés par TTL contiennent un attribut de métadonnées supplémentaire pour les distinguer des éléments supprimés manuellement. Le `userIdentity` champ pour les suppressions TTL indique que le service DynamoDB a effectué l'action de suppression. Dans ce modèle, seuls les éléments supprimés par TTL sont archivés, mais vous ne pouvez archiver que les enregistrements dont le nom `eventName` est `REMOVE` et le contenu `userIdentity` sont `principalId` égaux à`dynamodb.amazonaws.com`. | Architecte cloud, développeur d'applications | 

### Création et configuration d'un compartiment S3
<a name="create-and-configure-an-s3-bucket"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez un compartiment S3. | Utilisez la CLI AWS pour créer un compartiment S3 de destination dans votre région AWS, en le `us-east-1` remplaçant par votre région et amzn-s3- demo-destination-bucket par le nom de votre compartiment. <pre>aws s3api create-bucket \<br />--bucket amzn-s3-demo-destination-bucket \<br />--region us-east-1</pre>Assurez-vous que le nom de votre compartiment S3 est unique au monde, car l'espace de noms est partagé par tous les comptes AWS. | Architecte cloud, développeur d'applications | 
| Créez une politique de cycle de vie de 30 jours pour le compartiment S3. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/automatically-archive-items-to-amazon-s3-using-dynamodb-ttl.html) | Architecte cloud, développeur d'applications | 

### Création d'un flux de diffusion Firehose
<a name="create-a-akf-delivery-stream"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez et configurez un flux de diffusion Firehose. | Téléchargez et modifiez l'exemple de `CreateFireHoseToS3.py` code depuis le GitHub référentiel. Ce code est écrit en Python et explique comment créer un flux de diffusion Firehose et un rôle AWS Identity and Access Management (IAM). Le rôle IAM aura une politique qui pourra être utilisée par Firehose pour écrire dans le compartiment S3 de destination.Pour exécuter le script, utilisez les arguments de commande et de ligne de commande suivants.Argument 1=`<Your_S3_bucket_ARN>`, qui est le nom de ressource Amazon (ARN) du bucket que vous avez créé précédemmentArgument 2= Le nom de votre Firehose (ce pilote utilise.) `firehose_to_s3_stream`Argument 3= Le nom de votre rôle IAM (ce pilote utilise`firehose_to_s3`.)<pre>python CreateFireHoseToS3.py <Your_S3_Bucket_ARN> firehose_to_s3_stream firehose_to_s3</pre>Si le rôle IAM spécifié n'existe pas, le script créera un rôle d'assume avec une politique de relation de confiance, ainsi qu'une politique accordant une autorisation Amazon S3 suffisante. Pour des exemples de ces politiques, consultez la section *Informations supplémentaires*. | Architecte cloud, développeur d'applications | 
| Vérifiez le flux de diffusion de Firehose. | Décrivez le flux de diffusion Firehose à l'aide de la CLI AWS pour vérifier que le flux de diffusion a bien été créé.<pre>aws firehose describe-delivery-stream --delivery-stream-name firehose_to_s3_stream </pre> | Architecte cloud, développeur d'applications | 

### Créez une fonction Lambda pour traiter le flux de diffusion Firehose
<a name="create-a-lambda-function-to-process-the-akf-delivery-stream"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez une politique de confiance pour la fonction Lambda. | Créez un fichier de politique de confiance contenant les informations suivantes.<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>Cela donne à votre fonction l'autorisation d'accéder aux ressources AWS. | Architecte cloud, développeur d'applications | 
| Créez un rôle d'exécution pour la fonction Lambda. | Pour créer le rôle d'exécution, exécutez le code suivant.<pre>aws iam create-role --role-name lambda-ex --assume-role-policy-document file://TrustPolicy.json</pre> | Architecte cloud, développeur d'applications | 
| Ajoutez une autorisation au rôle. | Pour ajouter une autorisation au rôle, utilisez la `attach-policy-to-role` commande.<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> | Architecte cloud, développeur d'applications | 
| créer une fonction Lambda ; | Compressez le `LambdaStreamProcessor.py` fichier depuis le référentiel de code en exécutant la commande suivante.<pre>zip function.zip LambdaStreamProcessor.py</pre>Lorsque vous créez la fonction Lambda, vous aurez besoin de l'ARN du rôle d'exécution Lambda. Pour obtenir l'ARN, exécutez le code suivant.<pre>aws iam get-role \<br />--role-name lambda-ex </pre>Pour créer la fonction Lambda, exécutez le code suivant.<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> | Architecte cloud, développeur d'applications | 
| Configurez le déclencheur de la fonction Lambda. | Utilisez l'AWS CLI pour configurer le déclencheur (DynamoDB Streams), qui appelle la fonction Lambda. La taille du lot de 400 permet d'éviter de rencontrer des problèmes de simultanéité 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> | Architecte cloud, développeur d'applications | 

### Testez les fonctionnalités
<a name="test-the-functionality"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Ajoutez les articles dont l'horodatage a expiré au tableau des réservations. | Pour tester la fonctionnalité, ajoutez au tableau des éléments dont l'horodatage d'époque a expiré. `Reservation` TTL supprimera automatiquement les éléments en fonction de l'horodatage. La fonction Lambda est lancée lors des activités de DynamoDB Stream, et elle filtre l'événement pour identifier l'activité ou les éléments supprimés. `REMOVE` Il place ensuite les enregistrements dans le flux de diffusion Firehose au format batch.Le flux de livraison Firehose transfère les articles vers un compartiment S3 de destination avec le `firehosetos3example/year=current year/month=current month/ day=current day/hour=current hour/` préfixe.Pour optimiser la récupération des données, configurez Amazon S3 avec le `Prefix` et `ErrorOutputPrefix` qui est détaillé dans la section *Informations supplémentaires*. | Architecte du cloud  | 

### Nettoyez les ressources
<a name="clean-up-the-resources"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Supprimez toutes les ressources. | Supprimez toutes les ressources pour vous assurer que les services que vous n'utilisez pas ne vous seront pas facturés.   | Architecte cloud, développeur d'applications | 

## Ressources connexes
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-resources"></a>
+ [Gestion du cycle de vie de votre stockage](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html)
+ [Classes de stockage Amazon S3](https://aws.amazon.com/s3/storage-classes/)
+ [Documentation du kit SDK AWS pour Python (Boto3)](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)

## Informations supplémentaires
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-additional"></a>

**Création et configuration d'un flux de diffusion Firehose — Exemples de politiques**

*Exemple de document de politique sur les relations de confiance Firehose*

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

*Exemple de politique d'autorisations 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}"
                ]
            }
        ]
    }
```

**Tester la fonctionnalité — Configuration Amazon S3**

La configuration Amazon S3 avec les éléments suivants `Prefix` `ErrorOutputPrefix` est choisie pour optimiser la récupération des données. 

*prefix*

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

Firehose crée d'abord un dossier de base appelé `firehosetos3example` directement sous le compartiment S3. Il évalue ensuite les expressions`!{timestamp:yyyy}`,`!{timestamp:MM}`, `!{timestamp:dd}` et `!{timestamp:HH}` en fonction de l'année, du mois, du jour et de l'heure en utilisant le [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)format Java.

Par exemple, un horodatage d'arrivée approximatif de 1604683577 dans Unix Epoch Time équivaut à,, et. `year=2020` `month=11` `day=06` `hour=05` Par conséquent, l'emplacement dans Amazon S3, où les enregistrements de données sont livrés, est évalué à`firehosetos3example/year=2020/month=11/day=06/hour=05/`.

*ErrorOutputPrefix*

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

Le `ErrorOutputPrefix` résultat est un dossier de base appelé `firehosetos3erroroutputbase` directement sous le compartiment S3. L'expression `!{firehose:random-string}` correspond à une chaîne aléatoire de 11 caractères telle que. `ztWxkdg3Thg` L'emplacement d'un objet Amazon S3 où les enregistrements défaillants sont livrés peut être évalué à`firehosetos3erroroutputbase/ztWxkdg3Thg/processing-failed/2020/11/06/`.