Amazon DynamoDB-Tabellen mithilfe einer benutzerdefinierten Implementierung kontenübergreifend kopieren - 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.

Amazon DynamoDB-Tabellen mithilfe einer benutzerdefinierten Implementierung kontenübergreifend kopieren

Erstellt von Ramkumar Ramanujam () AWS

Übersicht

Bei der Arbeit mit Amazon DynamoDB auf Amazon Web Services (AWS) besteht ein häufiger Anwendungsfall darin, DynamoDB-Tabellen in Entwicklungs-, Test- oder Staging-Umgebungen mit den Tabellendaten in der Produktionsumgebung zu kopieren oder zu synchronisieren. Standardmäßig verwendet jede Umgebung ein anderes Konto. AWS

DynamoDB unterstützt jetzt kontoübergreifende Backups mithilfe von Backup. AWS Informationen zu den damit verbundenen Speicherkosten bei der Verwendung von AWS Backup finden Sie unter AWSBackup-Preise. Wenn Sie AWS Backup verwenden, um kontenübergreifend zu kopieren, müssen die Quell- und Zielkonten Teil einer AWS Organisationsorganisation sein. Es gibt andere Lösungen für kontoübergreifende Sicherung und Wiederherstellung mithilfe von AWS Diensten wie AWS Glue. Die Verwendung dieser Lösungen erhöht jedoch den Platzbedarf der Anwendungen, da mehr AWS Dienste bereitgestellt und verwaltet werden müssen. 

Sie können Amazon DynamoDB Streams auch verwenden, um Tabellenänderungen im Quellkonto zu erfassen. Anschließend können Sie eine AWS Lambda-Funktion initiieren und die entsprechenden Änderungen in der Zieltabelle im Zielkonto vornehmen. Diese Lösung gilt jedoch für Anwendungsfälle, in denen Quell- und Zieltabellen immer synchron gehalten werden müssen. Sie gilt möglicherweise nicht für Entwicklungs-, Test- und Staging-Umgebungen, in denen Daten häufig aktualisiert werden.

Dieses Muster enthält Schritte zur Implementierung einer benutzerdefinierten Lösung zum Kopieren einer Amazon DynamoDB-Tabelle von einem Konto in ein anderes. Dieses Muster kann mit gängigen Programmiersprachen wie C#, Java und Python implementiert werden. Wir empfehlen die Verwendung einer Sprache, die von einem AWSSDKunterstützt wird.

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Zwei aktive AWS Konten

  • DynamoDB-Tabellen in beiden Konten

  • Kenntnis der Rollen und Richtlinien von AWS Identity and Access Management (IAM)

  • Kenntnis des Zugriffs auf Amazon DynamoDB-Tabellen mit einer gängigen Programmiersprache wie C#, Java oder Python

Einschränkungen

Dieses Muster gilt für DynamoDB-Tabellen mit einer Größe von etwa 2 GB oder weniger. Es verfügt über zusätzliche Logik zur Behandlung von Verbindungs- oder Sitzungsunterbrechungen, Drosselungen sowie Ausfällen und Wiederholungsversuchen und kann daher für größere Tabellen verwendet werden.

Der DynamoDB-Scanvorgang, der Elemente aus der Quelltabelle liest, kann in einem einzigen Aufruf nur bis zu 1 MB an Daten abrufen. Bei größeren Tabellen, die größer als 2 GB sind, kann diese Beschränkung die Gesamtzeit bis zum vollständigen Kopieren der Tabelle verlängern.

Architektur

Das folgende Diagramm zeigt die benutzerdefinierte Implementierung zwischen dem Quell- und dem AWS Zielkonto. IAMRichtlinien und Sicherheitstoken werden bei der benutzerdefinierten Implementierung verwendet. Daten werden aus Amazon DynamoDB im Quellkonto gelesen und im Zielkonto in DynamoDB geschrieben.

Quell- und Zielkontoarchitektur für das Kopieren mithilfe der benutzerdefinierten Implementierung.

Automatisierung und Skalierung

Dieses Muster gilt für DynamoDB-Tabellen, die kleiner sind, etwa 2 GB. 

Um dieses Muster auf größere Tabellen anzuwenden, beheben Sie die folgenden Probleme:

  • Während des Tabellenkopiervorgangs werden zwei aktive Sitzungen mit unterschiedlichen Sicherheitstoken aufrechterhalten. Wenn der Vorgang zum Kopieren der Tabelle länger dauert als die Ablaufzeiten der Token, müssen Sie eine Logik zur Aktualisierung der Sicherheitstoken einrichten. 

  • Wenn nicht genügend Lesekapazitätseinheiten (RCUs) und Schreibkapazitätseinheiten (WCUs) bereitgestellt werden, werden Lese- oder Schreibvorgänge in der Quell- oder Zieltabelle möglicherweise gedrosselt. Achten Sie darauf, diese Ausnahmen zu erkennen und zu behandeln. 

  • Behandeln Sie alle anderen Fehler oder Ausnahmen und richten Sie einen Wiederholungsmechanismus ein, um es erneut zu versuchen oder an der Stelle fortzusetzen, an der der Kopiervorgang fehlgeschlagen ist.

Tools

Tools

  • Amazon DynamoDB — Amazon DynamoDB ist ein vollständig verwalteter Service ohne SQL Datenbank, der schnelle und vorhersehbare Leistung mit nahtloser Skalierbarkeit bietet. 

  • Welche zusätzlichen Tools erforderlich sind, hängt von der Programmiersprache ab, die Sie für die Implementierung auswählen. Wenn Sie beispielsweise C# verwenden, benötigen Sie Microsoft Visual Studio und die folgenden NuGet Pakete:

    • AWSSDK

    • AWSSDK.DynamoDBv2

Code

Der folgende Python-Codeausschnitt löscht eine DynamoDB-Tabelle mithilfe der Boto3-Bibliothek und erstellt sie neu.

Verwenden Sie nicht das AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY eines IAM Benutzers, da es sich dabei um langfristige Anmeldeinformationen handelt, die für den programmatischen Zugriff auf Dienste vermieden werden sollten. AWS Weitere Informationen zu temporären Anmeldeinformationen finden Sie im Abschnitt Bewährte Methoden.

Die im folgenden Codeausschnitt TEMPORARY_SESSION_TOKEN verwendeten AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY, und sind temporäre Anmeldeinformationen, die vom AWS Security Token Service () abgerufen wurden. AWS STS

import boto3 import sys import json #args = input-parameters = GLOBAL_SEC_INDEXES_JSON_COLLECTION, ATTRIBUTES_JSON_COLLECTION, TARGET_DYNAMODB_NAME, TARGET_REGION, ... #Input param: GLOBAL_SEC_INDEXES_JSON_COLLECTION #[{"IndexName":"Test-index","KeySchema":[{"AttributeName":"AppId","KeyType":"HASH"},{"AttributeName":"AppType","KeyType":"RANGE"}],"Projection":{"ProjectionType":"INCLUDE","NonKeyAttributes":["PK","SK","OwnerName","AppVersion"]}}] #Input param: ATTRIBUTES_JSON_COLLECTION #[{"AttributeName":"PK","AttributeType":"S"},{"AttributeName":"SK","AttributeType":"S"},{"AttributeName":"AppId","AttributeType":"S"},{"AttributeName":"AppType","AttributeType":"N"}] region = args['TARGET_REGION'] target_ddb_name = args['TARGET_DYNAMODB_NAME'] global_secondary_indexes = json.loads(args['GLOBAL_SEC_INDEXES_JSON_COLLECTION']) attribute_definitions = json.loads(args['ATTRIBUTES_JSON_COLLECTION']) # Drop and create target DynamoDB table dynamodb_client = boto3.Session( aws_access_key_id=args['AWS_ACCESS_KEY_ID'], aws_secret_access_key=args['AWS_SECRET_ACCESS_KEY'], aws_session_token=args['TEMPORARY_SESSION_TOKEN'], ).client('dynamodb') # Delete table print('Deleting table: ' + target_ddb_name + ' ...') try: dynamodb_client.delete_table(TableName=target_ddb_name) #Wait for table deletion to complete waiter = dynamodb_client.get_waiter('table_not_exists') waiter.wait(TableName=target_ddb_name) print('Table deleted.') except dynamodb_client.exceptions.ResourceNotFoundException: print('Table already deleted / does not exist.') pass print('Creating table: ' + target_ddb_name + ' ...') table = dynamodb_client.create_table( TableName=target_ddb_name, KeySchema=[ { 'AttributeName': 'PK', 'KeyType': 'HASH' # Partition key }, { 'AttributeName': 'SK', 'KeyType': 'RANGE' # Sort key } ], AttributeDefinitions=attribute_definitions, GlobalSecondaryIndexes=global_secondary_indexes, BillingMode='PAY_PER_REQUEST' ) waiter = dynamodb_client.get_waiter('table_exists') waiter.wait(TableName=target_ddb_name) print('Table created.')

Bewährte Methoden

Temporäre Anmeldeinformationen

Aus Sicherheitsgründen sollten Sie beim programmgesteuerten Zugriff auf AWS Dienste nicht das AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY eines IAM Benutzers verwenden, da es sich dabei um langfristige Anmeldeinformationen handelt. Versuchen Sie immer, temporäre Anmeldeinformationen für den programmgesteuerten Zugriff auf AWS Dienste zu verwenden.

Ein Beispiel: Ein Entwickler kodiert das Ende eines IAM Benutzers in der AWS_ACCESS_KEY_ID Anwendung während AWS_SECRET_ACCESS_KEY der Entwicklung fest, kann aber die hartcodierten Werte nicht entfernen, bevor er die Änderungen in das Code-Repository überträgt. Diese offengelegten Anmeldeinformationen können von unbeabsichtigten oder böswilligen Benutzern verwendet werden, was schwerwiegende Folgen haben kann (insbesondere, wenn die offengelegten Anmeldeinformationen Administratorrechte haben). Diese offengelegten Anmeldeinformationen sollten sofort über die IAM Konsole oder die AWS Befehlszeilenschnittstelle () AWS CLI deaktiviert oder gelöscht werden.

Um temporäre Anmeldeinformationen für den programmatischen Zugriff auf AWS Dienste zu erhalten, verwenden Sie. AWS STS Temporäre Anmeldeinformationen sind nur für die angegebene Zeit gültig (von 15 Minuten bis 36 Stunden). Die maximal zulässige Dauer temporärer Anmeldeinformationen hängt von Faktoren wie Rolleneinstellungen und Rollenverkettung ab. Weitere Informationen zu AWS STS finden Sie in der Dokumentation.

Epen

AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie DynamoDB-Tabellen.

Erstellen Sie DynamoDB-Tabellen mit Indizes sowohl in Quell- als auch in Zielkonten. AWS

Stellen Sie die Kapazitätsbereitstellung auf den On-Demand-Modus ein, sodass DynamoDB die Lese-/Schreibkapazitäten dynamisch auf der Grundlage der Arbeitslast skalieren kann. 

Alternativ können Sie die bereitgestellte Kapazität mit 4000 und 4000 verwenden. RCUs WCUs

App-Entwickler, DBA Migrationsingenieur

Füllen Sie die Quelltabelle aus.

Füllen Sie die DynamoDB-Tabelle im Quellkonto mit Testdaten auf. Wenn Sie mindestens 50 MB an Testdaten haben, können Sie den Spitzenwert und den RCUs Durchschnittsverbrauch beim Kopieren der Tabelle ermitteln. Anschließend können Sie die Kapazitätsbereitstellung nach Bedarf ändern.

App-Entwickler, DBA Migrationsingenieur
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie IAM Rollen für den Zugriff auf die DynamoDB-Quell- und Zieltabellen.

Erstellen Sie eine IAM Rolle im Quellkonto mit Berechtigungen für den Zugriff (das Lesen) der DynamoDB-Tabelle im Quellkonto.

Fügen Sie das Quellkonto als vertrauenswürdige Entität für diese Rolle hinzu.

Erstellen Sie eine IAM Rolle im Zielkonto mit Zugriffsberechtigungen (Erstellen, Lesen, Aktualisieren, Löschen) auf die DynamoDB-Tabelle im Zielkonto.  

Fügen Sie das Zielkonto als vertrauenswürdige Entität für diese Rolle hinzu.

App-Entwickler, AWS DevOps
AufgabeBeschreibungErforderliche Fähigkeiten

Besorgen Sie sich temporäre Anmeldeinformationen für die IAM Rollen.

Holen Sie sich temporäre Anmeldeinformationen für die IAM Rolle, die im Quellkonto erstellt wurde.

Rufen Sie temporäre Anmeldeinformationen für die im Zielkonto erstellte IAM Rolle ab.

Eine Möglichkeit, die temporären Anmeldeinformationen für die IAM Rolle abzurufen, ist die Verwendung AWS STS von AWSCLI.

aws sts assume-role --role-arn arn:aws:iam::<account-id>:role/<role-name> --role-session-name <session-name> --profile <profile-name>

Verwenden Sie das entsprechende AWS Profil (entspricht dem Quell- oder Zielkonto).

Weitere Informationen zu den verschiedenen Möglichkeiten, temporäre Anmeldeinformationen zu erhalten, finden Sie im Folgenden:

App-Entwickler, Migrationsingenieur

Initialisieren Sie die DynamoDB-Clients für den Quell- und Ziel-DynamoDB-Zugriff.

Initialisieren Sie die DynamoDB-Clients, die von der bereitgestellt werden AWSSDK, für die DynamoDB-Quell- und Zieltabellen.

  • Verwenden Sie für den DynamoDB-Quellclient die temporären Anmeldeinformationen, die vom Quellkonto abgerufen wurden.

  • Verwenden Sie für den DynamoDB-Zielclient die temporären Anmeldeinformationen, die vom Zielkonto abgerufen wurden.

Weitere Informationen zum Stellen von Anfragen mithilfe IAM temporärer Anmeldeinformationen finden Sie in der Dokumentation. AWS

App-Developer

Löschen Sie die Zieltabelle und erstellen Sie sie neu.

Löschen Sie die DynamoDB-Zieltabelle (zusammen mit den Indizes) im Zielkonto und erstellen Sie sie neu, indem Sie den DynamoDB-Client für das Zielkonto verwenden.

Das Löschen aller Datensätze aus einer DynamoDB-Tabelle ist ein kostspieliger Vorgang, da dafür bereitgestellte Daten verbraucht werden. WCUs Durch das Löschen und Neuerstellen der Tabelle werden diese zusätzlichen Kosten vermieden.

Sie können einer Tabelle Indizes hinzufügen, nachdem Sie sie erstellt haben, aber das dauert 2—5 Minuten länger. Das Erstellen von Indizes während der Tabellenerstellung, indem die Indexsammlung an den createTable Aufruf übergeben wird, ist effizienter.

App-Developer

Führen Sie die Tabellenkopie durch.

Wiederholen Sie die folgenden Schritte, bis alle Daten kopiert sind:

  • Führen Sie mithilfe des DynamoDB-Quellclients einen Scan der Tabelle im Quellkonto durch. Jeder DynamoDB-Scan ruft nur 1 MB an Daten aus der Tabelle ab. Daher müssen Sie diesen Vorgang wiederholen, bis alle Elemente oder Datensätze gelesen sind.

  • Schreiben Sie für jeden Satz gescannter Elemente die Elemente mit dem DynamoDB-Zielclient in die Tabelle im Zielkonto, indem BatchWriteItem Sie den DynamoDB-Aufruf verwenden. AWS SDK Dadurch wird die Anzahl der PutItem Anfragen an DynamoDB reduziert. 

  • BatchWriteItemhat eine Beschränkung auf 25 Schreibvorgänge oder Eingaben oder bis zu 16 MB. Sie müssen eine Logik hinzufügen, um gescannte Objekte in einer Anzahl von 25 zu sammeln, bevor Sie anrufenBatchWriteItem. BatchWriteItemgibt eine Liste von Elementen zurück, die nicht erfolgreich kopiert werden konnten. Fügen Sie anhand dieser Liste eine Wiederholungslogik hinzu, um einen weiteren BatchWriteItem Aufruf nur mit den Elementen durchzuführen, die nicht erfolgreich waren.

Weitere Informationen finden Sie in der Referenzimplementierung in C# (zum Löschen, Erstellen und Auffüllen von Tabellen) im Abschnitt Anlagen. Eine JavaScript Object Notation (JSON) -Beispieldatei für die Tabellenkonfiguration ist ebenfalls angehängt.

App-Developer

Zugehörige Ressourcen

Zusätzliche Informationen

Dieses Muster wurde mit C# implementiert, um eine DynamoDB-Tabelle mit 200.000 Elementen (durchschnittliche Elementgröße von 5 KB und Tabellengröße von 250 MB) zu kopieren. Die DynamoDB-Zieltabelle wurde mit einer bereitgestellten Kapazität von 4000 und 4000 RCUs eingerichtet. WCUs

Das vollständige Kopieren der Tabelle (vom Quellkonto zum Zielkonto), einschließlich Löschen und Neuerstellen der Tabelle, dauerte 5 Minuten. Insgesamt verbrauchte Kapazitätseinheiten: 30.000 RCUs und etwa 400.000WCUs.

Weitere Informationen zu DynamoDB-Kapazitätsmodi finden Sie in der Dokumentation unter Kapazitätsmodus Lesen/Schreiben. AWS

Anlagen

Um auf zusätzliche Inhalte zuzugreifen, die mit diesem Dokument verknüpft sind, entpacken Sie die folgende Datei: attachment.zip