View a markdown version of this page

Recupero dei dati DLT dopo l'eliminazione dello stack - Test di carico distribuito su AWS

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Recupero dei dati DLT dopo l'eliminazione dello stack

Questa sezione descrive come ripristinare gli scenari di test ed eseguire la cronologia in un nuovo stack DLT dopo l'eliminazione dello stack originale. Si applica quando i bucket S3 e le tabelle DynamoDB del cliente sono stati mantenuti (il comportamento predefinito) e il cliente desidera ricollegarli a una nuova implementazione.

Contesto

Quando uno stack DLT viene eliminato, le seguenti risorse vengono conservate nell'account AWS del cliente a causa delle politiche di protezione dei dati:

Risorsa Contiene Denominazione

Scenari: bucket S3

Script di test (JMeter/K6/Locust), file XML con i risultati per attività, risorse del framework JMeter

Auto-generated (ad esempio,) dltstack-scenariosbucket-abc123

Registra il bucket S3

I log di accesso S3 per tutti i bucket DLT

Auto-generated

Bucket S3 per console

Risorse statiche dell'interfaccia utente Web

Auto-generated

Tabella degli scenari DynamoDB

Definizioni, configurazioni e regole di pianificazione dei test

Auto-generated (ad esempio,) DLTStack-ScenariosTable-xyz789

Tabella Cronologia DynamoDB

Risultati delle esecuzioni dei test, durate, percentuali di successo

Auto-generated (ad esempio,DLTStack-HistoryTable-xyz789)

CloudWatch gruppi di log

Log di esecuzione Lambda ed ECS (conservazione per 10 anni)

Denominati per funzione

Tutti i nomi delle risorse vengono generati automaticamente da CloudFormation. Non sono prevedibili e non possono essere specificati come parametri durante la distribuzione di un nuovo stack.

Vincoli importanti

  1. Il CloudFormation modello DLT non accetta parametri per tabelle DynamoDB o bucket S3 esistenti. Una nuova implementazione crea sempre nuove risorse.

  2. La modifica diretta CloudFormation-managed delle risorse all'esterno dello stack causa la deriva dello stack. Tutte le migrazioni dei dati devono avvenire a livello di dati, non a livello di infrastruttura.

  3. L'UUID della soluzione viene generato casualmente ad ogni nuova implementazione. Il nuovo stack avrà un UUID diverso da quello originale.

  4. Le tabelle DynamoDB Point-in-Time hanno Recovery (PITR) abilitato per impostazione predefinita, fornendo backup continui per gli ultimi 35 giorni.

Processo di ripristino

Fase 1: Identificare le risorse conservate

Prima di distribuire un nuovo stack, individua le risorse conservate dallo stack eliminato.

# 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')]"

Se hai annotato gli output dello CloudFormation stack prima dell'eliminazione, usa quei nomi esatti. I risultati rilevanti erano:

  • ScenariosBucket— il nome del bucket S3

  • ScenariosTable— il nome della tabella degli scenari DynamoDB

Per le risorse non esposte come output dello stack (come la tabella della cronologia), utilizzale list-stack-resources prima dell'eliminazione per ottenere gli ID delle risorse fisiche. Questo comando elenca tutte le risorse dello stack indipendentemente dal fatto che abbia un output corrispondente.

Fase 2: Implementazione di un nuovo stack DLT

Implementa un nuovo stack DLT utilizzando la stessa versione del CloudFormation modello (o più recente). Utilizza gli stessi parametri della distribuzione originale (impostazioni VPC, e-mail dell'amministratore, ecc.).

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

Attendi che lo stack CREATE_COMPLETE raggiunga lo stato.

Fase 3: Identifica le risorse del nuovo stack

Recupera i nomi delle risorse dagli output del nuovo stack.

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

Nota i valori per:

  • ScenariosBucket(nuovo nome del bucket)

  • ScenariosTable(nuovo nome della tabella)

Per qualsiasi risorsa non esposta come output dello stack (come la tabella della cronologia), usa list-stack-resources per trovarla in base al suo ID logico:

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

Questo comando elenca tutte le risorse gestite dallo stack. È possibile filtrare in base alla sottostringa dell'ID logico per trovare qualsiasi risorsa.

Fase 4: Migrazione dei dati DynamoDB

Esporta i dati dalle tabelle conservate e importali nelle nuove tabelle. Utilizza le operazioni di esportazione dei dati o di scansione e scrittura in DynamoDB.

Opzione A: utilizzo di Export/Import DynamoDB (consigliato per set di dati di grandi dimensioni)

Per le tabelle con migliaia di elementi, utilizza un'esportazione DynamoDB in S3 seguita da un'importazione:

# 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
Nota

L'import-tableAPI crea una nuova tabella. Poiché il nuovo stack ha già creato la tabella di destinazione, utilizzate invece l'opzione B oppure eliminate prima la nuova tabella vuota e ricreatela tramite import (ciò causerà la deriva dello stack, vedi l'avviso di seguito).

Opzione B: scansione e (scelta consigliata) BatchWrite

Questo approccio legge direttamente dalle tabelle conservate e scrive nelle tabelle del nuovo stack senza causare variazioni dello stack. Richiede Python 3 e la boto3 libreria.

# 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>")

Per tabelle di grandi dimensioni (decine di migliaia di articoli), prendi in considerazione l'utilizzo di segmenti di scansione parallela per accelerare la fase di lettura.

Opzione C: ripristino da PITR (se entro una finestra di 35 giorni)

Se lo stack è stato eliminato negli ultimi 35 giorni e PITR è stato abilitato (per impostazione predefinita), puoi ripristinare la tabella a un determinato punto nel tempo. Tuttavia, i ripristini PITR creano una nuova tabella con un nome diverso, quindi è comunque necessario copiare i dati nella tabella gestita dallo stack utilizzando l'opzione B.

# 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

Fase 5: Migrazione dei dati S3

Copia gli script di test e i file dei risultati dal bucket mantenuto al bucket del nuovo stack.

# 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>

Questo copia:

  • Script di test (file JMeter, script K6, .jmx file Locust, archivi ZIP)

  • File XML dei risultati del test organizzati per ID e regione del test

  • Risorse e plugin del framework JMeter

Fase 6: Verifica della migrazione

  1. Accedi alla console web DLT utilizzando l'URL del nuovo stack (che si trova nell'output dello WebConsole stack).

  2. Verifica che tutti gli scenari di test compaiano nell'elenco degli scenari.

  3. Apri singoli scenari e verifica che la cronologia dei test eseguiti sia visibile.

  4. Verifica che gli script di test siano scaricabili dalla pagina dei dettagli dello scenario.

  5. Esegui un piccolo test per verificare la funzionalità end-to-end con il nuovo stack.

Fase 7: Pulisci le risorse conservate

Dopo aver verificato che tutti i dati siano stati migrati correttamente, elimina le vecchie risorse conservate per evitare costi di storage continui.

# 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>

Esegui questo passaggio solo dopo aver verificato che il nuovo stack sia completamente operativo con tutti i dati storici intatti.

Evitare la deriva dello stack

La deriva dello stack si verifica quando lo stato effettivo di una risorsa è diverso da quello previsto. CloudFormation Per evitare la deriva durante questo processo di ripristino:

  • NON rinominate o modificate direttamente le tabelle DynamoDB o i bucket S3 del nuovo stack.

  • NON utilizzare import-table per sostituire le tabelle del nuovo stack (ciò richiederebbe prima l'eliminazione della tabella). CloudFormation-managed

  • NON modificate le policy IAM, le policy dei bucket o le impostazioni delle tabelle al di fuori di. CloudFormation

  • Utilizza solo operazioni a livello di dati:PutItem,,,BatchWriteItem. s3 sync s3 cp

  • SCRIVI i dati nelle tabelle e nei bucket che hai creato. CloudFormation L'aggiunta di elementi a una tabella DynamoDB o di oggetti a un bucket S3 non costituisce deriva.

La scrittura di dati in CloudFormation-managed tabelle e bucket è sicura perché CloudFormation tiene traccia della configurazione delle risorse (schema della tabella, modalità di fatturazione, impostazioni di crittografia), non del contenuto dei dati.

Cosa non può essere recuperato

Quanto segue viene perso quando si elimina uno stack e non può essere ripristinato tramite questo processo:

Elemento Motivo

Account utente Cognito

Il pool di utenti viene eliminato con lo stack. Gli utenti devono registrarsi nuovamente.

Pianificazioni attive EventBridge

Le regole di test programmate vengono eliminate. Ricrea le pianificazioni manualmente nell'interfaccia utente DLT.

CloudWatch dashboard

Per-test i dashboard (EcsLoadTesting*) vengono eliminati. Le nuove esecuzioni creeranno nuove dashboard.

UUID della soluzione

Viene generato un nuovo UUID casuale. Ciò influisce solo sulla correlazione delle metriche operative.

Associazioni di stack regionali

Gli stack regionali devono essere ridistribuiti e riassociati al nuovo stack di hub.

Misure preventive

Per semplificare gli scenari di ripristino futuri:

  1. Registra gli output dello stack prima di qualsiasi eliminazione. Salva i nomi delle ScenariosBucket tabelle e della cronologia. ScenariosTable

  2. Abilita DynamoDB PITR (abilitato di default in DLT). Verifica che rimanga attivo.

  3. Abilita il controllo delle versioni S3 (abilitato per impostazione predefinita nel bucket degli scenari). Ciò protegge dall'eliminazione accidentale degli oggetti.

  4. Valuta la possibilità di abilitare la protezione da eliminazione di DynamoDB negli scenari e nelle tabelle della cronologia come protezione aggiuntiva:

    aws dynamodb update-table \ --table-name <scenarios-table> \ --deletion-protection-enabled
  5. Usa AWS Backup per creare backup pianificati delle tabelle DynamoDB per la conservazione a lungo termine oltre la finestra PITR di 35 giorni.