View a markdown version of this page

Wiederherstellung von DLT-Daten nach dem Löschen des Stacks - Verteilte Lasttests auf AWS

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.

Wiederherstellung von DLT-Daten nach dem Löschen des Stacks

In diesem Abschnitt wird beschrieben, wie Sie Testszenarien wiederherstellen und den Verlauf in einem neuen DLT-Stack ausführen, nachdem der ursprüngliche Stack gelöscht wurde. Dies gilt, wenn die S3-Buckets und DynamoDB-Tabellen des Kunden beibehalten wurden (das Standardverhalten) und der Kunde sie erneut mit einer neuen Bereitstellung verbinden möchte.

Hintergrund

Wenn ein DLT-Stack gelöscht wird, bleiben die folgenden Ressourcen aufgrund von Datenschutzrichtlinien im AWS-Konto des Kunden erhalten:

Ressource Enthält Benennung

Szenarien: S3-Bucket

Testskripte (JMeter/K6/Locust), XML-Ergebnisdateien pro Aufgabe, JMeter-Framework-Assets

Auto-generated (zum Beispiel) dltstack-scenariosbucket-abc123

Protokolliert den S3-Bucket

S3-Zugriffsprotokolle für alle DLT-Buckets

Auto-generated

S3-Bucket für die Konsole

Statische Ressourcen der Web-Benutzeroberfläche

Auto-generated

Szenarien DynamoDB-Tabelle

Testdefinitionen, Konfigurationen, Planungsregeln

Auto-generated (zum BeispielDLTStack-ScenariosTable-xyz789)

DynamoDB-Tabelle mit Historie

Ergebnisse, Dauer und Erfolgsquoten des Testlaufs

Auto-generated (zum Beispiel) DLTStack-HistoryTable-xyz789

CloudWatch Gruppen protokollieren

Lambda- und ECS-Ausführungsprotokolle (10 Jahre Aufbewahrung)

Benannt nach Funktion

Alle Ressourcennamen werden automatisch von CloudFormation generiert. Sie sind nicht vorhersehbar und können bei der Bereitstellung eines neuen Stacks nicht als Parameter angegeben werden.

Wichtige Einschränkungen

  1. Die CloudFormation DLT-Vorlage akzeptiert keine Parameter für bestehende DynamoDB-Tabellen oder S3-Buckets. Eine neue Bereitstellung erzeugt immer neue Ressourcen.

  2. Das direkte Ändern von CloudFormation-managed Ressourcen außerhalb des Stacks führt zu einer Stack-Drift. Die gesamte Datenmigration muss auf Datenebene erfolgen, nicht auf Infrastrukturebene.

  3. Die Lösungs-UUID wird bei jeder neuen Bereitstellung nach dem Zufallsprinzip generiert. Der neue Stack wird eine andere UUID als das Original haben.

  4. In DynamoDB-Tabellen ist Point-in-Time Recovery (PITR) standardmäßig aktiviert, sodass kontinuierliche Backups für die letzten 35 Tage bereitgestellt werden.

Wiederherstellungsprozess

Schritt 1: Identifizieren Sie die zurückgehaltenen Ressourcen

Bevor Sie einen neuen Stack bereitstellen, suchen Sie die zurückgehaltenen Ressourcen aus dem gelöschten Stack.

# List retained DynamoDB tables (look for DLT naming patterns) aws dynamodb list-tables --query "TableNames[?contains(@, 'ScenariosTable') || contains(@, 'HistoryTable')]" # List retained S3 buckets (look for DLT naming patterns) aws s3api list-buckets --query "Buckets[?contains(Name, 'dlttestrunnerstoragedlts') || contains(Name, 'dltconsoleresourcesdltda')]"

Wenn Sie sich die CloudFormation Stack-Ausgaben vor dem Löschen notiert haben, verwenden Sie genau diese Namen. Die relevanten Ausgaben waren:

  • ScenariosBucket— der Name des S3-Buckets

  • ScenariosTable— der Name der Tabelle für DynamoDB-Szenarien

Verwenden Sie für Ressourcen, die nicht als Stack-Ausgaben verfügbar gemacht werden (z. B. die Verlaufstabelle), list-stack-resources vor dem Löschen, um die physischen Ressourcen-IDs abzurufen. Dieser Befehl listet alle Ressourcen im Stapel auf, unabhängig davon, ob sie eine entsprechende Ausgabe hat.

Schritt 2: Stellen Sie einen neuen DLT-Stack bereit

Stellen Sie einen neuen DLT-Stack mit derselben CloudFormation Vorlagenversion (oder neuer) bereit. Verwenden Sie dieselben Parameter wie bei der ursprünglichen Bereitstellung (VPC-Einstellungen, Administrator-E-Mail usw.).

aws cloudformation create-stack \ --stack-name distributed-load-testing-new \ --template-url https://s3.amazonaws.com/solutions-reference/distributed-load-testing-on-aws/latest/distributed-load-testing-on-aws.template \ --parameters ParameterKey=AdminName,ParameterValue=<admin-name> \ ParameterKey=AdminEmail,ParameterValue=<admin-email> \ --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND

Warten Sie, bis der Stack den CREATE_COMPLETE Status erreicht hat.

Schritt 3: Identifizieren Sie die Ressourcen des neuen Stacks

Rufen Sie die Ressourcennamen aus den Ausgaben des neuen Stacks ab.

aws cloudformation describe-stacks \ --stack-name distributed-load-testing-new \ --query "Stacks[0].Outputs"

Notieren Sie sich die Werte für:

  • ScenariosBucket(neuer Bucket-Name)

  • ScenariosTable(neuer Tabellenname)

Verwenden Sie für jede Ressource, die nicht als Stack-Ausgabe verfügbar gemacht wird (z. B. die Verlaufstabelle), list-stack-resources um sie anhand ihrer logischen ID zu finden:

aws cloudformation list-stack-resources \ --stack-name distributed-load-testing-new \ --query "StackResourceSummaries[?contains(LogicalResourceId, 'HistoryTable')].{LogicalId:LogicalResourceId,PhysicalId:PhysicalResourceId}"

Dieser Befehl listet alle Ressourcen auf, die der Stack verwaltet. Sie können nach einer logischen ID-Teilzeichenfolge filtern, um jede Ressource zu finden.

Schritt 4: DynamoDB-Daten migrieren

Exportieren Sie Daten aus den beibehaltenen Tabellen und importieren Sie sie in die neuen Tabellen. Verwenden Sie DynamoDB-Datenexport- oder Scan- und Schreiboperationen.

Option A: Verwendung von DynamoDB Export/Import (empfohlen für große Datensätze)

Verwenden Sie für Tabellen mit Tausenden von Elementen einen DynamoDB-Export nach S3, gefolgt von einem Import:

# Export from retained table to S3 aws dynamodb export-table-to-point-in-time \ --table-arn arn:aws:dynamodb:<region>:<account>:table/<old-scenarios-table> \ --s3-bucket <temporary-export-bucket> \ --s3-prefix dlt-migration/scenarios/ \ --export-format DYNAMODB_JSON # Wait for export to complete, then import into new table aws dynamodb import-table \ --s3-bucket-source S3Bucket=<temporary-export-bucket>,S3KeyPrefix=dlt-migration/scenarios/ \ --table-creation-parameters '{"TableName":"<new-scenarios-table>","KeySchema":[{"AttributeName":"testId","KeyType":"HASH"}],"AttributeDefinitions":[{"AttributeName":"testId","AttributeType":"S"}],"BillingMode":"PAY_PER_REQUEST"}' \ --input-format DYNAMODB_JSON
Anmerkung

Die import-table API erstellt eine neue Tabelle. Da der neue Stack die Zieltabelle bereits erstellt hat, verwenden Sie stattdessen Option B oder löschen Sie zuerst die neue leere Tabelle und erstellen Sie sie per Import neu (dies führt zu einer Stack-Drift, siehe die Warnung unten).

Option B: Scannen und BatchWrite (empfohlen)

Dieser Ansatz liest direkt aus den beibehaltenen Tabellen und schreibt in die Tabellen des neuen Stacks, ohne dass es zu einer Stack-Drift kommt. Es erfordert Python 3 und die boto3 Bibliothek.

# Install boto3 if not already available pip install boto3
#!/usr/bin/env python3 """Migrate DynamoDB items directly from retained tables to new stack tables.""" import boto3 dynamodb = boto3.resource("dynamodb", region_name="<region>") def migrate_table(source_table_name, target_table_name): source = dynamodb.Table(source_table_name) target = dynamodb.Table(target_table_name) # Scan all items from the retained table (handles pagination automatically) items = [] response = source.scan() items.extend(response["Items"]) while "LastEvaluatedKey" in response: response = source.scan(ExclusiveStartKey=response["LastEvaluatedKey"]) items.extend(response["Items"]) print(f"Scanned {len(items)} items from {source_table_name}") # Write items to the new table using batch_writer (handles batching automatically) with target.batch_writer() as batch: for item in items: batch.put_item(Item=item) print(f"Wrote {len(items)} items to {target_table_name}") # Migrate scenarios migrate_table("<old-scenarios-table>", "<new-scenarios-table>") # Migrate history migrate_table("<old-history-table>", "<new-history-table>")

Bei großen Tabellen (Zehntausende von Elementen) sollten Sie parallel Scansegmente verwenden, um die Lesephase zu beschleunigen.

Option C: Aus PITR wiederherstellen (falls innerhalb eines Zeitfensters von 35 Tagen)

Wenn der Stapel innerhalb der letzten 35 Tage gelöscht wurde und PITR aktiviert war (dies ist standardmäßig der Fall), können Sie die Tabelle zu einem bestimmten Zeitpunkt wiederherstellen. Bei PITR-Wiederherstellungen wird jedoch eine neue Tabelle mit einem anderen Namen erstellt, sodass Sie immer noch Daten mit Option B in die vom Stack verwaltete Tabelle kopieren müssten.

# Restore to a new temporary table aws dynamodb restore-table-to-point-in-time \ --source-table-name <old-scenarios-table> \ --target-table-name dlt-scenarios-restored \ --restore-date-time <timestamp-before-deletion> # Then scan from dlt-scenarios-restored and batch-write into the new stack's table

Schritt 5: S3-Daten migrieren

Kopieren Sie Testskripte und Ergebnisdateien aus dem beibehaltenen Bucket in den Bucket des neuen Stacks.

# Copy all objects from the old scenarios bucket to the new one aws s3 sync \ s3://<old-scenarios-bucket> \ s3://<new-scenarios-bucket> \ --source-region <region> \ --region <region>

Dies kopiert:

  • Testskripte (.jmxJMeter-Dateien, K6-Skripte, Locust-Dateien, ZIP-Archive)

  • XML-Dateien für Testergebnisse, organisiert nach Test-ID und Region

  • Ressourcen und Plugins des JMeter-Frameworks

Schritt 6: Überprüfen Sie die Migration

  1. Melden Sie sich mit der URL des neuen Stacks (in der Stack-Ausgabe) bei der WebConsole DLT-Webkonsole an.

  2. Vergewissern Sie sich, dass alle Testszenarien in der Szenarioliste angezeigt werden.

  3. Öffnen Sie einzelne Szenarien und stellen Sie sicher, dass der Testlaufverlauf sichtbar ist.

  4. Vergewissern Sie sich, dass Testskripte von der Szenario-Detailseite heruntergeladen werden können.

  5. Führen Sie einen kleinen Test durch, um die End-to-End-Funktionalität mit dem neuen Stack zu überprüfen.

Schritt 7: Bereinigen Sie die zurückgehaltenen Ressourcen

Nachdem Sie überprüft haben, ob alle Daten erfolgreich migriert wurden, löschen Sie die alten zurückgehaltenen Ressourcen, um laufende Speicherkosten zu vermeiden.

# Delete old DynamoDB tables aws dynamodb delete-table --table-name <old-scenarios-table> aws dynamodb delete-table --table-name <old-history-table> # Empty and delete old S3 buckets aws s3 rm s3://<old-scenarios-bucket> --recursive aws s3api delete-bucket --bucket <old-scenarios-bucket> aws s3 rm s3://<old-logs-bucket> --recursive aws s3api delete-bucket --bucket <old-logs-bucket> aws s3 rm s3://<old-console-bucket> --recursive aws s3api delete-bucket --bucket <old-console-bucket>

Führen Sie diesen Schritt erst aus, nachdem Sie sich vergewissert haben, dass der neue Stack voll funktionsfähig ist und alle historischen Daten intakt sind.

Vermeidung von Stack-Drift

Stack-Drift tritt auf, wenn der tatsächliche Zustand einer Ressource von den Erwartungen CloudFormation abweicht. Gehen Sie wie folgt vor, um Abweichungen während dieses Wiederherstellungsprozesses zu vermeiden:

  • Benennen Sie die DynamoDB-Tabellen oder S3-Buckets des neuen Stacks NICHT direkt um oder ändern Sie sie.

  • Verwenden Sie es NICHTimport-table, um die Tabellen des neuen Stacks zu ersetzen (dazu müsste zuerst die CloudFormation-managed Tabelle gelöscht werden).

  • Ändern Sie KEINE IAM-Richtlinien, Bucket-Richtlinien oder Tabelleneinstellungen außerhalb von CloudFormation.

  • Verwenden Sie nur Operationen auf Datenebene:PutItem,,BatchWriteItem,s3 sync. s3 cp

  • Schreiben Sie Daten in die Tabellen und Buckets, die CloudFormation erstellt wurden. Das Hinzufügen von Elementen zu einer DynamoDB-Tabelle oder von Objekten zu einem S3-Bucket stellt keine Drift dar.

Das Schreiben von Daten in CloudFormation-managed Tabellen und Buckets ist sicher, da die Ressourcenkonfiguration (Tabellenschema, Abrechnungsmodus, Verschlüsselungseinstellungen) und nicht der Dateninhalt CloudFormation verfolgt wird.

Was kann nicht wiederhergestellt werden

Folgendes geht verloren, wenn ein Stapel gelöscht wird und kann durch diesen Vorgang nicht wiederhergestellt werden:

Item Grund

Cognito-Benutzerkonten

Der Benutzerpool wird zusammen mit dem Stack gelöscht. Benutzer müssen sich erneut registrieren.

Aktive Zeitpläne EventBridge

Geplante Testregeln werden gelöscht. Erstellen Sie Zeitpläne manuell in der DLT-Benutzeroberfläche neu.

CloudWatch Dashboards

Per-test Dashboards (EcsLoadTesting*) werden gelöscht. Bei neuen Läufen werden neue Dashboards erstellt.

UUID der Lösung

Eine neue zufällige UUID wird generiert. Dies wirkt sich nur auf die Korrelation der Betriebsmetriken aus.

Regionale Stack-Verbände

Regionale Stacks müssen neu verteilt und dem neuen Hub-Stack wieder zugeordnet werden.

Präventive Maßnahmen

Um future Wiederherstellungsszenarien zu vereinfachen:

  1. Zeichnen Sie die Stack-Ausgaben auf, bevor Sie sie löschen. Speichern Sie die ScenariosBucket Namen der ScenariosTable Verlaufstabellen, und.

  2. Aktivieren Sie DynamoDB PITR (standardmäßig in DLT aktiviert). Stellen Sie sicher, dass es aktiv bleibt.

  3. Aktivieren Sie die S3-Versionierung (standardmäßig im Szenario-Bucket aktiviert). Dies schützt vor versehentlichem Löschen von Objekten.

  4. Erwägen Sie, den DynamoDB-Löschschutz für die Szenarien und Verlaufstabellen als zusätzlichen Schutz zu aktivieren:

    aws dynamodb update-table \ --table-name <scenarios-table> \ --deletion-protection-enabled
  5. Verwenden Sie AWS Backup, um geplante Backups von DynamoDB-Tabellen für die langfristige Aufbewahrung über das 35-tägige PITR-Fenster hinaus zu erstellen.