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
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 AWSSDK
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.
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_ID
AWS_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
Aufgabe | Beschreibung | Erforderliche 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 |
Aufgabe | Beschreibung | Erforderliche 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 |
Aufgabe | Beschreibung | Erforderliche 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.
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.
| 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 | App-Developer |
Führen Sie die Tabellenkopie durch. | Wiederholen Sie die folgenden Schritte, bis alle Daten kopiert sind:
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