Automatisches Archivieren von Elementen in Amazon S3 mithilfe von DynamoDB TTL - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Automatisches Archivieren von Elementen in Amazon S3 mithilfe von DynamoDB TTL

Erstellt von Tabby Ward (AWS)

Code-Repository: Elemente mithilfe von DynamoDB TLL in S3 archivieren

Umgebung: PoC oder Pilotprojekt

Technologien: Modernisierung; Datenbanken; Serverless; Speicher und Backup; Kostenmanagement

Workload: Open-Source

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

Übersicht

Dieses Muster enthält Schritte zum Entfernen älterer Daten aus einer Amazon-DynamoDB-Tabelle und zum Archivieren in einem Amazon Simple Storage Service (Amazon S3)-Bucket auf Amazon Web Services (AWS), ohne eine Serverflotte verwalten zu müssen. 

Dieses Muster verwendet Amazon DynamoDB Time to Live (TTL), um alte Elemente automatisch zu löschen, und Amazon DynamoDB Streams, um die TTL-abgelaufenen Elemente zu erfassen. Anschließend verbindet es DynamoDB Streams mit AWS Lambda, das den Code ausführt, ohne Server bereitzustellen oder zu verwalten. 

Wenn dem DynamoDB-Stream neue Elemente hinzugefügt werden, wird die Lambda-Funktion initiiert und schreibt die Daten in einen Amazon-Data-Firehose-Bereitstellungsdatenstrom. Firehose bietet eine einfache, vollständig verwaltete Lösung zum Laden der Daten als Archiv in Amazon S3.

DynamoDB wird häufig verwendet, um Zeitreihendaten zu speichern, z. B. Clickstream-Daten von Webseiten oder Internet der Dinge (IoT)-Daten von Sensoren und verbundenen Geräten. Anstatt Elemente zu löschen, auf die weniger häufig zugegriffen wird, möchten viele Kunden sie zu Prüfungszwecken archivieren. TTL vereinfacht diese Archivierung, indem Elemente basierend auf dem Zeitstempelattribut automatisch gelöscht werden. 

Elemente, die durch TTL gelöscht wurden, können in DynamoDB Streams identifiziert werden. Dabei wird eine zeitlich geordnete Abfolge von Änderungen auf Elementebene erfasst und die Abfolge bis zu 24 Stunden lang in einem Protokoll gespeichert. Diese Daten können von einer Lambda-Funktion genutzt und in einem Amazon S3-Bucket archiviert werden, um die Speicherkosten zu senken. Um die Kosten weiter zu senken, können Amazon S3-Lebenszyklusregeln erstellt werden, um die Daten (sobald sie erstellt werden) automatisch in kostengünstige Speicherklassen wie S3 Glacier Instant Retrieval oder S3 Glacier Flexible Retrieval oder Amazon S3 Glacier Deep Archive für die langfristige Speicherung zu überführen.

Voraussetzungen und Einschränkungen

Voraussetzungen

Architektur

Technologie-Stack

  • Amazon DynamoDB

  • Amazon DynamoDB Streams

  • Amazon Data Firehose

  • AWS Lambda

  • Amazon S3

  1. Elemente werden durch TTL gelöscht.

  2. Der DynamoDB-Stream-Auslöser ruft die Lambda-Stream-Prozessorfunktion auf.

  3. Die Lambda-Funktion speichert Datensätze im Firehose-Bereitstellungs-Stream im Batch-Format.

  4. Datensätze werden im S3-Bucket archiviert.

Tools

  • AWS CLI – Die AWS Command Line Interface (AWS CLI) ist ein einheitliches Tool zur Verwaltung Ihrer AWS-Services.

  • Amazon DynamoDB – Amazon DynamoDB ist eine Schlüsselwert- und Dokumentdatenbank, die eine einstellige Millisekunden-Leistung in jeder Größenordnung bietet.

  • Amazon DynamoDB Time to Live (TTL) – Mit Amazon DynamoDB TTL können Sie einen Zeitstempel pro Element definieren, um zu bestimmen, wann ein Element nicht mehr benötigt wird.

  • Amazon DynamoDB Streams – Amazon DynamoDB Streams erfasst eine zeitlich geordnete Abfolge von Änderungen auf Elementebene in jeder DynamoDB-Tabelle und speichert diese Informationen bis zu 24 Stunden lang in einem Protokoll.

  • Amazon Data Firehose – Amazon Data Firehose ist die einfachste Möglichkeit, Streaming-Daten zuverlässig in Data Lakes, Datenspeicher und Analyseservices zu laden.

  • AWS Lambda – AWS Lambda führt Code aus, ohne dass Server bereitgestellt oder verwaltet werden müssen. Sie zahlen nur für die tatsächlich aufgewendete Zeit.

  • Amazon S3 – Amazon Simple Storage Service (Amazon S3) ist ein Objektspeicherservice, der branchenweit führende Skalierbarkeit, Datenverfügbarkeit, Sicherheit und Leistung bietet.

Code

Der Code für dieses Muster ist im GitHub Archivieren von Elementen in S3 mithilfe des DynamoDB-TTL-Repositorys verfügbar.

Sekunden

AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie eine DynamoDB-Tabelle.

Verwenden Sie die AWS CLI, um eine Tabelle in DynamoDB mit dem Namen zu erstellenReservation. Wählen Sie zufällige Lesekapazitätseinheit (RCU) und Schreibkapazitätseinheit (WCU) aus und geben Sie Ihrer Tabelle zwei Attribute: ReservationID und 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 ist ein Epochenzeitstempel, der verwendet wird, um TTL zu aktivieren.

Cloud-Architekt, App-Entwickler

Aktivieren Sie DynamoDB TTL.

Verwenden Sie die AWS CLI, um DynamoDB TTL für das ReservationDate Attribut zu aktivieren.

aws dynamodb update-time-to-live \ --table-name Reservation\ --time-to-live-specification Enabled=true,AttributeName=ReservationDate
Cloud-Architekt, App-Entwickler

Aktivieren Sie einen DynamoDB-Stream.

Verwenden Sie die AWS CLI, um einen DynamoDB-Stream für die Reservation Tabelle mithilfe des NEW_AND_OLD_IMAGES Stream-Typs zu aktivieren. 

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

Dieser Stream enthält Datensätze für neue Elemente, aktualisierte Elemente, gelöschte Elemente und Elemente, die durch TTL gelöscht werden. Die Datensätze für Elemente, die durch TTL gelöscht werden, enthalten ein zusätzliches Metadatenattribut, um sie von Elementen zu unterscheiden, die manuell gelöscht wurden. Das userIdentity Feld für TTL-Löschungen gibt an, dass der DynamoDB-Service die Löschaktion ausgeführt hat. 

In diesem Muster werden nur die durch TTL gelöschten Elemente archiviert, aber Sie können nur die Datensätze principalId archivieren, bei denen eventName gleich ist REMOVE und userIdentity enthältdynamodb.amazonaws.com.

Cloud-Architekt, App-Entwickler
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie einen S3-Bucket.

Verwenden Sie die AWS CLI, um einen S3-Ziel-Bucket in Ihrer AWS-Region zu erstellen, und ersetzen Sie durch us-east-1 Ihre Region. 

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

Stellen Sie sicher, dass der Name des S3-Buckets global eindeutig ist, da der Namespace von allen AWS-Konten gemeinsam genutzt wird.

Cloud-Architekt, App-Entwickler

Erstellen Sie eine 30-tägige Lebenszyklusrichtlinie für den S3-Bucket.

  1. Melden Sie sich bei der AWS-Managementkonsole an und öffnen Sie die Amazon S3-Konsole. 

  2. Wählen Sie den S3-Bucket aus, der die Daten aus Firehose enthält. 

  3. Wählen Sie im S3-Bucket die Registerkarte Verwaltung und dann Lebenszyklusregel hinzufügen aus

  4. Geben Sie im Dialogfeld Lebenszyklusregel einen Namen für Ihre Regel ein und konfigurieren Sie eine 30-tägige Lebenszyklusregel für Ihren Bucket.

Cloud-Architekt, App-Entwickler
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen und konfigurieren Sie einen Firehose-Bereitstellungs-Stream.

Laden Sie das CreateFireHoseToS3.py Codebeispiel aus dem GitHub Repository herunter und bearbeiten Sie es. 

Dieser Code ist in Python geschrieben und zeigt Ihnen, wie Sie einen Firehose-Bereitstellungs-Stream und eine AWS Identity and Access Management (IAM)-Rolle erstellen. Die IAM-Rolle verfügt über eine Richtlinie, mit der Firehose in den S3-Ziel-Bucket schreiben kann.

Verwenden Sie den folgenden Befehl und die folgenden Befehlszeilenargumente, um das Skript auszuführen.

Argument 1= <Your_S3_bucket_ARN>, bei dem es sich um den Amazon-Ressourcennamen (ARN) für den Bucket handelt, den Sie zuvor erstellt haben

Argument 2= Ihr Firehose-Name (Dieses Pilotprojekt verwendet firehose_to_s3_stream.)

Argument 3= Ihr IAM-Rollenname (Dieses Pilotprojekt verwendet firehose_to_s3.)

python CreateFireHoseToS3.py <Your_S3_Bucket_ARN> firehose_to_s3_stream firehose_to_s3

Wenn die angegebene IAM-Rolle nicht vorhanden ist, erstellt das Skript eine Übernahmerolle mit einer Vertrauensbeziehungsrichtlinie sowie eine Richtlinie, die ausreichende Amazon S3-Berechtigung gewährt. Beispiele für diese Richtlinien finden Sie im Abschnitt Zusätzliche Informationen.

Cloud-Architekt, App-Entwickler

Überprüfen Sie den Firehose-Bereitstellungsdatenstrom.

Beschreiben Sie den Firehose-Bereitstellungsdatenstrom mithilfe der AWS CLI, um zu überprüfen, ob der Bereitstellungsdatenstrom erfolgreich erstellt wurde.

aws firehose describe-delivery-stream --delivery-stream-name firehose_to_s3_stream
Cloud-Architekt, App-Entwickler
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie eine Vertrauensrichtlinie für die Lambda-Funktion.

Erstellen Sie eine Vertrauensrichtliniendatei mit den folgenden Informationen.

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

Dadurch erhält Ihre Funktion die Berechtigung, auf AWS-Ressourcen zuzugreifen.

Cloud-Architekt, App-Entwickler

Erstellen Sie eine Ausführungsrolle für die Lambda-Funktion.

Führen Sie den folgenden Code aus, um die Ausführungsrolle zu erstellen.

aws iam create-role --role-name lambda-ex --assume-role-policy-document file://TrustPolicy.json
Cloud-Architekt, App-Entwickler

Fügen Sie der Rolle die Berechtigung hinzu.

Verwenden Sie den attach-policy-to-role Befehl , um der Rolle Berechtigungen hinzuzufügen.

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
Cloud-Architekt, App-Entwickler

Erstellen Sie eine Lambda-Funktion.

Komprimieren Sie die LambdaStreamProcessor.py Datei aus dem Code-Repository, indem Sie den folgenden Befehl ausführen.

zip function.zip LambdaStreamProcessor.py

Wenn Sie die Lambda-Funktion erstellen, benötigen Sie den ARN der Lambda-Ausführungsrolle. Führen Sie den folgenden Code aus, um den ARN abzurufen.

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

Führen Sie den folgenden Code aus, um die Lambda-Funktion zu erstellen.

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}"
Cloud-Architekt, App-Entwickler

Konfigurieren Sie den Lambda-Funktionsauslöser.

Verwenden Sie die AWS CLI, um den Auslöser (DynamoDB Streams) zu konfigurieren, der die Lambda-Funktion aufruft. Die Batchgröße von 400 soll vermeiden, dass Probleme mit der Lambda-Gleichzeitigkeit auftreten.

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>
Cloud-Architekt, App-Entwickler
AufgabeBeschreibungErforderliche Fähigkeiten

Fügen Sie der Tabelle Reservierung Elemente mit abgelaufenen Zeitstempeln hinzu.

Um die Funktionalität zu testen, fügen Sie der Reservation Tabelle Elemente mit abgelaufenen Epochenzeitstempeln hinzu. TTL löscht Elemente automatisch basierend auf dem Zeitstempel. 

Die Lambda-Funktion wird bei DynamoDB-Stream-Aktivitäten initiiert und filtert das Ereignis, um REMOVE Aktivitäten oder gelöschte Elemente zu identifizieren. Anschließend werden Datensätze im Batch-Format im Firehose-Bereitstellungs-Stream abgelegt.

Der Firehose-Bereitstellungs-Stream überträgt Elemente an einen Ziel-S3-Bucket mit dem firehosetos3example/year=current year/month=current month/ day=current day/hour=current hour/ Präfix .

Wichtig: Um den Datenabruf zu optimieren, konfigurieren Sie Amazon S3 mit den Prefix und ErrorOutputPrefix, die im Abschnitt Zusätzliche Informationen beschrieben sind.

Cloud-Architekt
AufgabeBeschreibungErforderliche Fähigkeiten

Löschen Sie alle Ressourcen.

Löschen Sie alle Ressourcen, um sicherzustellen, dass Ihnen keine Gebühren für Services berechnet werden, die Sie nicht verwenden.  

Cloud-Architekt, App-Entwickler

Zugehörige Ressourcen

Zusätzliche Informationen

Erstellen und Konfigurieren eines Firehose-Bereitstellungsdatenstroms – Richtlinienbeispiele

Beispieldokument für eine Firehose-Richtlinie für vertrauenswürdige Beziehungen

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

Beispiel für eine S3-Berechtigungsrichtlinie

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

Testen der Funktionalität – Amazon S3-Konfiguration

Die Amazon S3-Konfiguration mit dem folgenden Prefix und ErrorOutputPrefix wird zur Optimierung des Datenabrufs ausgewählt. 

prefix

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

Firehose erstellt zunächst einen Basisordner mit dem Namen firehosetos3example direkt unter dem S3-Bucket. Anschließend werden die Ausdrücke !{timestamp:yyyy}, !{timestamp:MM}!{timestamp:dd}, und !{timestamp:HH} auf Jahr, Monat, Tag und Stunde im Java-DateTimeFormatterFormat ausgewertet.

Ein ungefährer Ankunftszeitstempel von 1604683577 in der Unix-Epochenzeit ergibt beispielsweise year=2020, month=11day=06, und hour=05. Daher wird der Speicherort in Amazon S3, an den Datensätze übermittelt werden, als ausgewertetfirehosetos3example/year=2020/month=11/day=06/hour=05/.

ErrorOutputPrefix

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

Das ErrorOutputPrefix führt zu einem Basisordner mit dem Namen firehosetos3erroroutputbase direkt unter dem S3-Bucket. Der Ausdruck !{firehose:random-string} wird zu einer zufälligen Zeichenfolge mit 11 Zeichen ausgewertet, z. B. ztWxkdg3Thg. Der Speicherort für ein Amazon S3-Objekt, an das fehlgeschlagene Datensätze übermittelt werden, könnte zu ausgewertet werdenfirehosetos3erroroutputbase/ztWxkdg3Thg/processing-failed/2020/11/06/.