View a markdown version of this page

Memulihkan data DLT setelah penghapusan tumpukan - Pengujian Beban Terdistribusi di AWS

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Memulihkan data DLT setelah penghapusan tumpukan

Bagian ini menjelaskan cara mengembalikan skenario pengujian dan menjalankan riwayat ke tumpukan DLT baru setelah tumpukan asli dihapus. Ini berlaku ketika bucket S3 pelanggan dan tabel DynamoDB dipertahankan (perilaku default) dan pelanggan ingin menghubungkannya kembali ke penerapan baru.

Latar Belakang

Saat tumpukan DLT dihapus, sumber daya berikut disimpan di akun AWS pelanggan karena kebijakan perlindungan data:

Sumber daya Contains Penamaan

Skenario ember S3

Skrip pengujian (JMeter/K6/Locust), file XHTML hasil per tugas, aset kerangka kerja JMeter

Auto-generated (misalnya,dltstack-scenariosbucket-abc123)

Log ember S3

Log akses S3 untuk semua bucket DLT

Auto-generated

Konsol S3 bucket

Aset statis UI Web

Auto-generated

Skenario tabel DynamoDB

Definisi pengujian, konfigurasi, aturan penjadwalan

Auto-generated (misalnya,DLTStack-ScenariosTable-xyz789)

Riwayat tabel DynamoDB

Hasil uji coba, durasi, tingkat keberhasilan

Auto-generated (misalnya,DLTStack-HistoryTable-xyz789)

CloudWatch grup log

Log eksekusi Lambda dan ECS (retensi 10 tahun)

Dinamakan oleh fungsi

Semua nama sumber daya dibuat secara otomatis oleh CloudFormation. Mereka tidak dapat diprediksi dan tidak dapat ditentukan sebagai parameter saat menerapkan tumpukan baru.

Kendala penting

  1. CloudFormation Template DLT tidak menerima parameter untuk tabel DynamoDB atau bucket S3 yang ada. Penerapan baru selalu menciptakan sumber daya baru.

  2. Memodifikasi CloudFormation-managed sumber daya secara langsung di luar tumpukan menyebabkan penyimpangan tumpukan. Semua migrasi data harus terjadi pada tingkat data, bukan tingkat infrastruktur.

  3. Solusi UUID dihasilkan secara acak pada setiap penerapan baru. Tumpukan baru akan memiliki UUID yang berbeda dari aslinya.

  4. Tabel DynamoDB Point-in-Time memiliki Pemulihan (PITR) diaktifkan secara default, menyediakan pencadangan berkelanjutan selama 35 hari terakhir.

Proses pemulihan

Langkah 1: Identifikasi sumber daya yang tertahan

Sebelum menerapkan tumpukan baru, cari sumber daya yang disimpan dari tumpukan yang dihapus.

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

Jika Anda mencatat output CloudFormation tumpukan sebelum penghapusan, gunakan nama persis tersebut. Output yang relevan adalah:

  • ScenariosBucket— nama ember S3

  • ScenariosTable— nama tabel skenario DynamoDB

Untuk sumber daya yang tidak diekspos sebagai output tumpukan (seperti tabel riwayat), gunakan list-stack-resources sebelum penghapusan untuk mendapatkan ID sumber daya fisik. Perintah ini mencantumkan setiap sumber daya dalam tumpukan terlepas dari apakah ia memiliki output yang sesuai.

Langkah 2: Menyebarkan tumpukan DLT baru

Terapkan tumpukan DLT baru menggunakan versi CloudFormation template yang sama (atau yang lebih baru). Gunakan parameter yang sama dengan penerapan asli (pengaturan VPC, email admin, dll.).

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

Tunggu tumpukan mencapai CREATE_COMPLETE status.

Langkah 3: Identifikasi sumber daya tumpukan baru

Ambil nama sumber daya dari output tumpukan baru.

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

Perhatikan nilai untuk:

  • ScenariosBucket(nama ember baru)

  • ScenariosTable(nama tabel baru)

Untuk sumber daya apa pun yang tidak diekspos sebagai output tumpukan (seperti tabel riwayat), gunakan list-stack-resources untuk menemukannya dengan ID logisnya:

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

Perintah ini mencantumkan setiap sumber daya yang dikelola tumpukan. Anda dapat memfilter dengan substring ID logis untuk menemukan sumber daya apa pun.

Langkah 4: Migrasikan data DynamoDB

Ekspor data dari tabel yang dipertahankan dan impor ke tabel baru. Gunakan operasi ekspor data DynamoDB atau pindai dan tulis.

Opsi A: Menggunakan Export/Import DynamoDB (direkomendasikan untuk kumpulan data besar)

Untuk tabel dengan ribuan item, gunakan ekspor DynamoDB ke S3 diikuti dengan impor:

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

import-tableAPI membuat tabel baru. Karena tumpukan baru sudah membuat tabel target, gunakan Opsi B sebagai gantinya, atau hapus tabel kosong baru terlebih dahulu dan buat ulang melalui impor (ini akan menyebabkan tumpukan melayang, lihat peringatan di bawah).

Opsi B: Pindai dan BatchWrite (disarankan)

Pendekatan ini membaca langsung dari tabel yang dipertahankan dan menulis ke tabel tumpukan baru tanpa menyebabkan penyimpangan tumpukan. Ini membutuhkan Python 3 dan perpustakaan. boto3

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

Untuk tabel besar (puluhan ribu item), pertimbangkan untuk menggunakan segmen pemindaian paralel untuk mempercepat fase baca.

Opsi C: Pulihkan dari PITR (jika dalam jendela 35 hari)

Jika tumpukan dihapus dalam 35 hari terakhir dan PITR diaktifkan (secara default), Anda dapat mengembalikan tabel ke titik waktu. Namun, PITR mengembalikan buat tabel baru dengan nama yang berbeda, jadi Anda masih perlu menyalin data ke tabel yang dikelola tumpukan menggunakan Opsi 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

Langkah 5: Migrasikan data S3

Salin skrip pengujian dan file hasil dari bucket yang disimpan ke bucket tumpukan baru.

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

Salinan ini:

  • Skrip uji (file JMeter, skrip K6, .jmx file Locust, arsip ZIP)

  • Hasil pengujian file XHTML yang diatur oleh ID uji dan wilayah

  • Aset dan plugin kerangka kerja JMeter

Langkah 6: Verifikasi migrasi

  1. Masuk ke konsol web DLT menggunakan URL tumpukan baru (ditemukan di output WebConsole tumpukan).

  2. Konfirmasikan bahwa semua skenario pengujian muncul dalam daftar skenario.

  3. Buka skenario individual dan verifikasi bahwa riwayat uji coba terlihat.

  4. Konfirmasikan bahwa skrip pengujian dapat diunduh dari halaman detail skenario.

  5. Jalankan tes kecil untuk memverifikasi fungsionalitas ujung ke ujung dengan tumpukan baru.

Langkah 7: Bersihkan sumber daya yang tertahan

Setelah memverifikasi bahwa semua data telah berhasil dimigrasi, hapus sumber daya lama yang disimpan untuk menghindari biaya penyimpanan yang berkelanjutan.

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

Hanya lakukan langkah ini setelah mengonfirmasi tumpukan baru beroperasi penuh dengan semua data historis utuh.

Menghindari tumpukan drift

Stack drift terjadi ketika keadaan sebenarnya dari sumber daya berbeda dari apa yang CloudFormation diharapkan. Untuk menghindari penyimpangan selama proses pemulihan ini:

  • JANGAN mengganti nama atau memodifikasi tabel DynamoDB tumpukan baru atau bucket S3 secara langsung.

  • JANGAN gunakan import-table untuk mengganti tabel tumpukan baru (ini akan membutuhkan penghapusan CloudFormation-managed tabel terlebih dahulu).

  • JANGAN mengubah kebijakan IAM, kebijakan bucket, atau pengaturan tabel di luar. CloudFormation

  • JANGAN gunakan operasi tingkat data saja:PutItem,,BatchWriteItem,s3 sync. s3 cp

  • Tuliskan data ke dalam tabel dan ember yang CloudFormation dibuat. Menambahkan item ke tabel DynamoDB atau objek ke bucket S3 bukan merupakan penyimpangan.

Menulis data ke dalam CloudFormation-managed tabel dan bucket aman karena CloudFormation melacak konfigurasi sumber daya (skema tabel, mode penagihan, pengaturan enkripsi), bukan konten data.

Apa yang tidak bisa dipulihkan

Berikut ini hilang ketika tumpukan dihapus dan tidak dapat dipulihkan melalui proses ini:

Item Alasan

Akun pengguna Cognito

Kumpulan pengguna dihapus dengan tumpukan. Pengguna harus mendaftar ulang.

EventBridge Jadwal aktif

Aturan pengujian terjadwal dihapus. Buat ulang jadwal secara manual di UI DLT.

CloudWatch dasbor

Per-test dashboard (EcsLoadTesting*) dihapus. Proses baru akan membuat dasbor baru.

Solusi UUID

UUID acak baru dihasilkan. Ini hanya mempengaruhi korelasi metrik operasional.

Asosiasi tumpukan regional

Tumpukan regional harus digunakan kembali dan dikaitkan kembali dengan tumpukan hub baru.

Tindakan pencegahan

Untuk menyederhanakan skenario pemulihan masa depan:

  1. Rekam output tumpukan sebelum penghapusan apa pun. Simpan nama tabel ScenariosBucketScenariosTable,, dan riwayat.

  2. Aktifkan DynamoDB PITR (diaktifkan secara default di DLT). Verifikasi itu tetap aktif.

  3. Aktifkan versi S3 (diaktifkan secara default pada bucket skenario). Ini melindungi terhadap penghapusan objek yang tidak disengaja.

  4. Pertimbangkan untuk mengaktifkan perlindungan penghapusan DynamoDB pada skenario dan tabel riwayat sebagai perlindungan tambahan:

    aws dynamodb update-table \ --table-name <scenarios-table> \ --deletion-protection-enabled
  5. Gunakan AWS Backup untuk membuat cadangan terjadwal tabel DynamoDB untuk retensi jangka panjang di luar jendela PITR 35 hari.