

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

# Secara otomatis mengarsipkan item ke Amazon S3 menggunakan DynamoDB TTL
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl"></a>

*Tabby Ward, Amazon Web Services*

## Ringkasan
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-summary"></a>

Pola ini menyediakan langkah-langkah untuk menghapus data lama dari tabel Amazon DynamoDB dan mengarsipkannya ke bucket Amazon Simple Storage Service (Amazon S3) di Amazon Web Services (AWS) tanpa harus mengelola armada server. 

Pola ini menggunakan Amazon DynamoDB Time to Live (TTL) untuk secara otomatis menghapus item lama dan Amazon DynamoDB Streams untuk menangkap item kedaluwarsa TTL. Kemudian menghubungkan DynamoDB Streams ke AWS Lambda, yang menjalankan kode tanpa menyediakan atau mengelola server apa pun. 

Saat item baru ditambahkan ke aliran DynamoDB, fungsi Lambda dimulai dan menulis data ke aliran pengiriman Amazon Data Firehose. Firehose menyediakan solusi sederhana dan terkelola sepenuhnya untuk memuat data sebagai arsip ke Amazon S3.

DynamoDB sering digunakan untuk menyimpan data time series, seperti data klik-aliran halaman web atau data Internet of Things (IoT) dari sensor dan perangkat yang terhubung. Daripada menghapus item yang jarang diakses, banyak pelanggan ingin mengarsipkannya untuk tujuan audit. TTL menyederhanakan pengarsipan ini dengan secara otomatis menghapus item berdasarkan atribut timestamp. 

Item yang dihapus oleh TTL dapat diidentifikasi di DynamoDB Streams, yang menangkap urutan modifikasi tingkat item yang diurutkan waktu dan menyimpan urutan dalam log hingga 24 jam. Data ini dapat dikonsumsi oleh fungsi Lambda dan diarsipkan dalam bucket Amazon S3 untuk mengurangi biaya penyimpanan. [Untuk mengurangi biaya lebih lanjut, [aturan siklus hidup Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html) dapat dibuat untuk mentransisikan data secara otomatis (segera setelah dibuat) ke kelas penyimpanan dengan biaya terendah.](https://aws.amazon.com/s3/storage-classes/)

## Prasyarat dan batasan
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-prereqs"></a>

**Prasyarat**
+ Akun AWS yang aktif.
+ [AWS Command Line Interface (AWS CLI) 1.7 atau](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html) yang lebih baru, diinstal dan dikonfigurasi di macOS, Linux, atau Windows.
+ [Python 3.7](https://www.python.org/downloads/release/python-370/) atau yang lebih baru.
+ [Boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html), diinstal dan dikonfigurasi. Jika Boto3 belum diinstal, jalankan `python -m pip install boto3` perintah untuk menginstalnya.

## Arsitektur
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-architecture"></a>

**Tumpukan teknologi**
+ Amazon DynamoDB
+ Amazon DynamoDB Streams
+ Amazon Data Firehose
+ AWS Lambda
+ Amazon S3

![\[Proses empat langkah dari DynamoDB ke bucket S3.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9dbc833f-cf3c-4574-8f09-d0b81134fe41/images/50d9da65-5398-4a99-bc8f-58afc80e9d7b.png)


1. Item dihapus oleh TTL.

1. Pemicu aliran DynamoDB memanggil fungsi prosesor aliran Lambda.

1. Fungsi Lambda menempatkan catatan dalam aliran pengiriman Firehose dalam format batch.

1. Catatan data diarsipkan dalam bucket S3.

## Alat
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-tools"></a>
+ [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) — AWS Command Line Interface (AWS CLI) Command Line Interface (AWS CLI) adalah alat terpadu untuk mengelola layanan AWS Anda.
+ [Amazon DynamoDB - Amazon](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) DynamoDB adalah database nilai kunci dan dokumen yang memberikan kinerja milidetik satu digit pada skala apa pun.
+ [Amazon DynamoDB Time to Live (TTL) -](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html) Amazon DynamoDB TTL membantu Anda menentukan stempel waktu per item untuk menentukan kapan item tidak lagi diperlukan.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Types_Amazon_DynamoDB_Streams.html) Streams - Amazon DynamoDB Streams menangkap urutan modifikasi tingkat item yang diurutkan waktu di tabel DynamoDB apa pun dan menyimpan informasi ini dalam log hingga 24 jam.
+ [Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html) — Amazon Data Firehose adalah cara termudah untuk memuat data streaming secara andal ke dalam data lake, penyimpanan data, dan layanan analitik.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) — AWS Lambda menjalankan kode tanpa perlu menyediakan atau mengelola server. Anda hanya membayar untuk waktu komputasi yang Anda konsumsi.
+ [Amazon S3 — Amazon Simple Storage](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html) Service (Amazon S3) Simple Storage Service (Amazon S3) adalah layanan penyimpanan objek yang menawarkan skalabilitas, ketersediaan data, keamanan, dan kinerja terdepan di industri.

**Kode**

Kode untuk pola ini tersedia di [item GitHub Arsip ke S3 menggunakan repositori DynamoDB TTL](https://github.com/aws-samples/automatically-archive-items-to-s3-using-dynamodb-ttl).

## Epik
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-epics"></a>

### Siapkan tabel DynamoDB, TTL, dan aliran DynamoDB
<a name="set-up-a-dynamodb-table-ttl-and-a-dynamodb-stream"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat tabel DynamoDB. | Gunakan AWS CLI untuk membuat tabel di DynamoDB yang disebut. `Reservation` Pilih unit kapasitas baca acak (RCU) dan unit kapasitas tulis (WCU), dan berikan tabel Anda dua atribut: `ReservationID` dan. `ReservationDate` <pre>aws dynamodb create-table \<br />--table-name Reservation \<br />--attribute-definitions AttributeName=ReservationID,AttributeType=S AttributeName=ReservationDate,AttributeType=N \<br />--key-schema AttributeName=ReservationID,KeyType=HASH AttributeName=ReservationDate,KeyType=RANGE \<br />--provisioned-throughput ReadCapacityUnits=100,WriteCapacityUnits=100 </pre>`ReservationDate`adalah stempel waktu epoch yang akan digunakan untuk menyalakan TTL. | Arsitek cloud, Pengembang aplikasi | 
| Nyalakan DynamoDB TTL. | Gunakan AWS CLI untuk mengaktifkan DynamoDB TTL untuk atribut. `ReservationDate`<pre>aws dynamodb update-time-to-live \<br />--table-name Reservation\<br />  --time-to-live-specification Enabled=true,AttributeName=ReservationDate</pre> | Arsitek cloud, Pengembang aplikasi | 
| Nyalakan aliran DynamoDB. | Gunakan AWS CLI untuk mengaktifkan aliran DynamoDB untuk `Reservation` tabel dengan menggunakan jenis aliran. `NEW_AND_OLD_IMAGES` <pre>aws dynamodb update-table \<br />--table-name Reservation \<br />  --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES</pre>Aliran ini akan berisi catatan untuk item baru, item yang diperbarui, item yang dihapus, dan item yang dihapus oleh TTL. Catatan untuk item yang dihapus oleh TTL berisi atribut metadata tambahan untuk membedakannya dari item yang dihapus secara manual. `userIdentity`Bidang untuk penghapusan TTL menunjukkan bahwa layanan DynamoDB melakukan tindakan penghapusan. Dalam pola ini, hanya item yang dihapus oleh TTL yang diarsipkan, tetapi Anda hanya dapat mengarsipkan catatan di mana `eventName` ada `REMOVE` dan `userIdentity` berisi `principalId` sama dengan. `dynamodb.amazonaws.com` | Arsitek cloud, Pengembang aplikasi | 

### Buat dan konfigurasikan bucket S3
<a name="create-and-configure-an-s3-bucket"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat ember S3. | Gunakan AWS CLI untuk membuat bucket S3 tujuan di Wilayah AWS Anda, ganti `us-east-1` dengan Region dan amzn-s3- demo-destination-bucket dengan nama bucket Anda. <pre>aws s3api create-bucket \<br />--bucket amzn-s3-demo-destination-bucket \<br />--region us-east-1</pre>Pastikan nama bucket S3 Anda unik secara global, karena namespace dibagikan oleh semua akun AWS. | Arsitek cloud, Pengembang aplikasi | 
| Buat kebijakan siklus hidup 30 hari untuk bucket S3. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/automatically-archive-items-to-amazon-s3-using-dynamodb-ttl.html) | Arsitek cloud, Pengembang aplikasi | 

### Membuat aliran pengiriman Firehose
<a name="create-a-akf-delivery-stream"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat dan konfigurasikan aliran pengiriman Firehose. | Unduh dan edit contoh `CreateFireHoseToS3.py` kode dari GitHub repositori. Kode ini ditulis dengan Python dan menunjukkan cara membuat aliran pengiriman Firehose dan peran AWS Identity and Access Management (IAM). Peran IAM akan memiliki kebijakan yang dapat digunakan oleh Firehose untuk menulis ke bucket S3 tujuan.Untuk menjalankan skrip, gunakan argumen perintah dan baris perintah berikut.Argumen 1=`<Your_S3_bucket_ARN>`, yang merupakan Amazon Resource Name (ARN) untuk bucket yang Anda buat sebelumnyaArgumen 2= Nama Firehose Anda (Pilot ini `firehose_to_s3_stream` menggunakan.)Argumen 3= Nama peran IAM Anda (Pilot ini menggunakan`firehose_to_s3`.)<pre>python CreateFireHoseToS3.py <Your_S3_Bucket_ARN> firehose_to_s3_stream firehose_to_s3</pre>Jika peran IAM yang ditentukan tidak ada, skrip akan membuat peran asumsi dengan kebijakan hubungan tepercaya, serta kebijakan yang memberikan izin Amazon S3 yang memadai. Untuk contoh kebijakan ini, lihat bagian *Informasi tambahan*. | Arsitek cloud, Pengembang aplikasi | 
| Verifikasi aliran pengiriman Firehose. | Jelaskan aliran pengiriman Firehose dengan menggunakan AWS CLI untuk memverifikasi bahwa aliran pengiriman berhasil dibuat.<pre>aws firehose describe-delivery-stream --delivery-stream-name firehose_to_s3_stream </pre> | Arsitek cloud, Pengembang aplikasi | 

### Buat fungsi Lambda untuk memproses aliran pengiriman Firehose
<a name="create-a-lambda-function-to-process-the-akf-delivery-stream"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat kebijakan kepercayaan untuk fungsi Lambda. | Buat file kebijakan kepercayaan dengan informasi berikut.<pre> {<br />     "Version": "2012-10-17",		 	 	 <br />     "Statement": [<br />      {<br />          "Effect": "Allow",<br />          "Principal": {<br />              "Service": "lambda.amazonaws.com"<br />           },<br />           "Action": "sts:AssumeRole"<br />      }<br />    ]<br />  } </pre>Ini memberi izin fungsi Anda untuk mengakses sumber daya AWS. | Arsitek cloud, Pengembang aplikasi | 
| Buat peran eksekusi untuk fungsi Lambda. | Untuk membuat peran eksekusi, jalankan kode berikut.<pre>aws iam create-role --role-name lambda-ex --assume-role-policy-document file://TrustPolicy.json</pre> | Arsitek cloud, Pengembang aplikasi | 
| Tambahkan izin ke peran. | Untuk menambahkan izin ke peran, gunakan `attach-policy-to-role` perintah.<pre>aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole<br />aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole<br />aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/AmazonKinesisFirehoseFullAccess<br />aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/IAMFullAccess </pre> | Arsitek cloud, Pengembang aplikasi | 
| Buat fungsi Lambda. | Kompres `LambdaStreamProcessor.py` file dari repositori kode dengan menjalankan perintah berikut.<pre>zip function.zip LambdaStreamProcessor.py</pre>Saat Anda membuat fungsi Lambda, Anda akan memerlukan peran eksekusi Lambda ARN. Untuk mendapatkan ARN, jalankan kode berikut.<pre>aws iam get-role \<br />--role-name lambda-ex </pre>Untuk membuat fungsi Lambda, jalankan kode berikut.<pre># Review the environment variables and replace them with your values.<br /><br />aws lambda create-function --function-name LambdaStreamProcessor \<br />--zip-file fileb://function.zip --handler LambdaStreamProcessor.handler --runtime python3.8 \<br />--role {Your Lamda Execution Role ARN}\<br />  --environment Variables="{firehose_name=firehose_to_s3_stream,bucket_arn = <Your_S3_bucket_ARN>,iam_role_name = firehose_to_s3, batch_size=400}"</pre> | Arsitek cloud, Pengembang aplikasi | 
| Konfigurasikan pemicu fungsi Lambda. | Gunakan AWS CLI untuk mengonfigurasi pemicu (DynamoDB Streams), yang memanggil fungsi Lambda. Ukuran batch 400 adalah untuk menghindari masalah konkurensi Lambda.<pre>aws lambda create-event-source-mapping --function-name LambdaStreamProcessor \<br />--batch-size 400 --starting-position LATEST \<br />--event-source-arn <Your Latest Stream ARN From DynamoDB Console></pre> | Arsitek cloud, Pengembang aplikasi | 

### Uji fungsionalitasnya
<a name="test-the-functionality"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Tambahkan item dengan cap waktu kedaluwarsa ke tabel Reservasi. | Untuk menguji fungsionalitas, tambahkan item dengan stempel waktu epoch kedaluwarsa ke tabel. `Reservation` TTL akan secara otomatis menghapus item berdasarkan stempel waktu. Fungsi Lambda dimulai pada aktivitas DynamoDB Stream, dan memfilter acara untuk mengidentifikasi aktivitas atau item yang dihapus. `REMOVE` Kemudian menempatkan catatan dalam aliran pengiriman Firehose dalam format batch.Aliran pengiriman Firehose mentransfer item ke bucket S3 tujuan dengan awalan. `firehosetos3example/year=current year/month=current month/ day=current day/hour=current hour/`Untuk mengoptimalkan pengambilan data, konfigurasikan Amazon S3 dengan `ErrorOutputPrefix` dan `Prefix` yang dirinci di *bagian Informasi tambahan*. | Arsitek awan  | 

### Bersihkan sumber daya
<a name="clean-up-the-resources"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Hapus semua sumber daya. | Hapus semua sumber daya untuk memastikan bahwa Anda tidak dikenakan biaya untuk layanan apa pun yang tidak Anda gunakan.   | Arsitek cloud, Pengembang aplikasi | 

## Sumber daya terkait
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-resources"></a>
+ [Mengelola siklus hidup penyimpanan](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html)
+ [Kelas Penyimpanan Amazon S3](https://aws.amazon.com/s3/storage-classes/)
+ [Dokumentasi AWS SDK untuk Python (Boto3)](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)

## Informasi tambahan
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-additional"></a>

**Membuat dan mengonfigurasi aliran pengiriman Firehose — Contoh kebijakan**

*Dokumen contoh kebijakan hubungan tepercaya Firehose*

```
firehose_assume_role = {
        'Version': '2012-10-17',
        'Statement': [
            {
                'Sid': '',
                'Effect': 'Allow',
                'Principal': {
                    'Service': 'firehose.amazonaws.com'
                },
                'Action': 'sts:AssumeRole'
            }
        ]
    }
```

*Contoh kebijakan izin S3*

```
s3_access = {
        "Version": "2012-10-17",		 	 	 
        "Statement": [
            {
                "Sid": "",
                "Effect": "Allow",
                "Action": [
                    "s3:AbortMultipartUpload",
                    "s3:GetBucketLocation",
                    "s3:GetObject",
                    "s3:ListBucket",
                    "s3:ListBucketMultipartUploads",
                    "s3:PutObject"
                ],
                "Resource": [
                    "{your s3_bucket ARN}/*",
                    "{Your s3 bucket ARN}"
                ]
            }
        ]
    }
```

**Uji fungsionalitas - konfigurasi Amazon S3**

Konfigurasi Amazon S3 dengan yang berikut ini `Prefix` dan `ErrorOutputPrefix` dipilih untuk mengoptimalkan pengambilan data. 

*prefix*

```
firehosetos3example/year=! {timestamp: yyyy}/month=! {timestamp:MM}/day=! {timestamp:dd}/hour=!{timestamp:HH}/
```

Firehose pertama kali membuat folder dasar yang disebut `firehosetos3example` langsung di bawah bucket S3. Kemudian mengevaluasi ekspresi`!{timestamp:yyyy}`,,`!{timestamp:MM}`, dan `!{timestamp:HH}` ke tahun`!{timestamp:dd}`, bulan, hari, dan jam menggunakan [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)format Java.

Misalnya, perkiraan timestamp kedatangan 1604683577 dalam waktu zaman Unix mengevaluasi,,, dan. `year=2020` `month=11` `day=06` `hour=05` Oleh karena itu, lokasi di Amazon S3, tempat catatan data dikirimkan, dievaluasi. `firehosetos3example/year=2020/month=11/day=06/hour=05/`

*ErrorOutputPrefix*

```
firehosetos3erroroutputbase/!{firehose:random-string}/!{firehose:error-output-type}/!{timestamp:yyyy/MM/dd}/
```

`ErrorOutputPrefix`Hasilnya dalam folder dasar yang dipanggil `firehosetos3erroroutputbase` langsung di bawah bucket S3. Ekspresi `!{firehose:random-string}` mengevaluasi ke string acak 11 karakter seperti. `ztWxkdg3Thg` Lokasi untuk objek Amazon S3 tempat catatan gagal dikirimkan dapat dievaluasi. `firehosetos3erroroutputbase/ztWxkdg3Thg/processing-failed/2020/11/06/`