Salin tabel Amazon DynamoDB di seluruh akun menggunakan implementasi kustom - AWS Prescriptive Guidance

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

Salin tabel Amazon DynamoDB di seluruh akun menggunakan implementasi kustom

Ramkumar Ramanujam, Amazon Web Services

Ringkasan

Saat bekerja dengan Amazon DynamoDB di Amazon Web Services (AWS), kasus penggunaan umum adalah menyalin atau menyinkronkan tabel DynamoDB dalam lingkungan pengembangan, pengujian, atau pementasan dengan data tabel yang ada di lingkungan produksi. Sebagai praktik standar, setiap lingkungan menggunakan akun AWS yang berbeda.

DynamoDB sekarang mendukung pencadangan lintas akun menggunakan AWS Backup. Untuk informasi tentang biaya penyimpanan terkait saat menggunakan AWS Backup, lihat harga AWS Backup. Saat Anda menggunakan AWS Backup untuk menyalin seluruh akun, akun sumber dan target harus menjadi bagian dari organisasi AWS Organizations. Ada solusi lain untuk pencadangan dan pemulihan lintas akun menggunakan layanan AWS seperti AWS Glue. Namun, menggunakan solusi tersebut meningkatkan jejak aplikasi, karena ada lebih banyak layanan AWS untuk diterapkan dan dipelihara. 

Anda juga dapat menggunakan Amazon DynamoDB Streams untuk menangkap perubahan tabel di akun sumber. Kemudian Anda dapat memulai fungsi AWS Lambda, dan membuat perubahan yang sesuai pada tabel target di akun target. Tetapi solusi itu berlaku untuk kasus penggunaan di mana tabel sumber dan target harus selalu disinkronkan. Ini mungkin tidak berlaku untuk pengembangan, pengujian, dan lingkungan pementasan di mana data sering diperbarui.

Pola ini menyediakan langkah-langkah untuk menerapkan solusi khusus untuk menyalin tabel Amazon DynamoDB dari satu akun ke akun lainnya. Pola ini dapat diimplementasikan menggunakan bahasa pemrograman umum seperti C #, Java, dan Python. Sebaiknya gunakan bahasa yang didukung oleh AWS SDK.

Prasyarat dan batasan

Prasyarat

  • Dua akun AWS aktif

  • Tabel DynamoDB di kedua akun

  • Pengetahuan tentang peran dan kebijakan AWS Identity and Access Management (IAM)

  • Pengetahuan tentang cara mengakses tabel Amazon DynamoDB menggunakan bahasa pemrograman umum, seperti C #, Java, atau Python

Batasan

Pola ini berlaku untuk tabel DynamoDB yang berukuran sekitar 2 GB atau lebih kecil. Dengan logika tambahan untuk menangani koneksi atau interupsi sesi, pelambatan, dan kegagalan dan percobaan ulang, ini dapat digunakan untuk tabel yang lebih besar.

Operasi pemindaian DynamoDB, yang membaca item dari tabel sumber, hanya dapat mengambil hingga 1 MB data dalam satu panggilan. Untuk tabel yang lebih besar, lebih besar dari 2 GB, batasan ini dapat meningkatkan total waktu untuk melakukan salinan tabel lengkap.

Arsitektur

Diagram berikut menunjukkan implementasi kustom antara sumber dan target akun AWS. Kebijakan IAM dan token keamanan digunakan dengan implementasi khusus. Data dibaca dari Amazon DynamoDB di akun sumber dan ditulis ke DynamoDB di akun target.

Arsitektur akun sumber dan target untuk menyalin dengan menggunakan implementasi kustom.

Otomatisasi dan skala

Pola ini berlaku untuk tabel DynamoDB yang ukurannya lebih kecil, sekitar 2 GB. 

Untuk menerapkan pola ini untuk tabel yang lebih besar, atasi masalah berikut:

  • Selama operasi penyalinan tabel, dua sesi aktif dipertahankan, menggunakan token keamanan yang berbeda. Jika operasi penyalinan tabel memakan waktu lebih lama dari waktu kedaluwarsa token, Anda harus menerapkan logika untuk menyegarkan token keamanan. 

  • Jika unit kapasitas baca (RCUs) dan unit kapasitas tulis (WCUs) tidak disediakan, pembacaan atau penulisan pada tabel sumber atau target mungkin terhambat. Pastikan untuk menangkap dan menangani pengecualian ini. 

  • Tangani kegagalan atau pengecualian lain dan letakkan mekanisme coba lagi untuk mencoba lagi atau melanjutkan dari tempat operasi penyalinan gagal.

Alat

Alat

  • Amazon DynamoDB - Amazon DynamoDB adalah layanan database NoSQL yang dikelola sepenuhnya yang memberikan kinerja yang cepat dan dapat diprediksi dengan skalabilitas yang mulus. 

  • Alat tambahan yang diperlukan akan berbeda berdasarkan bahasa pemrograman yang Anda pilih untuk implementasi. Misalnya, jika Anda menggunakan C #, Anda memerlukan Microsoft Visual Studio dan NuGet paket-paket berikut:

    • AWSSDK

    • AWSSDK.DynamoDBv2

Kode

Cuplikan kode Python berikut menghapus dan membuat ulang tabel DynamoDB menggunakan perpustakaan Boto3.

Jangan gunakan AWS_ACCESS_KEY_ID dan AWS_SECRET_ACCESS_KEY pengguna IAM karena ini adalah kredensil jangka panjang, yang harus dihindari untuk akses terprogram ke layanan AWS. Untuk informasi selengkapnya tentang kredensil sementara, lihat bagian Praktik terbaik.

Cuplikan kode berikut AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY,, dan TEMPORARY_SESSION_TOKEN digunakan dalam cuplikan kode berikut adalah kredensil sementara yang diambil dari AWS Security Token Service (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.')

Praktik terbaik

Kredensial sementara

Sebagai praktik keamanan terbaik, saat mengakses layanan AWS secara terprogram, hindari menggunakan AWS_ACCESS_KEY_ID dan AWS_SECRET_ACCESS_KEY pengguna IAM karena ini adalah kredensil jangka panjang. Selalu coba gunakan kredensil sementara untuk mengakses layanan AWS secara terprogram.

Sebagai contoh, pengembang hardcode AWS_ACCESS_KEY_ID dan AWS_SECRET_ACCESS_KEY pengguna IAM dalam aplikasi selama pengembangan tetapi gagal menghapus nilai hardcode sebelum mendorong perubahan ke repositori kode. Kredensi yang terbuka ini dapat digunakan oleh pengguna yang tidak diinginkan atau jahat, yang dapat memiliki implikasi serius (terutama jika kredensil yang terekspos memiliki hak istimewa admin). Kredensi yang terbuka ini harus segera dinonaktifkan atau dihapus dengan menggunakan konsol IAM atau AWS Command Line Interface (AWS CLI).

Untuk mendapatkan kredensi sementara untuk akses terprogram ke layanan AWS, gunakan AWS STS. Kredensi sementara hanya berlaku untuk waktu yang ditentukan (dari 15 menit hingga 36 jam). Durasi maksimum yang diizinkan untuk kredensil sementara bervariasi tergantung pada faktor-faktor seperti pengaturan peran dan rantai peran. Untuk informasi selengkapnya tentang AWS STS, lihat dokumentasinya.

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Buat tabel DynamoDB.

Buat tabel DynamoDB, dengan indeks, di akun AWS sumber dan target.

Tetapkan penyediaan kapasitas sebagai mode sesuai permintaan, yang memungkinkan DynamoDB untuk read/write menskalakan kapasitas secara dinamis berdasarkan beban kerja. 

Atau, Anda dapat menggunakan kapasitas yang disediakan dengan 4000 RCUs dan 4000. WCUs

Pengembang aplikasi, DBA, insinyur Migrasi

Isi tabel sumber.

Isi tabel DynamoDB di akun sumber dengan data uji. Memiliki setidaknya 50 MB atau lebih data pengujian membantu Anda melihat puncak dan rata-rata yang RCUs dikonsumsi selama penyalinan tabel. Anda kemudian dapat mengubah penyediaan kapasitas sesuai kebutuhan.

Pengembang aplikasi, DBA, insinyur Migrasi
TugasDeskripsiKeterampilan yang dibutuhkan

Buat peran IAM untuk mengakses sumber dan target tabel DynamoDB.

Buat peran IAM di akun sumber dengan izin untuk mengakses (baca) tabel DynamoDB di akun sumber.

Tambahkan akun sumber sebagai entitas tepercaya untuk peran ini.

Buat peran IAM di akun target dengan izin untuk mengakses (membuat, membaca, memperbarui, menghapus) tabel DynamoDB di akun target.  

Tambahkan akun target sebagai entitas tepercaya untuk peran ini.

Pengembang aplikasi, AWS DevOps
TugasDeskripsiKeterampilan yang dibutuhkan

Dapatkan kredensi sementara untuk peran IAM.

Dapatkan kredensi sementara untuk peran IAM yang dibuat di akun sumber.

Dapatkan kredensi sementara untuk peran IAM yang dibuat di akun target.

Salah satu cara untuk mendapatkan kredensil sementara untuk peran IAM adalah dengan menggunakan AWS STS dari AWS CLI.

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

Gunakan profil AWS yang sesuai (sesuai dengan sumber atau akun target).

Untuk informasi selengkapnya tentang berbagai cara untuk mendapatkan kredensil sementara, lihat berikut ini:

Pengembang aplikasi, insinyur Migrasi

Inisialisasi klien DynamoDB untuk sumber dan target akses DynamoDB.

Inisialisasi klien DynamoDB, yang disediakan oleh AWS SDK, untuk tabel DynamoDB sumber dan target.

  • Untuk klien DynamoDB sumber, gunakan kredenal sementara yang diambil dari akun sumber.

  • Untuk klien DynamoDB target, gunakan kredenal sementara yang diambil dari akun target.

Untuk informasi selengkapnya tentang membuat permintaan dengan menggunakan kredensil sementara IAM, lihat dokumentasi AWS.

Pengembang aplikasi

Jatuhkan dan buat ulang tabel target.

Hapus dan buat ulang tabel DynamoDB target (bersama dengan indeks) di akun target, menggunakan klien DynamoDB akun target.

Menghapus semua catatan dari tabel DynamoDB adalah operasi yang mahal karena mengkonsumsi provisioned. WCUs Menghapus dan membuat ulang tabel menghindari biaya tambahan tersebut.

Anda dapat menambahkan indeks ke tabel setelah Anda membuatnya, tetapi ini membutuhkan waktu 2-5 menit lebih lama. Membuat indeks selama pembuatan tabel, dengan meneruskan koleksi indeks ke createTable panggilan, lebih efisien.

Pengembang aplikasi

Lakukan salinan tabel.

Ulangi langkah-langkah berikut hingga semua data disalin:

  • Lakukan pemindaian pada tabel di akun sumber, menggunakan klien DynamoDB sumber. Setiap pemindaian DynamoDB hanya mengambil 1 MB data dari tabel, jadi Anda harus mengulangi operasi ini sampai semua item, atau catatan, dibaca.

  • Untuk setiap set item yang dipindai, tulis item ke tabel di akun target, dengan klien DynamoDB target, menggunakan BatchWriteItem panggilan di AWS SDK untuk DynamoDB. Ini mengurangi jumlah PutItem permintaan yang dibuat ke DynamoDB. 

  • BatchWriteItemmemiliki batasan 25 menulis atau menempatkan, atau hingga 16 MB. Anda harus menambahkan logika untuk mengakumulasi item yang dipindai dalam hitungan 25 sebelum menelepon. BatchWriteItem BatchWriteItemmengembalikan daftar item yang tidak berhasil disalin. Menggunakan daftar ini, tambahkan logika coba lagi untuk melakukan BatchWriteItem panggilan lain hanya dengan item yang tidak berhasil.

Untuk informasi selengkapnya, lihat implementasi referensi di C # (untuk menjatuhkan, membuat, dan mengisi tabel) di bagian Lampiran. Contoh tabel konfigurasi JavaScript Object Notation (JSON) file juga dilampirkan.

Pengembang aplikasi

Sumber daya terkait

Informasi tambahan

Pola ini diimplementasikan menggunakan C# untuk menyalin tabel DynamoDB dengan 200.000 item (ukuran item rata-rata 5 KB dan ukuran tabel 250 MB). Tabel DynamoDB target disiapkan dengan kapasitas yang disediakan 4000 dan 4000. RCUs WCUs

Operasi penyalinan tabel lengkap (dari akun sumber ke akun target), termasuk menjatuhkan dan membuat ulang tabel, membutuhkan waktu 5 menit. Total unit kapasitas yang dikonsumsi: 30.000 RCUs dan sekitar WCUs 400.000.

Untuk informasi selengkapnya tentang mode kapasitas DynamoDB, lihat Mode kapasitas Baca/Tulis dalam dokumentasi AWS.

Lampiran

Untuk mengakses konten tambahan yang terkait dengan dokumen ini, unzip file berikut: attachment.zip