Archivez automatiquement les éléments sur Amazon S3 à l'aide de DynamoDB TTL - Recommandations AWS

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

Créée par Tabby Ward (AWS)

Référentiel de code : archiver des éléments dans S3 à l'aide de DynamoDB TLL

Environnement : PoC ou pilote

Technologies : modernisation ; bases de données ; système sans serveur ; stockage et sauvegarde ; gestion des coûts

Charge de travail : Open source

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

Récapitulatif

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 peuvent être créées pour transférer automatiquement les données (dès leur création) vers les classes de stockage les moins coûteuses, telles que S3 Glacier Instant Retrieval ou S3 Glacier Flexible Retrieval, ou Amazon S3 Glacier Deep Archive pour le stockage à long terme.

Conditions préalables et limitations

Prérequis

  • Un compte AWS actif.

  • AWS Command Line Interface (AWS CLI) 1.7 ou version ultérieure, installée et configurée sous macOS, Linux ou Windows.

  • Python 3.7 ou version ultérieure.

  • Boto3, installé et configuré. Si Boto3 n'est pas déjà installé, exécutez la python -m pip install boto3 commande pour l'installer.

Architecture

Pile technologique

  • Amazon DynamoDB

  • Streams Amazon DynamoDB

  • Amazon Data Firehose

  • AWS Lambda

  • Amazon S3

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

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

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

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

Outils

  • AWS CLI — L'interface de ligne de commande AWS (AWS CLI) est un outil unifié permettant de gérer vos services AWS.

  • Amazon DynamoDB — Amazon 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 vous aide à définir un horodatage par article afin de déterminer à quel moment un article n'est plus nécessaire.

  • Amazon DynamoDB 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 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 — 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 — 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.

Épopées

TâcheDescriptionCompé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 

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

ReservationDateest 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

aws dynamodb update-time-to-live \ --table-name Reservation\ --time-to-live-specification Enabled=true,AttributeName=ReservationDate
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. 

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

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
TâcheDescriptionCompé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. 

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

Assurez-vous que le nom du 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.

  1. Connectez-vous à l'AWS Management Console et ouvrez la console Amazon S3. 

  2. Choisissez le compartiment S3 qui contient les données de Firehose. 

  3. Dans le compartiment S3, choisissez l'onglet Gestion, puis choisissez Ajouter une règle de cycle de vie

  4. Entrez un nom pour votre règle dans la boîte de dialogue Règle du cycle de vie et configurez une règle de cycle de vie de 30 jours pour votre compartiment.

Architecte cloud, développeur d'applications
TâcheDescriptionCompé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édemment

Argument 2= Le nom de votre Firehose (ce pilote utilise.) firehose_to_s3_stream

Argument 3= Le nom de votre rôle IAM (ce pilote utilisefirehose_to_s3.)

python CreateFireHoseToS3.py <Your_S3_Bucket_ARN> firehose_to_s3_stream firehose_to_s3

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 été créé avec succès.

aws firehose describe-delivery-stream --delivery-stream-name firehose_to_s3_stream
Architecte cloud, développeur d'applications
TâcheDescriptionCompétences requises

Créez une politique de confiance pour la fonction Lambda.

Créez un fichier de politique de confiance contenant les informations suivantes.

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

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.

aws iam create-role --role-name lambda-ex --assume-role-policy-document file://TrustPolicy.json
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.

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
Architecte cloud, développeur d'applications

Créez une fonction Lambda.

Compressez le LambdaStreamProcessor.py fichier depuis le référentiel de code en exécutant la commande suivante.

zip function.zip LambdaStreamProcessor.py

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.

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

Pour créer la fonction Lambda, exécutez le code suivant.

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}"
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.

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>
Architecte cloud, développeur d'applications
TâcheDescriptionCompé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.

Important : 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
TâcheDescriptionCompé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

Informations supplémentaires

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 DateTimeFormatterformat 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 est !{firehose:random-string} évaluée en 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/.