

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
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation"></a>

*Ramkumar Ramanujam, Amazon Web Services*

## Ringkasan
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-summary"></a>

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](https://aws.amazon.com/backup/pricing/). 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](https://aws.amazon.com/tools/).

## Prasyarat dan batasan
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-prereqs"></a>

**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
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-architecture"></a>

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.](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/ba8175be-9809-4c2e-b2d1-6b9180ed056c/images/d9d4c2c8-ff04-443f-9137-e37b8e23ccb5.png)


 

**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
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-tools"></a>

**Alat**
+ [Amazon DynamoDB - Amazon](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 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_ID``AWS_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
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-best-practices"></a>

**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](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html).

## Epik
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-epics"></a>

### Siapkan tabel DynamoDB
<a name="set-up-dynamodb-tables"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat tabel DynamoDB. | Buat tabel DynamoDB, dengan indeks, di akun AWS sumber dan target.<br />Tetapkan penyediaan kapasitas sebagai mode sesuai permintaan, yang memungkinkan DynamoDB untuk read/write menskalakan kapasitas secara dinamis berdasarkan beban kerja. <br />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 | 

### Siapkan kredensil untuk mengakses tabel DynamoDB
<a name="set-up-credentials-to-access-the-dynamodb-tables"></a>


| Tugas | Deskripsi | Keterampilan 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.<br />Tambahkan akun sumber sebagai entitas tepercaya untuk peran ini.<br />Buat peran IAM di akun target dengan izin untuk mengakses (membuat, membaca, memperbarui, menghapus) tabel DynamoDB di akun target.  <br />Tambahkan akun target sebagai entitas tepercaya untuk peran ini. | Pengembang aplikasi, AWS DevOps | 

### Salin data tabel dari satu akun ke akun lainnya
<a name="copy-table-data-from-one-account-to-another"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Dapatkan kredensi sementara untuk peran IAM. | Dapatkan kredensi sementara untuk peran IAM yang dibuat di akun sumber.<br />Dapatkan kredensi sementara untuk peran IAM yang dibuat di akun target.<br />Salah satu cara untuk mendapatkan kredensil sementara untuk peran IAM adalah dengan menggunakan AWS STS dari AWS CLI.<pre>aws sts assume-role --role-arn arn:aws:iam::<account-id>:role/<role-name> --role-session-name <session-name> --profile <profile-name></pre><br />Gunakan profil AWS yang sesuai (sesuai dengan sumber atau akun target).<br />Untuk informasi selengkapnya tentang berbagai cara untuk mendapatkan kredensil sementara, lihat berikut ini:[See the AWS documentation website for more details](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation.html) | 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.[See the AWS documentation website for more details](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation.html)<br />[Untuk informasi selengkapnya tentang membuat permintaan dengan menggunakan kredensil sementara IAM, lihat dokumentasi AWS.](https://docs.aws.amazon.com/AmazonS3/latest/userguide/AuthUsingTempSessionToken.html) | 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.<br />Menghapus semua catatan dari tabel DynamoDB adalah operasi yang mahal karena mengkonsumsi provisioned. WCUs Menghapus dan membuat ulang tabel menghindari biaya tambahan tersebut.<br />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:[See the AWS documentation website for more details](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation.html)<br />*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
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-resources"></a>
+ [Dokumentasi Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)
+ [Membuat pengguna IAM di akun AWS Anda](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)
+ [AWS SDKs](https://aws.amazon.com/tools/)
+ [Menggunakan kredensil sementara dengan sumber daya AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)

## Informasi tambahan
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-additional"></a>

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](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html).

## Lampiran
<a name="attachments-ba8175be-9809-4c2e-b2d1-6b9180ed056c"></a>

[Untuk mengakses konten tambahan yang terkait dengan dokumen ini, unzip file berikut: attachment.zip](samples/p-attach/ba8175be-9809-4c2e-b2d1-6b9180ed056c/attachments/attachment.zip)