

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

# Memantau Amazon Aurora dengan Aliran Aktivitas Basis Data
<a name="DBActivityStreams"></a><a name="das"></a>

Dengan menggunakan Aliran Aktivitas Basis Data, Anda dapat memantau aliran aktivitas basis data secara waktu nyaris nyata.

**Topics**
+ [Ikhtisar Aliran Aktivitas Basis Data](#DBActivityStreams.Overview)
+ [Prasyarat jaringan untuk aliran aktivitas basis data Aurora MySQL](DBActivityStreams.Prereqs.md)
+ [Memulai aliran aktivitas basis data](DBActivityStreams.Enabling.md)
+ [Mendapatkan status aliran aktivitas basis data](DBActivityStreams.Status.md)
+ [Menghentikan aliran aktivitas basis data](DBActivityStreams.Disabling.md)
+ [Memantau aliran aktivitas basis data](DBActivityStreams.Monitoring.md)
+ [Contoh kebijakan IAM untuk aliran aktivitas database](DBActivityStreams.ManagingAccess.md)

## Ikhtisar Aliran Aktivitas Basis Data
<a name="DBActivityStreams.Overview"></a>

Sebagai seorang administrator basis data Amazon Aurora, Anda perlu melindungi basis data Anda dan memenuhi persyaratan kepatuhan dan peraturan. Satu strateginya adalah mengintegrasikan aliran aktivitas basis data dengan alat pemantauan. 

Ancaman keamanan bersifat eksternal dan internal. Untuk melindungi terhadap ancaman internal, Anda dapat mengendalikan akses administrator ke aliran data dengan mengonfigurasikan fitur Aliran Aktivitas Basis Data. DBAs tidak memiliki akses ke pengumpulan, transmisi, penyimpanan, dan pemrosesan aliran.

**Contents**
+ [Cara kerja aliran aktivitas basis data](#DBActivityStreams.Overview.how-they-work)
+ [Mode asinkron dan sinkron untuk aliran aktivitas database](#DBActivityStreams.Overview.sync-mode)
+ [Persyaratan dan batasan untuk aliran aktivitas basis data](#DBActivityStreams.Overview.requirements)
+ [Wilayah dan ketersediaan versi](#DBActivityStreams.Overview.Availability)
+ [Kelas-kelas instans basis data yang didukung untuk aliran aktivitas basis data](#DBActivityStreams.Overview.requirements.classes)

### Cara kerja aliran aktivitas basis data
<a name="DBActivityStreams.Overview.how-they-work"></a>

Di Amazon Aurora, Anda memulai aliran aktivitas basis data di tingkat klaster. Semua instans basis data dalam klaster Anda mengaktifkan aliran aktivitas basis data.

Klaster basis data Aurora Anda mendorong aktivitas ke aliran data Amazon Kinesis dalam waktu nyaris nyata. Aliran Kinesis dibuat secara otomatis. Dari Kinesis, Anda dapat mengonfigurasi AWS layanan seperti Amazon Data Firehose dan AWS Lambda menggunakan aliran dan menyimpan data.

**penting**  
Penggunaan fitur aliran aktivitas basis data di Amazon RDS adalah gratis, tetapi Amazon Kinesis mengenakan biaya untuk aliran data. Lihat informasi yang lebih lengkap di [struktur harga Amazon Kinesis Data Streams](https://aws.amazon.com/kinesis/data-streams/pricing/).

Jika Anda menggunakan basis data global Aurora, mulai secara terpisah aliran aktivitas basis data pada setiap klaster basis data. Setiap klaster mengirimkan data audit ke aliran Kinesisnya sendiri dalam Wilayah AWS-nya sendiri. Aliran aktivitas tidak beroperasi secara berbeda selama failover. Aliran akan terus mengaudit basis data global Anda seperti biasa.

Anda dapat mengonfigurasikan aplikasi untuk pengelolaan kepatuhan agar menggunakan aliran aktivitas basis data. Untuk Aurora PostgreSQL, aplikasi kepatuhan mencakup IBM Security Guardium dan Audit dan Perlindungan Database Imperva. SecureSphere  Aplikasi-aplikasi ini dapat menggunakan aliran untuk menghasilkan peringatan dan aktivitas audit pada klaster basis data Aurora.

Grafik berikut menunjukkan cluster Aurora DB yang dikonfigurasi dengan Amazon Data Firehose.

![\[Diagram arsitektur yang menunjukkan aliran aktivitas database dari cluster Aurora DB yang dikonsumsi oleh Firehose\]](http://docs.aws.amazon.com/id_id/AmazonRDS/latest/AuroraUserGuide/images/aurora-das.png)


### Mode asinkron dan sinkron untuk aliran aktivitas database
<a name="DBActivityStreams.Overview.sync-mode"></a>

Anda dapat memilih agar sesi basis data menangani peristiwa aktivitas basis data dalam salah satu mode berikut:
+ **Mode asinkron** – Apabila sesi basis data menghasilkan peristiwa aliran aktivitas, sesi akan kembali dengan seketika ke aktivitas normal. Di latar belakang, peristiwa aliran aktivitas dijadikan catatan yang durabel. Jika kesalahan terjadi dalam tugas latar belakang, peristiwa RDS akan dikirim. Peristiwa ini menunjukkan awal dan akhir segala jendela waktu ketika catatan peristiwa aliran aktivitas mungkin telah hilang.

  Mode asinkron lebih memprioritaskan performa basis data daripada akurasi aliran aktivitas.
**catatan**  
 Mode asinkron tersedia untuk baik Aurora PostgreSQL maupun Aurora MySQL. 
+ **Mode sinkron** – Ketika sesi basis data menghasilkan peristiwa aliran aktivitas, sesi ini memblokir aktivitas-aktivitas lain sampai peristiwa itu dijadikan durabel. Jika peristiwa tidak dapat dijadikan durabel karena suatu alasan, sesi basis data akan kembali ke aktivitas normal. Namun, peristiwa RDS dikirim yang menunjukkan bahwa catatan aliran aktivitas mungkin hilang selama beberapa waktu. Peristiwa RDS kedua dikirim setelah sistem kembali berkondisi baik.

  Mode sinkron lebih memprioritaskan akurasi aliran aktivitas daripada performa basis data.
**catatan**  
 Mode sinkron tersedia untuk Aurora PostgreSQL. Anda tidak dapat menggunakan mode sinkron dengan Aurora MySQL. 

### Persyaratan dan batasan untuk aliran aktivitas basis data
<a name="DBActivityStreams.Overview.requirements"></a>

Dalam Aurora, aliran aktivitas basis data memiliki persyaratan dan batasan berikut:
+ Amazon Kinesis diharuskan untuk aliran aktivitas basis data.
+ AWS Key Management Service (AWS KMS) diperlukan untuk aliran aktivitas database karena selalu dienkripsi.
+ Menerapkan enkripsi tambahan ke aliran data Amazon Kinesis Anda tidak kompatibel dengan aliran aktivitas database, yang sudah dienkripsi dengan kunci Anda. AWS KMS 
+ Mulai aliran aktivitas basis data Anda di tingkat klaster basis data. Jika Anda menambahkan instans basis data ke klaster, Anda tidak perlu memulai aliran aktivitas pada instans: instans: aliran diaudit secara otomatis.
+ Di basis data global Aurora, pastikan untuk memulai secara terpisah aliran aktivitas pada setiap klaster basis data. Setiap klaster mengirimkan data audit ke aliran Kinesisnya sendiri dalam Wilayah AWS-nya sendiri.
+ Di Aurora PostgreSQL, pastikan untuk menghentikan aliran aktivitas database sebelum upgrade versi utama. Anda dapat memulai aliran aktivitas basis data setelah pemutakhiran selesai.

### Wilayah dan ketersediaan versi
<a name="DBActivityStreams.Overview.Availability"></a>

Ketersediaan fitur dan dukungan bervariasi di seluruh versi khusus dari setiap mesin basis data Aurora, dan di seluruh Wilayah AWS. Lihat informasi yang lebih lengkap tentang ketersediaan versi dan Wilayah dengan Aurora dan aliran aktivitas basis data di [Daerah yang Didukung dan mesin Aurora DB untuk aliran aktivitas database](Concepts.Aurora_Fea_Regions_DB-eng.Feature.DBActivityStreams.md). 

### Kelas-kelas instans basis data yang didukung untuk aliran aktivitas basis data
<a name="DBActivityStreams.Overview.requirements.classes"></a>

Untuk Aurora MySQL, Anda dapat menggunakan aliran aktivitas basis data dengan kelas-kelas instans basis data berikut:
+ db.r8g. \$1 besar
+ db.r7g.\$1large
+ db.r7i. \$1 besar
+ db.r6g.\$1large
+ db.r6i.\$1large
+ db.r5.\$1large
+ db.x2g.\$1

Untuk Aurora PostgreSQL, Anda dapat menggunakan aliran aktivitas basis data dengan kelas-kelas instans basis data berikut:
+ db.r8g. \$1 besar
+ db.r7i. \$1 besar
+ db.r7g.\$1large
+ db.r6g.\$1large
+ db.r6i.\$1large
+ db.r6id.\$1large
+ db.r5.\$1large
+ db.r4.\$1large
+ db.x2g.\$1

# Prasyarat jaringan untuk aliran aktivitas basis data Aurora MySQL
<a name="DBActivityStreams.Prereqs"></a>

Di bagian berikut, Anda dapat menemukan cara mengonfigurasikan cloud privat virtual (VPC) untuk digunakan dengan aliran aktivitas basis data.

**catatan**  
Prasyarat jaringan MySQL Aurora berlaku untuk versi mesin berikut:  
Aurora MySQL versi 2, hingga 2.11.3
Aurora MySQL versi 2.12.0
Aurora MySQL versi 3, hingga 3.04.2

**Topics**
+ [Prasyarat untuk titik akhir AWS KMS](#DBActivityStreams.Prereqs.KMS)
+ [Prasyarat untuk ketersediaan publik](#DBActivityStreams.Prereqs.Public)
+ [Prasyarat untuk ketersediaan privat](#DBActivityStreams.Prereqs.Private)

## Prasyarat untuk titik akhir AWS KMS
<a name="DBActivityStreams.Prereqs.KMS"></a>

Instance dalam klaster MySQL Aurora yang menggunakan aliran aktivitas harus dapat mengakses titik akhir. AWS KMS Pastikan bahwa persyaratan ini terpenuhi sebelum Anda mengaktifkan aliran aktivitas basis data untuk klaster Aurora MySQL. Jika klaster Aurora tersedia untuk umum, persyaratan ini terpenuhi secara otomatis.

**penting**  
Jika klaster DB MySQL Aurora tidak dapat mengakses titik AWS KMS akhir, aliran aktivitas akan berhenti. Dalam hal itu, Aurora memberi tahu Anda tentang masalah lewat Peristiwa RDS. 

## Prasyarat untuk ketersediaan publik
<a name="DBActivityStreams.Prereqs.Public"></a>

Agar menjadi publik, klaster basis data Aurora harus memenuhi persyaratan berikut:
+ **Dapat Diakses Publik** adalah **Ya** di halaman detail Konsol Manajemen AWS cluster.
+ Klaster basis data berada di subnet publik Amazon VPC. Lihat informasi yang lebih lengkap tentang instans basis data yang dapat diakses publik di [Menggunakan klaster DB di VPC](USER_VPC.WorkingWithRDSInstanceinaVPC.md). Lihat informasi yang lebih lengkap tentang subnet Amazon VPC publik di [VPC dan Subnet Anda](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html).

## Prasyarat untuk ketersediaan privat
<a name="DBActivityStreams.Prereqs.Private"></a>

Jika klaster Aurora basis data Anda berada di subnet publik VPC dan tidak dapat diakses publik, klaster itu bersifat privat. Untuk menjaga klaster tetap privat dan menggunakannya dengan aliran aktivitas basis data, Anda memiliki opsi-opsi berikut:
+ Konfigurasikan Network Address Translation (NAT) di VPC Anda. Lihat informasi yang lebih lengkap di [Gateway NAT](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html).
+ Buat AWS KMS titik akhir di VPC Anda. Opsi ini disarankan karena lebih mudah dikonfigurasikan.

**Untuk membuat AWS KMS titik akhir di VPC Anda**

1. Buka konsol Amazon VPC di [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/).

1. Di panel navigasi, pilih **Titik Akhir**.

1. Pilih **Buat Titik Akhir**.

   Halaman **Buat Titik Akhir** muncul.

1. Lakukan hal-hal berikut:
   + Dalam **Kategori layanan**, pilih **Layanan AWS **.
   + Di **Nama Layanan**, pilih **com.amazonaws. *region* .kms**, di mana *wilayah* adalah Wilayah AWS tempat cluster Anda berada.
   + Untuk **VPC**, pilih VPC tempat klaster Anda berada.

1. Pilih **Buat Titik Akhir**.

Lihat informasi yang lebih lengkap tentang cara mengonfigurasikan titik akhir VPC di [Titik Akhir VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html).

# Memulai aliran aktivitas basis data
<a name="DBActivityStreams.Enabling"></a>

Untuk memantau aktivitas basis data bagi semua instans dalam klaster basis data Aurora, mulai aliran aktivitas pada tingkat klaster. Setiap instans basis data yang Anda tambahkan ke klaster turut dipantau secara otomatis. Jika Anda menggunakan basis data global Aurora, mulai secara terpisah aliran aktivitas basis data pada setiap klaster basis data. Setiap klaster mengirimkan data audit ke aliran Kinesisnya sendiri dalam Wilayah AWS-nya sendiri.

Ketika Anda memulai aliran aktivitas , setiap peristiwa aktivitas basis data yang Anda konfigurasikan dalam kebijakan audit akan menghasilkan peristiwa aliran aktivitas. Perintah-perintah SQL seperti `CONNECT` dan `SELECT` menghasilkan peristiwa akses. Perintah-perintah SQL seperti `CREATE` dan `INSERT` menghasilkan peristiwa perubahan.

------
#### [ Console ]

**Untuk memulai aliran aktivitas basis data**

1. Buka konsol Amazon RDS di [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/).

1. Di panel navigasi, pilih **Basis data**.

1. Pilih klaster basis data tempat Anda ingin memulai aliran aktivitas. 

1. Untuk **Tindakan**, pilih **Mulai aliran aktivitas**. 

   *name*Jendela **Start database activity stream:** muncul, di *name* mana cluster DB Anda.

1. Masukkan setelan berikut:
   + Untuk **AWS KMS key**, pilih kunci dari daftar AWS KMS keys.
**catatan**  
 Jika klaster Aurora MySQL Anda tidak dapat mengakses kunci KMS, ikuti petunjuk dalam [Prasyarat jaringan untuk aliran aktivitas basis data Aurora MySQL](DBActivityStreams.Prereqs.md) untuk mengaktifkan dahulu akses itu. 

     Aurora menggunakan kunci KMS untuk mengenkripsi kunci yang pada gilirannya mengenkripsi aktivitas basis data. Pilih kunci KMS selain kunci default. Untuk informasi selengkapnya tentang kunci enkripsi dan AWS KMS, lihat [Apa itu AWS Key Management Service?](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) di *Panduan AWS Key Management Service Pengembang.*
   + Untuk **Mode aliran aktivitas basis data**, pilih **Asinkron** atau **Sinkron**.
**catatan**  
Pilihan ini hanya berlaku untuk Aurora PostgreSQL. Untuk Aurora MySQL, Anda hanya bisa menggunakan mode asinkron.
   + Pilih **Segera**.

     Bila Anda memilih **Segera**, klaster basis data memulai ulang dengan seketika. Jika Anda memilih **Selama jendela pemeliharaan berikutnya**, klaster basis data tidak seketika memulai ulang. Dalam hal ini, aliran aktivitas basis data tidak dimulai hingga jendela pemeliharaan berikutnya.

1. Pilih **Mulai aliran aktivitas basis data**.

   Status untuk klaster basis data menunjukkan bahwa aliran aktivitas dimulai.
**catatan**  
Jika Anda mendapatkan kesalahan `You can't start a database activity stream in this configuration`, periksa [Kelas-kelas instans basis data yang didukung untuk aliran aktivitas basis data](DBActivityStreams.md#DBActivityStreams.Overview.requirements.classes) untuk melihat apakah klaster basis data Anda menggunakan kelas instans yang didukung.

------
#### [ AWS CLI ]

Untuk memulai aliran aktivitas database untuk cluster DB , konfigurasikan DB cluster menggunakan [start-activity-stream](https://docs.aws.amazon.com/cli/latest/reference/rds/start-activity-stream.html) AWS CLI perintah.
+ `--resource-arn arn` – Menentukan Amazon Resource Name (ARN) klaster basis data.
+ `--mode sync-or-async` – Menentukan mode sinkron (`sync`) atau asinkron (`async`). Untuk Aurora PostgreSQL, Anda dapat memilih salah satu nilai. Untuk Aurora MySQL, pilih `async`. 
+ `--kms-key-id key` – Menentukan pengidentifikasi kunci KMS untuk mengenkripsi pesan dalam aliran aktivitas basis data. Pengidentifikasi kunci AWS KMS adalah kunci ARN, ID kunci, alias ARN, atau nama alias untuk. AWS KMS key

Contoh berikut memulai aliran aktivitas basis data untuk sebuah klaster basis data dalam mode asinkron.

Untuk Linux, macOS, atau Unix:

```
aws rds start-activity-stream \
    --mode async \
    --kms-key-id my-kms-key-arn \
    --resource-arn my-cluster-arn \
    --apply-immediately
```

Untuk Windows:

```
aws rds start-activity-stream ^
    --mode async ^
    --kms-key-id my-kms-key-arn ^
    --resource-arn my-cluster-arn ^
    --apply-immediately
```

------
#### [ Amazon RDS API ]

Untuk memulai aliran aktivitas database untuk , konfigurasikan cluster menggunakan [StartActivityStream](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_StartActivityStream.html)operasi.

Panggil tindakan dengan parameter-parameter di bawah:
+ `Region`
+ `KmsKeyId`
+ `ResourceArn`
+ `Mode`

------

**catatan**  
Jika Anda mendapatkan kesalahan yang menyatakan bahwa Anda tidak dapat memulai aliran aktivitas database dengan versi database Aurora PostgreSQL Anda saat ini, terapkan patch terbaru untuk Aurora PostgreSQL sebelum memulai aliran aktivitas database. Untuk informasi tentang meningkatkan database Aurora PostgreSQL Anda, lihat. [Meningkatkan kluster Amazon Aurora DB](Aurora.VersionPolicy.Upgrading.md)  
Berikut ini adalah versi patch minimum untuk memulai aliran aktivitas database dengan Aurora PostgreSQL.  
3.4.15 (11.9.15), 11.21.10
12.9.15, 12.15.9, 12.16.10, 12.17.7, 12.18.5, 12.19.4, 12.20.3, 12.22.3
13.9.12, 13.11.9, 13.12.10, 13.13.7, 13.14.5, 13.15.4, 13.16.3, 13.18.3
14.6.12, 14.8.9, 14.9.10, 14.10.7, 14.11.5, 14.12.4, 14.13.3, 14.15.3
15.3.9, 15.4.10, 15.5.7, 15.6.5, 15.7.4, 15.8.3, 15.10.3
16.1.7, 16.2.5, 16.3.4, 16.4.3, 16.6.3

# Mendapatkan status aliran aktivitas basis data
<a name="DBActivityStreams.Status"></a>

Anda bisa mendapatkan status aliran aktivitas menggunakan konsol atau AWS CLI.

## Konsol
<a name="DBActivityStreams.Status-collapsible-section-S1"></a>

**Untuk mendapatkan status aliran aktivitas basis data**

1. Buka konsol Amazon RDS di [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/).

1. Di panel navigasi, pilih **Basis data**, lalu pilih tautan klaster DB.

1. Pilih tab **Konfigurasi**, dan periksa **Aliran aktivitas basis data** untuk statusnya.

## AWS CLI
<a name="DBActivityStreams.Status-collapsible-section-S2"></a>

Anda bisa mendapatkan konfigurasi aliran aktivitas untuk klaster DB sebagai respons terhadap permintaan CLI [describe-db-clusters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html) .

Contoh berikut menjelaskan *my-cluster*.

```
aws rds --region my-region describe-db-clusters --db-cluster-identifier my-cluster
```

Contoh berikut menunjukkan respons JSON. Bidang-bidang berikut ditampilkan:
+ `ActivityStreamKinesisStreamName`
+ `ActivityStreamKmsKeyId`
+ `ActivityStreamStatus`
+ `ActivityStreamMode`
+ 

Bidang-bidang ini sama untuk Aurora PostgreSQL dan Aurora MySQL, kecuali bahwa `ActivityStreamMode` selalu `async` untuk Aurora MySQL, sedangkan untuk Aurora PostgreSQL mungkin `sync` atau `async`.

```
{
    "DBClusters": [
        {
      "DBClusterIdentifier": "my-cluster",
            ...
            "ActivityStreamKinesisStreamName": "aws-rds-das-cluster-A6TSYXITZCZXJHIRVFUBZ5LTWY",
            "ActivityStreamStatus": "starting",
            "ActivityStreamKmsKeyId": "12345678-abcd-efgh-ijkl-bd041f170262",
            "ActivityStreamMode": "async",
            "DbClusterResourceId": "cluster-ABCD123456"
            ...
        }
    ]
}
```

## API RDS
<a name="DBActivityStreams.Status-collapsible-section-S3"></a>

Anda bisa mendapatkan konfigurasi aliran aktivitas untuk klaster DB sebagai respons operasi [DescribeDBClusters](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusters.html) .

# Menghentikan aliran aktivitas basis data
<a name="DBActivityStreams.Disabling"></a>

Anda dapat menghentikan aliran aktivitas menggunakan konsol atau AWS CLI.

Jika Anda menghapus klaster basis data, aliran aktivitas dihentikan dan aliran Amazon Kinesis yang mendasari dihapus secara otomatis.

## Konsol
<a name="DBActivityStreams.Disabling-collapsible-section-D1"></a>

**Untuk mematikan aliran aktivitas**

1. Buka konsol Amazon RDS di [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/).

1. Di panel navigasi, pilih **Database**.

1. Pilih klaster basis data yang ingin Anda hentikan aliran aktivitas basis datanya.

1. Untuk **Tindakan**, pilih **Hentikan aliran aktivitas**. Jendela **Aliran Aktivitas Basis Data** akan muncul.

   1. Pilih **Seketika**.

      Bila Anda memilih **Segera**, klaster basis data memulai ulang dengan seketika. Jika Anda memilih **Selama jendela pemeliharaan berikutnya**, klaster basis data tidak seketika memulai ulang. Dalam hal ini, aliran aktivitas basis data tidak berhenti hingga jendela pemeliharaan berikutnya.

   1. Pilih **Lanjutkan**.

## AWS CLI
<a name="DBActivityStreams.Disabling-collapsible-section-D2"></a>

Untuk menghentikan aliran aktivitas database untuk DB cluster , konfigurasikan menggunakan AWS CLI perintah [stop-activity-stream](https://docs.aws.amazon.com/cli/latest/reference/rds/stop-activity-stream.html). Tandai Kawasan AWS untuk klaster basis data dengan menggunakan parameter `--region`. Parameter `--apply-immediately` bersifat opsional.

Untuk Linux, macOS, atau Unix:

```
aws rds --region MY_REGION \
    stop-activity-stream \
    --resource-arn MY_CLUSTER_ARN \
    --apply-immediately
```

Untuk Windows:

```
aws rds --region MY_REGION ^
    stop-activity-stream ^
    --resource-arn MY_CLUSTER_ARN ^
    --apply-immediately
```

## API RDS
<a name="DBActivityStreams.Disabling-collapsible-section-D3"></a>

Untuk menghentikan aliran aktivitas database untuk DB cluster , konfigurasikan cluster menggunakan [StopActivityStream](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_StopActivityStream.html)operasi. Tandai Kawasan AWS untuk klaster basis data dengan menggunakan parameter `Region`. Parameter `ApplyImmediately` bersifat opsional.

# Memantau aliran aktivitas basis data
<a name="DBActivityStreams.Monitoring"></a>

Aliran aktivitas basis data memantau dan melaporkan aktivitas. Aliran aktivitas dikumpulkan dan dikirim ke Amazon Kinesis. Dari Kinesis, Anda dapat memantau aliran aktivitas, atau layanan dan aplikasi lain dapat menggunakan aliran aktivitas untuk analisis lebih lanjut. Anda dapat menemukan nama aliran Kinesis yang mendasarinya dengan menggunakan AWS CLI perintah `describe-db-clusters`atau operasi. RDS API `DescribeDBClusters`

Aurora  mengelola aliran Kinesis untuk Anda sebagai berikut:
+ Aurora  membuat aliran Kinesis secara otomatis dengan periode retensi 24 jam. 
+  Aurora  menskalakan aliran Kinesis jika perlu. 
+  Jika Anda menghentikan aliran aktivitas database atau menghapus cluster DB , Aurora  menghapus aliran Kinesis. 

Kategori-kategori aktivitas berikut dipantau dan dimasukkan ke dalam log audit aliran aktivitas:
+ **SQLperintah** — Semua SQL perintah diaudit, dan juga pernyataan yang disiapkan, fungsi bawaan, dan fungsi di SQL PL/. Panggilan ke prosedur tersimpan akan diaudit. Setiap SQL pernyataan yang dikeluarkan dalam prosedur atau fungsi yang disimpan juga diaudit.
+ **Informasi database lainnya** — Aktivitas yang dipantau mencakup SQL pernyataan lengkap, jumlah baris baris yang terpengaruh dari DML perintah, objek yang diakses, dan nama database yang unik. Untuk Aurora PostgreSQL, aliran aktivitas database juga memantau variabel pengikat dan parameter prosedur yang disimpan. 
**penting**  
SQLTeks lengkap dari setiap pernyataan terlihat di log audit aliran aktivitas, termasuk data sensitif apa pun. Namun, kata sandi pengguna database disunting jika  Oracle dapat menentukannya dari konteks, seperti dalam pernyataan berikut. SQL   

  ```
  ALTER ROLE role-name WITH password
  ```
+ **Informasi koneksi** – Aktivitas yang dipantau mencakup sesi dan informasi jaringan, ID proses server, dan kode keluar.

Jika aliran aktivitas mengalami kegagalan saat memantau instans DB Anda, Anda akan diberi tahu melalui RDS acara.

Di bagian berikut, Anda dapat mengakses, mengaudit, dan memproses aliran aktivitas basis data.

**Topics**
+ [Mengakses aliran aktivitas dari Amazon Kinesis](DBActivityStreams.KinesisAccess.md)
+ [Audit isi log dan contoh untuk aliran aktivitas database](DBActivityStreams.AuditLog.md)
+ [databaseActivityEventDaftar array JSON untuk aliran aktivitas database](DBActivityStreams.AuditLog.databaseActivityEventList.md)
+ [Memproses aliran aktivitas database menggunakan AWS SDK](DBActivityStreams.CodeExample.md)

# Mengakses aliran aktivitas dari Amazon Kinesis
<a name="DBActivityStreams.KinesisAccess"></a>

Saat Anda mengaktifkan aliran aktivitas untuk klaster basis data, aliran Kinesis dibuat untuk Anda. Dari Kinesis, Anda dapat memantau aktivitas basis data Anda secara waktu nyata. Untuk menganalisis lebih lanjut aktivitas basis data, Anda dapat menghubungkan aliran Kinesis dengan aplikasi konsumen. Anda juga dapat menghubungkan aliran ke aplikasi manajemen kepatuhan seperti IBMSecurity Guardium atau Audit SecureSphere Database Imperva dan Perlindungan Keamanan Guardium atau Audit dan Perlindungan IBM .

Anda dapat mengakses aliran Kinesis Anda baik dari RDS konsol atau konsol Kinesis.

**Untuk mengakses aliran aktivitas dari Kinesis menggunakan konsol RDS**

1. Buka RDS konsol Amazon di [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/).

1. Di panel navigasi, pilih **Basis Data**.

1. Pilih cluster DB tempat Anda memulai aliran aktivitas.

1. Pilih **Konfigurasi**.

1. Di bawah **Aliran aktivitas basis data**, pilih tautan di bawah **Aliran Kinesis**.

1. Di konsol Kinesis, pilih **Pemantauan** untuk mulai mengamati aktivitas basis data.

**Untuk mengakses aliran aktivitas dari Kinesis dengan menggunakan konsol Kinesis**

1. Buka konsol Kinesis di [https://console.aws.amazon.com/kinesis](https://console.aws.amazon.com/kinesis).

1. Pilih aliran aktivitas Anda dari daftar aliran Kinesis.

   Nama aliran aktivitas mencakup awalan `aws-rds-das-cluster-` diikuti dengan ID sumber daya klaster basis data. Berikut sebuah contohnya. 

   ```
   aws-rds-das-cluster-NHVOV4PCLWHGF52NP
   ```

   Untuk menggunakan RDS konsol Amazon untuk menemukan ID sumber daya untuk DB cluster , pilih dari daftar database, lalu pilih tab **Konfigurasi**.

   Untuk menggunakan AWS CLI untuk menemukan nama aliran Kinesis lengkap untuk aliran aktivitas, gunakan [describe-db-clusters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html)CLIpermintaan dan catat nilai `ActivityStreamKinesisStreamName` dalam respons.

1. Pilih **Pemantauan** untuk mulai mengamati aktivitas basis data.

Lihat informasi yang lebih lengkap tentang penggunaan Amazon Kinesis di [Apakah Amazon Kinesis Data Streams?](https://docs.aws.amazon.com/streams/latest/dev/introduction.html).

# Audit isi log dan contoh untuk aliran aktivitas database
<a name="DBActivityStreams.AuditLog"></a>

Peristiwa-peristiwa yang dipantau disajikan dalam aliran aktivitas basis data berupa string JSON. Strukturnya terdiri atas objek JSON yang berisi `DatabaseActivityMonitoringRecord`, yang selanjutnya berisi sebuah array peristiwa aktivitas `databaseActivityEventList`. 

**catatan**  
Untuk aliran aktivitas database, array `paramList` JSON tidak menyertakan nilai null dari aplikasi Hibernate.

**Topics**
+ [Contoh-contoh log audit untuk aliran aktivitas](#DBActivityStreams.AuditLog.Examples)
+ [DatabaseActivityMonitoringRecords Objek JSON](#DBActivityStreams.AuditLog.DatabaseActivityMonitoringRecords)
+ [databaseActivityEvents Objek JSON](#DBActivityStreams.AuditLog.databaseActivityEvents)

## Contoh-contoh log audit untuk aliran aktivitas
<a name="DBActivityStreams.AuditLog.Examples"></a>

Berikut adalah contoh log audit JSON terdekripsi dari catatan peristiwa aktivitas.

**Example**  
Catatan peristiwa aktivitas berikut menunjukkan upaya masuk dengan penggunaan pernyataan SQL `CONNECT` (`command`) oleh klien psql (`clientApplication`).  

```
{
  "type":"DatabaseActivityMonitoringRecords",
  "version":"1.1",
  "databaseActivityEvents": 
    {
      "type":"DatabaseActivityMonitoringRecord",
      "clusterId":"cluster-4HNY5V4RRNPKKYB7ICFKE5JBQQ",
      "instanceId":"db-FZJTMYKCXQBUUZ6VLU7NW3ITCM",
      "databaseActivityEventList":[
        {
          "startTime": "2019-10-30 00:39:49.940668+00",
          "logTime": "2019-10-30 00:39:49.990579+00",
          "statementId": 1,
          "substatementId": 1,
          "objectType": null,
          "command": "CONNECT",
          "objectName": null,
          "databaseName": "postgres",
          "dbUserName": "rdsadmin",
          "remoteHost": "172.31.3.195",
          "remotePort": "49804",
          "sessionId": "5ce5f7f0.474b",
          "rowCount": null,
          "commandText": null,
          "paramList": [],
          "pid": 18251,
          "clientApplication": "psql",
          "exitCode": null,
          "class": "MISC",
          "serverVersion": "2.3.1",
          "serverType": "PostgreSQL",
          "serviceName": "Amazon Aurora PostgreSQL-Compatible edition",
          "serverHost": "172.31.3.192",
          "netProtocol": "TCP",
          "dbProtocol": "Postgres 3.0",
          "type": "record",
          "errorMessage": null
        }
      ]
    },
   "key":"decryption-key"
}
```

**Example Catatan peristiwa aktivitas pernyataan SQL CONNECT Aurora MySQL**  
Catatan peristiwa aktivitas berikut menunjukkan upaya masuk dengan penggunaan pernyataan SQL `CONNECT` (`command`) oleh klien mysql (`clientApplication`).   

```
{
  "type":"DatabaseActivityMonitoringRecord",
  "clusterId":"cluster-some_id",
  "instanceId":"db-some_id",
  "databaseActivityEventList":[
    {
      "logTime":"2020-05-22 18:07:13.267214+00",
      "type":"record",
      "clientApplication":null,
      "pid":2830,
      "dbUserName":"rdsadmin",
      "databaseName":"",
      "remoteHost":"localhost",
      "remotePort":"11053",
      "command":"CONNECT",
      "commandText":"",
      "paramList":null,
      "objectType":"TABLE",
      "objectName":"",
      "statementId":0,
      "substatementId":1,
      "exitCode":"0",
      "sessionId":"725121",
      "rowCount":0,
      "serverHost":"master",
      "serverType":"MySQL",
      "serviceName":"Amazon Aurora MySQL",
      "serverVersion":"MySQL 5.7.12",
      "startTime":"2020-05-22 18:07:13.267207+00",
      "endTime":"2020-05-22 18:07:13.267213+00",
      "transactionId":"0",
      "dbProtocol":"MySQL",
      "netProtocol":"TCP",
      "errorMessage":"",
      "class":"MAIN"
    }
  ]
}
```

**Example Catatan peristiwa aktivitas pernyataan CREATE TABLE Aurora PostgreSQL**  
Contoh berikut menunjukkan peristiwa `CREATE TABLE` untuk Aurora PostgreSQL.  

```
{
  "type":"DatabaseActivityMonitoringRecords",
  "version":"1.1",
  "databaseActivityEvents": 
    {
      "type":"DatabaseActivityMonitoringRecord",
      "clusterId":"cluster-4HNY5V4RRNPKKYB7ICFKE5JBQQ",
      "instanceId":"db-FZJTMYKCXQBUUZ6VLU7NW3ITCM",
      "databaseActivityEventList":[
        {
          "startTime": "2019-05-24 00:36:54.403455+00",
          "logTime": "2019-05-24 00:36:54.494235+00",
          "statementId": 2,
          "substatementId": 1,
          "objectType": null,
          "command": "CREATE TABLE",
          "objectName": null,
          "databaseName": "postgres",
          "dbUserName": "rdsadmin",
          "remoteHost": "172.31.3.195",
          "remotePort": "34534",
          "sessionId": "5ce73c6f.7e64",
          "rowCount": null,
          "commandText": "create table my_table (id serial primary key, name varchar(32));",
          "paramList": [],
          "pid": 32356,
          "clientApplication": "psql",
          "exitCode": null,
          "class": "DDL",
          "serverVersion": "2.3.1",
          "serverType": "PostgreSQL",
          "serviceName": "Amazon Aurora PostgreSQL-Compatible edition",
          "serverHost": "172.31.3.192",
          "netProtocol": "TCP",
          "dbProtocol": "Postgres 3.0",
          "type": "record",
          "errorMessage": null
        }
      ]
    },
   "key":"decryption-key"
}
```

**Example Catatan peristiwa aktivitas pernyataan CREATE TABLE Aurora MySQL**  
Contoh berikut menunjukkan pernyataan `CREATE TABLE` untuk Aurora MySQL. Operasi ini disajikan sebagai dua catatan peristiwa terpisah. Satu peristiwa memiliki `"class":"MAIN"`. Peristiwa yang lain memiliki `"class":"AUX"`. Pesan-pesan mungkin tiba dengan sebarang urutan. Bidang `logTime` peristiwa `MAIN` selalu lebih awal dari bidang-bidang `logTime` untuk peristiwa `AUX` yang terkait.  
Contoh berikut menunjukkan peristiwa dengan nilai `class` berupa `MAIN`.   

```
{
  "type":"DatabaseActivityMonitoringRecord",
  "clusterId":"cluster-some_id",
  "instanceId":"db-some_id",
  "databaseActivityEventList":[
    {
      "logTime":"2020-05-22 18:07:12.250221+00",
      "type":"record",
      "clientApplication":null,
      "pid":2830,
      "dbUserName":"master",
      "databaseName":"test",
      "remoteHost":"localhost",
      "remotePort":"11054",
      "command":"QUERY",
      "commandText":"CREATE TABLE test1 (id INT)",
      "paramList":null,
      "objectType":"TABLE",
      "objectName":"test1",
      "statementId":65459278,
      "substatementId":1,
      "exitCode":"0",
      "sessionId":"725118",
      "rowCount":0,
      "serverHost":"master",
      "serverType":"MySQL",
      "serviceName":"Amazon Aurora MySQL",
      "serverVersion":"MySQL 5.7.12",
      "startTime":"2020-05-22 18:07:12.226384+00",
      "endTime":"2020-05-22 18:07:12.250222+00",
      "transactionId":"0",
      "dbProtocol":"MySQL",
      "netProtocol":"TCP",
      "errorMessage":"",
      "class":"MAIN"
    }
  ]
}
```
 Contoh berikut menunjukkan peristiwa yang bersangkutan dengan nilai `class` berupa `AUX`.  

```
{
  "type":"DatabaseActivityMonitoringRecord",
  "clusterId":"cluster-some_id",
  "instanceId":"db-some_id",
  "databaseActivityEventList":[
    {
      "logTime":"2020-05-22 18:07:12.247182+00",
      "type":"record",
      "clientApplication":null,
      "pid":2830,
      "dbUserName":"master",
      "databaseName":"test",
      "remoteHost":"localhost",
      "remotePort":"11054",
      "command":"CREATE",
      "commandText":"test1",
      "paramList":null,
      "objectType":"TABLE",
      "objectName":"test1",
      "statementId":65459278,
      "substatementId":2,
      "exitCode":"",
      "sessionId":"725118",
      "rowCount":0,
      "serverHost":"master",
      "serverType":"MySQL",
      "serviceName":"Amazon Aurora MySQL",
      "serverVersion":"MySQL 5.7.12",
      "startTime":"2020-05-22 18:07:12.226384+00",
      "endTime":"2020-05-22 18:07:12.247182+00",
      "transactionId":"0",
      "dbProtocol":"MySQL",
      "netProtocol":"TCP",
      "errorMessage":"",
      "class":"AUX"
    }
  ]
}
```

**Example Catatan peristiwa aktivitas pernyataan SELECT Aurora PostgreSQL**  
Contoh berikut menunjukkan peristiwa `SELECT` .  

```
{
  "type":"DatabaseActivityMonitoringRecords",
  "version":"1.1",
  "databaseActivityEvents": 
    {
      "type":"DatabaseActivityMonitoringRecord",
      "clusterId":"cluster-4HNY5V4RRNPKKYB7ICFKE5JBQQ",
      "instanceId":"db-FZJTMYKCXQBUUZ6VLU7NW3ITCM",
      "databaseActivityEventList":[
        {
          "startTime": "2019-05-24 00:39:49.920564+00",
          "logTime": "2019-05-24 00:39:49.940668+00",
          "statementId": 6,
          "substatementId": 1,
          "objectType": "TABLE",
          "command": "SELECT",
          "objectName": "public.my_table",
          "databaseName": "postgres",
          "dbUserName": "rdsadmin",
          "remoteHost": "172.31.3.195",
          "remotePort": "34534",
          "sessionId": "5ce73c6f.7e64",
          "rowCount": 10,
          "commandText": "select * from my_table;",
          "paramList": [],
          "pid": 32356,
          "clientApplication": "psql",
          "exitCode": null,
          "class": "READ",
          "serverVersion": "2.3.1",
          "serverType": "PostgreSQL",
          "serviceName": "Amazon Aurora PostgreSQL-Compatible edition",
          "serverHost": "172.31.3.192",
          "netProtocol": "TCP",
          "dbProtocol": "Postgres 3.0",
          "type": "record",
          "errorMessage": null
        }
      ]
    },
   "key":"decryption-key"
}
```

```
{
    "type": "DatabaseActivityMonitoringRecord",
    "clusterId": "",
    "instanceId": "db-4JCWQLUZVFYP7DIWP6JVQ77O3Q",
    "databaseActivityEventList": [
        {
            "class": "TABLE",
            "clientApplication": "Microsoft SQL Server Management Studio - Query",
            "command": "SELECT",
            "commandText": "select * from [testDB].[dbo].[TestTable]",
            "databaseName": "testDB",
            "dbProtocol": "SQLSERVER",
            "dbUserName": "test",
            "endTime": null,
            "errorMessage": null,
            "exitCode": 1,
            "logTime": "2022-10-06 21:24:59.9422268+00",
            "netProtocol": null,
            "objectName": "TestTable",
            "objectType": "TABLE",
            "paramList": null,
            "pid": null,
            "remoteHost": "local machine",
            "remotePort": null,
            "rowCount": 0,
            "serverHost": "172.31.30.159",
            "serverType": "SQLSERVER",
            "serverVersion": "15.00.4073.23.v1.R1",
            "serviceName": "sqlserver-ee",
            "sessionId": 62,
            "startTime": null,
            "statementId": "0x03baed90412f564fad640ebe51f89b99",
            "substatementId": 1,
            "transactionId": "4532935",
            "type": "record",
            "engineNativeAuditFields": {
                "target_database_principal_id": 0,
                "target_server_principal_id": 0,
                "target_database_principal_name": "",
                "server_principal_id": 2,
                "user_defined_information": "",
                "response_rows": 0,
                "database_principal_name": "dbo",
                "target_server_principal_name": "",
                "schema_name": "dbo",
                "is_column_permission": true,
                "object_id": 581577110,
                "server_instance_name": "EC2AMAZ-NFUJJNO",
                "target_server_principal_sid": null,
                "additional_information": "",
                "duration_milliseconds": 0,
                "permission_bitmask": "0x00000000000000000000000000000001",
                "data_sensitivity_information": "",
                "session_server_principal_name": "test",
                "connection_id": "AD3A5084-FB83-45C1-8334-E923459A8109",
                "audit_schema_version": 1,
                "database_principal_id": 1,
                "server_principal_sid": "0x010500000000000515000000bdc2795e2d0717901ba6998cf4010000",
                "user_defined_event_id": 0,
                "host_name": "EC2AMAZ-NFUJJNO"
            }
        }
    ]
}
```

**Example Catatan peristiwa aktivitas pernyataan SELECT Aurora MySQL**  
Contoh berikut menunjukkan peristiwa `SELECT`.  
 Contoh berikut menunjukkan peristiwa dengan nilai `class` berupa `MAIN`.   

```
{
  "type":"DatabaseActivityMonitoringRecord",
  "clusterId":"cluster-some_id",
  "instanceId":"db-some_id",
  "databaseActivityEventList":[
    {
      "logTime":"2020-05-22 18:29:57.986467+00",
      "type":"record",
      "clientApplication":null,
      "pid":2830,
      "dbUserName":"master",
      "databaseName":"test",
      "remoteHost":"localhost",
      "remotePort":"11054",
      "command":"QUERY",
      "commandText":"SELECT * FROM test1 WHERE id < 28",
      "paramList":null,
      "objectType":"TABLE",
      "objectName":"test1",
      "statementId":65469218,
      "substatementId":1,
      "exitCode":"0",
      "sessionId":"726571",
      "rowCount":2,
      "serverHost":"master",
      "serverType":"MySQL",
      "serviceName":"Amazon Aurora MySQL",
      "serverVersion":"MySQL 5.7.12",
      "startTime":"2020-05-22 18:29:57.986364+00",
      "endTime":"2020-05-22 18:29:57.986467+00",
      "transactionId":"0",
      "dbProtocol":"MySQL",
      "netProtocol":"TCP",
      "errorMessage":"",
      "class":"MAIN"
    }
  ]
}
```
 Contoh berikut menunjukkan peristiwa yang bersangkutan dengan nilai `class` berupa `AUX`.   

```
{
  "type":"DatabaseActivityMonitoringRecord",
  "instanceId":"db-some_id",
  "databaseActivityEventList":[
    {
      "logTime":"2020-05-22 18:29:57.986399+00",
      "type":"record",
      "clientApplication":null,
      "pid":2830,
      "dbUserName":"master",
      "databaseName":"test",
      "remoteHost":"localhost",
      "remotePort":"11054",
      "command":"READ",
      "commandText":"test1",
      "paramList":null,
      "objectType":"TABLE",
      "objectName":"test1",
      "statementId":65469218,
      "substatementId":2,
      "exitCode":"",
      "sessionId":"726571",
      "rowCount":0,
      "serverHost":"master",
      "serverType":"MySQL",
      "serviceName":"Amazon Aurora MySQL",
      "serverVersion":"MySQL 5.7.12",
      "startTime":"2020-05-22 18:29:57.986364+00",
      "endTime":"2020-05-22 18:29:57.986399+00",
      "transactionId":"0",
      "dbProtocol":"MySQL",
      "netProtocol":"TCP",
      "errorMessage":"",
      "class":"AUX"
    }
  ]
}
```

## DatabaseActivityMonitoringRecords Objek JSON
<a name="DBActivityStreams.AuditLog.DatabaseActivityMonitoringRecords"></a>

Catatan peristiwa aktivitas basis data berada dalam objek JSON yang berisi informasi berikut.


****  

| Bidang JSON | Tipe data | Deskripsi | 
| --- | --- | --- | 
|  `type`  | string |  Jenis catatan JSON. Nilainya adalah `DatabaseActivityMonitoringRecords`.  | 
| version | string |  Versi catatan pemantauan aktivitas basis data. Versi catatan aktivitas basis data yang dihasilkan bergantung pada versi mesin klaster basis data: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/AmazonRDS/latest/AuroraUserGuide/DBActivityStreams.AuditLog.html)Semua bidang berikut ada dalam versi 1.0 dan versi 1.1 kecuali jika diberi catatan khusus. | 
|  [databaseActivityEvents](#DBActivityStreams.AuditLog.databaseActivityEvents)  | string |  Objek JSON yang berisi peristiwa aktivitas.  | 
| kunci | string | Kunci enkripsi yang Anda gunakan untuk mendekripsi [databaseActivityEventDaftar array JSON](DBActivityStreams.AuditLog.databaseActivityEventList.md)  | 

## databaseActivityEvents Objek JSON
<a name="DBActivityStreams.AuditLog.databaseActivityEvents"></a>

Objek JSON `databaseActivityEvents` berisi informasi berikut.

### Bidang-bidang tingkat atas dalam catatan JSON
<a name="DBActivityStreams.AuditLog.topLevel"></a>

 Setiap peristiwa dalam log audit dibungkus dalam sebuah catatan dalam format JSON. Catatan ini berisi bidang-bidang berikut. 

**tipe**  
 Bidang ini selalu memiliki nilai `DatabaseActivityMonitoringRecords`. 

**versi**  
 Bidang ini mewakili versi protokol atau kontrak data aliran aktivitas basis data. Versi menentukan bidang-bidang yang tersedia.  
Versi 1.0 mewakili dukungan aliran aktivitas data asli untuk Aurora PostgreSQL versi 10.7 dan 11.4. Versi 1.1 mewakili dukungan aliran aktivitas data untuk Aurora PostgreSQL versi 10.10 dan yang lebih tinggi serta Aurora PostgreSQL versi 11.5 dan yang lebih tinggi. Versi 1.1 mencakup bidang-bidang tambahan `errorMessage` dan `startTime`. Versi 1.2 mewakili dukungan aliran aktivitas data untuk Aurora MySQL 2.08 dan lebih tinggi. Versi 1.2 mencakup bidang-bidang tambahan `endTime` dan `transactionId`.

**databaseActivityEvents**  
 String terenkripsi yang mewakili satu atau beberapa peristiwa aktivitas. String disajikan berupa array byte base64. Saat Anda mendekripsi string, hasilnya adalah catatan dalam format JSON dengan bidang-bidang seperti ditunjukkan dalam contoh di bagian ini.

**kunci**  
 Kunci data terenkripsi yang digunakan untuk mengenkripsi string `databaseActivityEvents`. Ini sama dengan AWS KMS key yang Anda berikan saat memulai aliran aktivitas database.

 Contoh berikut menunjukkan format catatan ini.

```
{
  "type":"DatabaseActivityMonitoringRecords",
  "version":"1.1",
  "databaseActivityEvents":"encrypted audit records",
  "key":"encrypted key"
}
```

Lakukan langkah-langkah berikut untuk mendekripsi konten bidang `databaseActivityEvents`:

1.  Lakukan dekripsi nilai dalam bidang JSON `key` dengan menggunakan kunci KMS yang Anda sediakan ketika memulai aliran aktivitas basis data. Melakukan hal itu akan menghasilkan kunci enkripsi data berupa teks jelas. 

1.  Base64 mendekode nilai dalam bidang JSON `databaseActivityEvents` untuk mendapatkan teks sandi, dalam format biner, dari Panduan Referensi audit. 

1.  Lakukan dekripsi teks sandi biner dengan kunci enkripsi data yang Anda dekode pada langkah pertama. 

1.  Lakukan dekompresi Panduan Referensi yang terdekripsi. 
   +  Muatan terenkripsi ada di bidang `databaseActivityEvents`. 
   +  Bidang `databaseActivityEventList` berisi array catatan audit. Bidang `type` dalam array dapat berupa `record` atau `heartbeat`. 

Catatan peristiwa aktivitas log audit adalah objek JSON yang berisi informasi berikut.


****  

| Bidang JSON | Tipe data | Deskripsi | 
| --- | --- | --- | 
|  `type`  | string |  Jenis catatan JSON. Nilainya adalah `DatabaseActivityMonitoringRecord`.  | 
| clusterId | string | Pengidentifikasi sumber daya klaster basis data. Pengidentifikasi ini berkaitan dengan atribut klaster basis data DbClusterResourceId. | 
| instanceId | string | Pengidentifikasi sumber daya instans basis data. Pengidentifikasi ini berkaitan dengan atribut instans basis data DbiResourceId. | 
|  [databaseActivityEventDaftar array JSON](DBActivityStreams.AuditLog.databaseActivityEventList.md)   | string |  Array catatan audit aktivitas atau pesan heartbeat.  | 

# databaseActivityEventDaftar array JSON untuk aliran aktivitas database
<a name="DBActivityStreams.AuditLog.databaseActivityEventList"></a>

Muatan log audit adalah array JSON `databaseActivityEventList` terenkripsi. Tabel-tabel berikut memerinci secara alfabetis bidang-bidang untuk setiap peristiwa aktivitas dalam array `DatabaseActivityEventList` terdekripsi sebuah log audit. Bidang-bidang akan berbeda tergantung pada apakah Anda menggunakan Aurora PostgreSQL atau Aurora MySQL. Rujuk ke tabel yang relevan dengan mesin basis data Anda.

**penting**  
Struktur peristiwa dapat berubah sewaktu-waktu. Aurora mungkin menambahkan bidang-bidang baru ke peristiwa aktivitas di masa mendatang. Dalam aplikasi yang menguraikan data JSON, pastikan bahwa kode Anda dapat mengabaikan atau mengambil tindakan yang tepat untuk nama-nama bidang yang tidak dikenal. 

## databaseActivityEventKolom daftar untuk Aurora PostgreSQL
<a name="DBActivityStreams.AuditLog.databaseActivityEventList.apg"></a>

Berikut ini adalah `databaseActivityEventList` bidang untuk Aurora PostgreSQL.


| Field | Tipe data | Deskripsi | 
| --- | --- | --- | 
| class | string |  Kelas peristiwa aktivitas. Nilai-nilai yang valid untuk Aurora PostgreSQL adalah: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/AmazonRDS/latest/AuroraUserGuide/DBActivityStreams.AuditLog.databaseActivityEventList.html)  | 
| clientApplication | string | Aplikasi yang digunakan klien untuk menghubungi seperti dilaporkan oleh klien. Klien tidak wajib memberikan informasi ini, sehingga nilainya dapat null. | 
| command | string | Nama perintah SQL tanpa perincian perintah sama sekali. | 
| commandText | string |  Pernyataan SQL sebenarnya yang diberikan oleh pengguna. Untuk Aurora PostgreSQL, nilainya identik dengan pernyataan SQL asli. Bidang ini digunakan untuk semua jenis catatan kecuali untuk menghubungkan atau memutus catatan, yang dalam hal ini nilainya null.  Teks SQL lengkap setiap pernyataan, yang meliputi semua data sensitif, dapat dilihat di log audit aliran aktivitas. Namun, kata sandi pengguna basis data disensor jika Aurora dapat menentukannya dari konteks, seperti dalam pernyataan SQL berikut.  <pre>ALTER ROLE role-name WITH password</pre>   | 
| databaseName | string | Basis data yang terhubung dengan pengguna. | 
| dbProtocol | string | Protokol basis data, misalnya Postgres 3.0. | 
| dbUserName | string | Pengguna basis data yang diautentikasi oleh klien. | 
| errorMessage(khusus catatan aktivitas basis data 1.1) | string |  Jika ada kesalahan, bidang ini diisi dengan pesan kesalahan yang akan dihasilkan oleh server basis data. Nilai `errorMessage` adalah null untuk pernyataan normal yang tidak mengakibatkan kesalahan.  Kesalahan didefinisikan sebagai sebarang aktivitas yang akan menghasilkan peristiwa log kesalahan PostgreSQL yang dapat dilihat klien pada tingkat keparahan `ERROR` atau lebih tinggi. Lihat informasi yang lebih lengkap di [Tingkat Keparahan Pesan PostgreSQL](https://www.postgresql.org/docs/current/runtime-config-logging.html#RUNTIME-CONFIG-SEVERITY-LEVELS). Misalnya, kesalahan sintaks dan pembatalan kueri menghasilkan pesan kesalahan.  Kesalahan-kesalahan internal server PostgreSQL, seperti kesalahan proses penunjuk pemeriksaan latar belakang tidak menghasilkan pesan kesalahan. Namun, catatan untuk peristiwa seperti itu masih dipancarkan terlepas dari setelan level keparahan log. Hal ini mencegah penyerang mematikan pencatatan log untuk mencoba menghindari deteksi. Lihat juga bidang `exitCode`.  | 
| exitCode | int | Nilai yang digunakan untuk catatan keluar sesi. Pada keluar yang mulus, ini berisi kode keluar. Kode keluar tidak selalu dapat diperoleh dalam beberapa skenario kegagalan. Contoh-contoh adalah jika PostgreSQL melakukan exit() atau jika operator melakukan perintah seperti kill -9.Jika ada kesalahan apa pun, bidang `exitCode` menampilkan kode kesalahan SQL, `SQLSTATE`, sebagaimana tercantum dalam [Kode Kesalahan PostgreSQL](https://www.postgresql.org/docs/current/errcodes-appendix.html). Lihat juga bidang `errorMessage`. | 
| logTime | string | Stempel waktu seperti tercatat di jalur kode audit. Ini mewakili waktu akhir eksekusi pernyataan SQL. Lihat juga bidang startTime. | 
| netProtocol | string | Protokol komunikasi jaringan. | 
| objectName | string | Nama objek basis data jika pernyataan SQL beroperasi pada objek itu. Bidang ini hanya digunakan apabila pernyataan SQL beroperasi pada objek basis data. Jika pernyataan SQL tidak beroperasi pada sebuah objek, nilai ini null. | 
| objectType | string | Jenis objek basis data, seperti tabel, indeks, tampilan, dan sebagainya. Bidang ini hanya digunakan apabila pernyataan SQL beroperasi pada objek basis data. Jika pernyataan SQL tidak beroperasi pada sebuah objek, nilai ini null. Nilai-nilai yang valid meliputi:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/AmazonRDS/latest/AuroraUserGuide/DBActivityStreams.AuditLog.databaseActivityEventList.html) | 
| paramList | string | Array parameter terpisah koma yang disampaikan ke pernyataan SQL. Jika pernyataan SQL tidak memiliki parameter, nilai ini adalah array kosong. | 
| pid | int | ID proses untuk proses backend yang dialokasikan untuk melayani koneksi klien. | 
| remoteHost | string | Alamat IP atau nama host klien. Untuk Aurora PostgreSQL, informasi yang digunakan bergantung pada setelan parameter log\$1hostname basis data. remoteHostNilai juga termasuk [local] dan localhost yang menunjukkan aktivitas dari rdsadmin pengguna. | 
| remotePort | string | Nomor port klien. | 
| rowCount | int | Jumlah baris tabel yang terpengaruh atau diambil oleh pernyataan SQL. Bidang ini hanya digunakan untuk pernyataan SQL yang merupakan pernyataan bahasa manipulasi data (DML). Jika pernyataan SQL bukan pernyataan DML, nilai ini null. | 
| serverHost | string | Alamat IP host server basis data. serverHostNilai juga termasuk [local] dan localhost yang menunjukkan aktivitas dari rdsadmin pengguna. | 
| serverType | string | Jenis server basis data, misalnya PostgreSQL. | 
| serverVersion | string | Versi server basis data, misalnya 2.3.1 untuk Aurora PostgreSQL. | 
| serviceName | string | Nama layanan, misalnya Amazon Aurora PostgreSQL-Compatible edition.  | 
| sessionId | int | Pengidentifikasi sesi unik semu. | 
| sessionId | int | Pengidentifikasi sesi unik semu. | 
| startTime(khusus catatan aktivitas basis data 1.1) | string |  Waktu ketika eksekusi dimulai untuk pernyataan SQL.  Untuk menghitung waktu eksekusi kira-kira pernyataan SQL, gunakan `logTime - startTime`. Lihat juga bidang `logTime`.  | 
| statementId | int | Pengidentifikasi untuk pernyataan SQL klien. Penghitung berada di tingkat sesi dan bertambah dengan setiap pernyataan SQL yang dimasukkan oleh klien.  | 
| substatementId | int | Pengidentifikasi untuk subpernyataan SQL. Nilai ini menghitung subpernyataan terkandung untuk setiap pernyataan SQL yang diidentifikasi oleh bidang statementId. | 
| type | string | Jenis peristiwa. Nilai-nilai yang valid adalah record atau heartbeat. | 

## databaseActivityEventDaftar bidang untuk Aurora MySQL
<a name="DBActivityStreams.AuditLog.databaseActivityEventList.ams"></a>

Berikut ini adalah `databaseActivityEventList` bidang untuk Aurora MySQL.


| Field | Tipe data | Deskripsi | 
| --- | --- | --- | 
| class | string |  Kelas peristiwa aktivitas. Nilai-nilai yang valid untuk Aurora MySQL adalah: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/AmazonRDS/latest/AuroraUserGuide/DBActivityStreams.AuditLog.databaseActivityEventList.html)  | 
| clientApplication | string | Aplikasi yang digunakan klien untuk menghubungi seperti dilaporkan oleh klien. Klien tidak wajib memberikan informasi ini, sehingga nilainya dapat null. | 
| command | string |  Kategori umum pernyataan SQL. Nilai untuk bidang ini bergantung pada nilai `class`. Nilai-nilai ketika `class` adalah `MAIN` meliputi: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/AmazonRDS/latest/AuroraUserGuide/DBActivityStreams.AuditLog.databaseActivityEventList.html) Nilai-nilai ketika `class` adalah `AUX` meliputi: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/AmazonRDS/latest/AuroraUserGuide/DBActivityStreams.AuditLog.databaseActivityEventList.html)  | 
| commandText | string |  Untuk peristiwa dengan nilai `class` adalah `MAIN`, bidang ini mewakili pernyataan SQL sebenarnya yang diberikan oleh pengguna. Bidang ini digunakan untuk semua jenis catatan kecuali untuk menghubungkan atau memutus catatan, yang dalam hal ini nilainya null.  Untuk peristiwa dengan nilai `class` adalah `AUX`, bidang ini memuat informasi tambahan tentang objek yang terlibat dalam peristiwa.  Untuk Aurora MySQL, karakter-karakter seperti tanda kutip didahului oleh garis miring kiri, yang mewakili karakter escape.  Teks SQL lengkap setiap pernyataan, yang meliputi semua data sensitif, dapat dilihat di log audit. Namun, kata sandi pengguna basis data disensor jika Aurora dapat menentukannya dari konteks, seperti dalam pernyataan SQL berikut.  <pre>mysql> SET PASSWORD = 'my-password';</pre> Tetapkan kata sandi selain penggugah/prompt yang ditampilkan di sini sebagai praktik terbaik keamanan.   | 
| databaseName | string | Basis data yang terhubung dengan pengguna. | 
| dbProtocol | string | Protokol basis data. Saat ini, nilai ini selalu MySQL untuk Aurora MySQL. | 
| dbUserName | string | Pengguna basis data yang diautentikasi oleh klien. | 
| endTime(khusus catatan aktivitas basis data 1.2) | string |  Waktu ketika eksekusi diakhiri untuk pernyataan SQL. Disajikan dalam format Waktu Universal Terkoordinasi (UTC). Untuk menghitung waktu eksekusi pernyataan SQL, gunakan `endTime - startTime`. Lihat juga bidang `startTime`.  | 
| errorMessage(khusus catatan aktivitas basis data 1.1) | string |  Jika ada kesalahan, bidang ini diisi dengan pesan kesalahan yang akan dihasilkan oleh server basis data. Nilai `errorMessage` adalah null untuk pernyataan normal yang tidak mengakibatkan kesalahan.  Kesalahan didefinisikan sebagai sebarang aktivitas yang akan menghasilkan peristiwa log kesalahan MySQL yang dapat dilihat klien pada tingkat keparahan `ERROR` atau lebih tinggi. Lihat informasi yang lebih lengkap di [The Error Log](https://dev.mysql.com/doc/refman/5.7/en/error-log.html) dalam *Panduan Referensi MySQL*. Misalnya, kesalahan sintaks dan pembatalan kueri menghasilkan pesan kesalahan.  Kesalahan-kesalahan internal server MySQL, seperti kesalahan proses penunjuk pemeriksaan latar belakang tidak menghasilkan pesan kesalahan. Namun, catatan untuk peristiwa seperti itu masih dipancarkan terlepas dari setelan level keparahan log. Hal ini mencegah penyerang mematikan pencatatan log untuk mencoba menghindari deteksi. Lihat juga bidang `exitCode`.  | 
| exitCode | int | Nilai yang digunakan untuk catatan keluar sesi. Pada keluar yang mulus, ini berisi kode keluar. Kode keluar tidak selalu dapat diperoleh dalam beberapa skenario kegagalan. Dalam kasus-kasus tersebut, nilai ini mungkin nol atau mungkin kosong. | 
| logTime | string | Stempel waktu seperti tercatat di jalur kode audit. Disajikan dalam format Waktu Universal Terkoordinasi (UTC). Lihat cara paling akurat menghitung durasi pernyataan di bidang-bidang startTime dan endTime. | 
| netProtocol | string | Protokol komunikasi jaringan. Saat ini, nilai ini selalu TCP untuk Aurora MySQL. | 
| objectName | string | Nama objek basis data jika pernyataan SQL beroperasi pada objek itu. Bidang ini hanya digunakan apabila pernyataan SQL beroperasi pada objek basis data. Jika pernyataan SQL tidak beroperasi pada sebuah objek, nilai ini null. Untuk membangun nama objek berkualifikasi penuh, gabungkan databaseName dan objectName. Jika kueri melibatkan beberapa objek, bidang ini dapat berupa daftar nama terpisah koma. | 
| objectType | string |  Jenis objek basis data, seperti tabel, indeks, dan sebagainya. Bidang ini hanya digunakan apabila pernyataan SQL beroperasi pada objek basis data. Jika pernyataan SQL tidak beroperasi pada sebuah objek, nilai ini null. Nilai-nilai yang valid untuk Aurora MySQL meliputi: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/AmazonRDS/latest/AuroraUserGuide/DBActivityStreams.AuditLog.databaseActivityEventList.html)  | 
| paramList | string | Bidang ini tidak digunakan untuk Aurora MySQL dan selalu null. | 
| pid | int | ID proses untuk proses backend yang dialokasikan untuk melayani koneksi klien. Ketika server basis data dimulai ulang, pid berubah dan penghitung untuk bidang statementId dimulai ulang dari awal. | 
| remoteHost | string | Alamat IP atau nama host klien yang menerbitkan pernyataan SQL. Untuk Aurora MySQL, informasi yang digunakan bergantung pada setelan parameter skip\$1name\$1resolve basis data. Nilai localhost menunjukkan aktivitas dari pengguna khusus rdsadmin.  | 
| remotePort | string | Nomor port klien. | 
| rowCount | int | Jumlah baris yang dihasilkan oleh pernyataan SQL. Misalnya, jika pernyataan SELECT menghasilkan 10 baris, rowCount adalah 10. Untuk pernyataan INSERT atau UPDATE, rowCount adalah 0. | 
| serverHost | string | Pengidentifikasi instans server basis data. | 
| serverType | string | Jenis server basis data, misalnya MySQL. | 
| serverVersion | string | Versi server basis data. Saat ini, nilai ini selalu MySQL 5.7.12 untuk Aurora MySQL. | 
| serviceName | string | Nama layanan. Saat ini, nilai ini selalu Amazon Aurora MySQL untuk Aurora MySQL. | 
| sessionId | int | Pengidentifikasi sesi unik semu. | 
| startTime(khusus catatan aktivitas basis data 1.1) | string |  Waktu ketika eksekusi dimulai untuk pernyataan SQL. Disajikan dalam format Waktu Universal Terkoordinasi (UTC). Untuk menghitung waktu eksekusi pernyataan SQL, gunakan `endTime - startTime`. Lihat juga bidang `endTime`.  | 
| statementId | int | Pengidentifikasi untuk pernyataan SQL klien. Penghitung bertambah dengan setiap pernyataan SQL yang dimasukkan oleh klien. Penghitung dinolkan saat instans basis data dimulai ulang. | 
| substatementId | int | Pengidentifikasi untuk subpernyataan SQL. Nilai ini adalah 1 untuk peristiwa dengan kelas MAIN dan 2 untuk peristiwa dengan kelas AUX. Gunakan bidang statementId untuk mengidentifikasi semua peristiwa yang dihasilkan oleh pernyataan yang sama. | 
| transactionId(khusus catatan aktivitas basis data 1.2) | int | Pengidentifikasi untuk transaksi. | 
| type | string | Jenis peristiwa. Nilai-nilai yang valid adalah record atau heartbeat. | 

# Memproses aliran aktivitas database menggunakan AWS SDK
<a name="DBActivityStreams.CodeExample"></a>

Anda dapat memproses aliran aktivitas secara terprogram dengan menggunakan file. AWS SDK Berikut adalah contoh Java dan Python yang berfungsi penuh tentang cara Anda dapat memproses aliran data Kinesis. 

------
#### [ Java ]

```
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.zip.GZIPInputStream;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.encryptionsdk.AwsCrypto;
import com.amazonaws.encryptionsdk.CryptoInputStream;
import com.amazonaws.encryptionsdk.jce.JceMasterKey;
import com.amazonaws.services.kinesis.clientlibrary.exceptions.InvalidStateException;
import com.amazonaws.services.kinesis.clientlibrary.exceptions.ShutdownException;
import com.amazonaws.services.kinesis.clientlibrary.exceptions.ThrottlingException;
import com.amazonaws.services.kinesis.clientlibrary.interfaces.IRecordProcessor;
import com.amazonaws.services.kinesis.clientlibrary.interfaces.IRecordProcessorCheckpointer;
import com.amazonaws.services.kinesis.clientlibrary.interfaces.IRecordProcessorFactory;
import com.amazonaws.services.kinesis.clientlibrary.lib.worker.InitialPositionInStream;
import com.amazonaws.services.kinesis.clientlibrary.lib.worker.KinesisClientLibConfiguration;
import com.amazonaws.services.kinesis.clientlibrary.lib.worker.ShutdownReason;
import com.amazonaws.services.kinesis.clientlibrary.lib.worker.Worker;
import com.amazonaws.services.kinesis.clientlibrary.lib.worker.Worker.Builder;
import com.amazonaws.services.kinesis.model.Record;
import com.amazonaws.services.kms.AWSKMS;
import com.amazonaws.services.kms.AWSKMSClientBuilder;
import com.amazonaws.services.kms.model.DecryptRequest;
import com.amazonaws.services.kms.model.DecryptResult;
import com.amazonaws.util.Base64;
import com.amazonaws.util.IOUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.SerializedName;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class DemoConsumer {

    private static final String STREAM_NAME = "aws-rds-das-[cluster-external-resource-id]";
    private static final String APPLICATION_NAME = "AnyApplication"; //unique application name for dynamo table generation that holds kinesis shard tracking
    private static final String AWS_ACCESS_KEY = "[AWS_ACCESS_KEY_TO_ACCESS_KINESIS]";
    private static final String AWS_SECRET_KEY = "[AWS_SECRET_KEY_TO_ACCESS_KINESIS]";
    private static final String DBC_RESOURCE_ID = "[cluster-external-resource-id]";
    private static final String REGION_NAME = "[region-name]"; //us-east-1, us-east-2...
    private static final BasicAWSCredentials CREDENTIALS = new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY);
    private static final AWSStaticCredentialsProvider CREDENTIALS_PROVIDER = new AWSStaticCredentialsProvider(CREDENTIALS);

    private static final AwsCrypto CRYPTO = new AwsCrypto();
    private static final AWSKMS KMS = AWSKMSClientBuilder.standard()
            .withRegion(REGION_NAME)
            .withCredentials(CREDENTIALS_PROVIDER).build();

    class Activity {
        String type;
        String version;
        String databaseActivityEvents;
        String key;
    }

    class ActivityEvent {
        @SerializedName("class") String _class;
        String clientApplication;
        String command;
        String commandText;
        String databaseName;
        String dbProtocol;
        String dbUserName;
        String endTime;
        String errorMessage;
        String exitCode;
        String logTime;
        String netProtocol;
        String objectName;
        String objectType;
        List<String> paramList;
        String pid;
        String remoteHost;
        String remotePort;
        String rowCount;
        String serverHost;
        String serverType;
        String serverVersion;
        String serviceName;
        String sessionId;
        String startTime;
        String statementId;
        String substatementId;
        String transactionId;
        String type;
    }

    class ActivityRecords {
        String type;
        String clusterId;
        String instanceId;
        List<ActivityEvent> databaseActivityEventList;
    }

    static class RecordProcessorFactory implements IRecordProcessorFactory {
        @Override
        public IRecordProcessor createProcessor() {
            return new RecordProcessor();
        }
    }

    static class RecordProcessor implements IRecordProcessor {

        private static final long BACKOFF_TIME_IN_MILLIS = 3000L;
        private static final int PROCESSING_RETRIES_MAX = 10;
        private static final long CHECKPOINT_INTERVAL_MILLIS = 60000L;
        private static final Gson GSON = new GsonBuilder().serializeNulls().create();

        private static final Cipher CIPHER;
        static {
            Security.insertProviderAt(new BouncyCastleProvider(), 1);
            try {
                CIPHER = Cipher.getInstance("AES/GCM/NoPadding", "BC");
            } catch (NoSuchAlgorithmException | NoSuchPaddingException | NoSuchProviderException e) {
                throw new ExceptionInInitializerError(e);
            }
        }

        private long nextCheckpointTimeInMillis;

        @Override
        public void initialize(String shardId) {
        }

        @Override
        public void processRecords(final List<Record> records, final IRecordProcessorCheckpointer checkpointer) {
            for (final Record record : records) {
                processSingleBlob(record.getData());
            }

            if (System.currentTimeMillis() > nextCheckpointTimeInMillis) {
                checkpoint(checkpointer);
                nextCheckpointTimeInMillis = System.currentTimeMillis() + CHECKPOINT_INTERVAL_MILLIS;
            }
        }

        @Override
        public void shutdown(IRecordProcessorCheckpointer checkpointer, ShutdownReason reason) {
            if (reason == ShutdownReason.TERMINATE) {
                checkpoint(checkpointer);
            }
        }

        private void processSingleBlob(final ByteBuffer bytes) {
            try {
                // JSON $Activity
                final Activity activity = GSON.fromJson(new String(bytes.array(), StandardCharsets.UTF_8), Activity.class);

                // Base64.Decode
                final byte[] decoded = Base64.decode(activity.databaseActivityEvents);
                final byte[] decodedDataKey = Base64.decode(activity.key);

                Map<String, String> context = new HashMap<>();
                context.put("aws:rds:dbc-id", DBC_RESOURCE_ID);

                // Decrypt
                final DecryptRequest decryptRequest = new DecryptRequest()
                        .withCiphertextBlob(ByteBuffer.wrap(decodedDataKey)).withEncryptionContext(context);
                final DecryptResult decryptResult = KMS.decrypt(decryptRequest);
                final byte[] decrypted = decrypt(decoded, getByteArray(decryptResult.getPlaintext()));

                // GZip Decompress
                final byte[] decompressed = decompress(decrypted);
                // JSON $ActivityRecords
                final ActivityRecords activityRecords = GSON.fromJson(new String(decompressed, StandardCharsets.UTF_8), ActivityRecords.class);

                // Iterate throught $ActivityEvents
                for (final ActivityEvent event : activityRecords.databaseActivityEventList) {
                    System.out.println(GSON.toJson(event));
                }
            } catch (Exception e) {
                // Handle error.
                e.printStackTrace();
            }
        }

        private static byte[] decompress(final byte[] src) throws IOException {
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(src);
            GZIPInputStream gzipInputStream = new GZIPInputStream(byteArrayInputStream);
            return IOUtils.toByteArray(gzipInputStream);
        }

        private void checkpoint(IRecordProcessorCheckpointer checkpointer) {
            for (int i = 0; i < PROCESSING_RETRIES_MAX; i++) {
                try {
                    checkpointer.checkpoint();
                    break;
                } catch (ShutdownException se) {
                    // Ignore checkpoint if the processor instance has been shutdown (fail over).
                    System.out.println("Caught shutdown exception, skipping checkpoint." + se);
                    break;
                } catch (ThrottlingException e) {
                    // Backoff and re-attempt checkpoint upon transient failures
                    if (i >= (PROCESSING_RETRIES_MAX - 1)) {
                        System.out.println("Checkpoint failed after " + (i + 1) + "attempts." + e);
                        break;
                    } else {
                        System.out.println("Transient issue when checkpointing - attempt " + (i + 1) + " of " + PROCESSING_RETRIES_MAX + e);
                    }
                } catch (InvalidStateException e) {
                    // This indicates an issue with the DynamoDB table (check for table, provisioned IOPS).
                    System.out.println("Cannot save checkpoint to the DynamoDB table used by the Amazon Kinesis Client Library." + e);
                    break;
                }
                try {
                    Thread.sleep(BACKOFF_TIME_IN_MILLIS);
                } catch (InterruptedException e) {
                    System.out.println("Interrupted sleep" + e);
                }
            }
        }
    }

    private static byte[] decrypt(final byte[] decoded, final byte[] decodedDataKey) throws IOException {
        // Create a JCE master key provider using the random key and an AES-GCM encryption algorithm
        final JceMasterKey masterKey = JceMasterKey.getInstance(new SecretKeySpec(decodedDataKey, "AES"),
                "BC", "DataKey", "AES/GCM/NoPadding");
        try (final CryptoInputStream<JceMasterKey> decryptingStream = CRYPTO.createDecryptingStream(masterKey, new ByteArrayInputStream(decoded));
             final ByteArrayOutputStream out = new ByteArrayOutputStream()) {
            IOUtils.copy(decryptingStream, out);
            return out.toByteArray();
        }
    }

    public static void main(String[] args) throws Exception {
        final String workerId = InetAddress.getLocalHost().getCanonicalHostName() + ":" + UUID.randomUUID();
        final KinesisClientLibConfiguration kinesisClientLibConfiguration =
                new KinesisClientLibConfiguration(APPLICATION_NAME, STREAM_NAME, CREDENTIALS_PROVIDER, workerId);
        kinesisClientLibConfiguration.withInitialPositionInStream(InitialPositionInStream.LATEST);
        kinesisClientLibConfiguration.withRegionName(REGION_NAME);
        final Worker worker = new Builder()
                .recordProcessorFactory(new RecordProcessorFactory())
                .config(kinesisClientLibConfiguration)
                .build();

        System.out.printf("Running %s to process stream %s as worker %s...\n", APPLICATION_NAME, STREAM_NAME, workerId);

        try {
            worker.run();
        } catch (Throwable t) {
            System.err.println("Caught throwable while processing data.");
            t.printStackTrace();
            System.exit(1);
        }
        System.exit(0);
    }

    private static byte[] getByteArray(final ByteBuffer b) {
        byte[] byteArray = new byte[b.remaining()];
        b.get(byteArray);
        return byteArray;
    }
}
```

------
#### [ Python ]

```
import base64
import json
import zlib
import aws_encryption_sdk
from aws_encryption_sdk import CommitmentPolicy
from aws_encryption_sdk.internal.crypto import WrappingKey
from aws_encryption_sdk.key_providers.raw import RawMasterKeyProvider
from aws_encryption_sdk.identifiers import WrappingAlgorithm, EncryptionKeyType
import boto3

REGION_NAME = '<region>'                    # us-east-1
RESOURCE_ID = '<external-resource-id>'      # cluster-ABCD123456
STREAM_NAME = 'aws-rds-das-' + RESOURCE_ID  # aws-rds-das-cluster-ABCD123456

enc_client = aws_encryption_sdk.EncryptionSDKClient(commitment_policy=CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT)

class MyRawMasterKeyProvider(RawMasterKeyProvider):
    provider_id = "BC"

    def __new__(cls, *args, **kwargs):
        obj = super(RawMasterKeyProvider, cls).__new__(cls)
        return obj

    def __init__(self, plain_key):
        RawMasterKeyProvider.__init__(self)
        self.wrapping_key = WrappingKey(wrapping_algorithm=WrappingAlgorithm.AES_256_GCM_IV12_TAG16_NO_PADDING,
                                        wrapping_key=plain_key, wrapping_key_type=EncryptionKeyType.SYMMETRIC)

    def _get_raw_key(self, key_id):
        return self.wrapping_key


def decrypt_payload(payload, data_key):
    my_key_provider = MyRawMasterKeyProvider(data_key)
    my_key_provider.add_master_key("DataKey")
    decrypted_plaintext, header = enc_client.decrypt(
        source=payload,
        materials_manager=aws_encryption_sdk.materials_managers.default.DefaultCryptoMaterialsManager(master_key_provider=my_key_provider))
    return decrypted_plaintext


def decrypt_decompress(payload, key):
    decrypted = decrypt_payload(payload, key)
    return zlib.decompress(decrypted, zlib.MAX_WBITS + 16)


def main():
    session = boto3.session.Session()
    kms = session.client('kms', region_name=REGION_NAME)
    kinesis = session.client('kinesis', region_name=REGION_NAME)

    response = kinesis.describe_stream(StreamName=STREAM_NAME)
    shard_iters = []
    for shard in response['StreamDescription']['Shards']:
        shard_iter_response = kinesis.get_shard_iterator(StreamName=STREAM_NAME, ShardId=shard['ShardId'],
                                                         ShardIteratorType='LATEST')
        shard_iters.append(shard_iter_response['ShardIterator'])

    while len(shard_iters) > 0:
        next_shard_iters = []
        for shard_iter in shard_iters:
            response = kinesis.get_records(ShardIterator=shard_iter, Limit=10000)
            for record in response['Records']:
                record_data = record['Data']
                record_data = json.loads(record_data)
                payload_decoded = base64.b64decode(record_data['databaseActivityEvents'])
                data_key_decoded = base64.b64decode(record_data['key'])
                data_key_decrypt_result = kms.decrypt(CiphertextBlob=data_key_decoded,
                                                      EncryptionContext={'aws:rds:dbc-id': RESOURCE_ID})
                print (decrypt_decompress(payload_decoded, data_key_decrypt_result['Plaintext']))
            if 'NextShardIterator' in response:
                next_shard_iters.append(response['NextShardIterator'])
        shard_iters = next_shard_iters


if __name__ == '__main__':
    main()
```

------

# Contoh kebijakan IAM untuk aliran aktivitas database
<a name="DBActivityStreams.ManagingAccess"></a>

 Semua tindakan ini dimasukkan ke dalam log audit aliran. Untuk praktik kepatuhan terbaik, kami menyarankan agar Anda tidak memberikan hak istimewa ini. DBAs

Anda mengatur akses ke aliran aktivitas basis data dengan menggunakan kebijakan IAM. Lihat informasi yang lebih lengkap tentang autentikasi Aurora di [Manajemen identitas dan akses untuk Amazon Aurora](UsingWithRDS.IAM.md). Lihat informasi yang lebih lengkap tentang pembuatan kebijakan IAM di [Membuat dan menggunakan kebijakan IAM untuk akses basis data IAM](UsingWithRDS.IAMDBAuth.IAMPolicy.md). 

**Example Kebijakan untuk memungkinkan pengonfigurasian aliran aktivitas basis data**  
Untuk memberi pengguna akses terperinci untuk mengubah aliran aktivitas, gunakan kunci-kunci konteks operasi khusus layanan `rds:StartActivityStream` dan `rds:StopActivityStream` dalam kebijakan IAM. Contoh kebijakan IAM berikut memungkinkan pengguna atau peran mengonfigurasikan aliran aktivitas.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ConfigureActivityStreams",
            "Effect": "Allow",
            "Action": [
                "rds:StartActivityStream",
                "rds:StopActivityStream"
            ],
            "Resource": "*"
        }
    ]
}
```

**Example Kebijakan untuk memungkinkan pemulaian aliran aktivitas basis data**  
Contoh kebijakan IAM berikut memungkinkan pengguna atau peran memulai aliran aktivitas.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {
            "Sid":"AllowStartActivityStreams",
            "Effect":"Allow",
            "Action":"rds:StartActivityStream",
            "Resource":"*"
        }
    ]
}
```

**Example Kebijakan untuk memungkinkan penghentian aliran aktivitas basis data**  
Contoh kebijakan IAM berikut memungkinkan pengguna atau peran menghentikan aliran aktivitas.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {
            "Sid":"AllowStopActivityStreams",
            "Effect":"Allow",
            "Action":"rds:StopActivityStream",
            "Resource":"*"
        }
     ]
}
```

**Example Kebijakan untuk menolak pemulaian aliran aktivitas basis data**  
Contoh kebijakan IAM berikut mencegah pengguna atau peran dari memulai aliran aktivitas.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {
            "Sid":"DenyStartActivityStreams",
            "Effect":"Deny",
            "Action":"rds:StartActivityStream",
            "Resource":"*"
        }
     ]
}
```

**Example Kebijakan untuk menolak penghentian aliran aktivitas basis data**  
Contoh kebijakan IAM berikut mencegah pengguna atau peran dari menghentikan aliran aktivitas.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {
            "Sid":"DenyStopActivityStreams",
            "Effect":"Deny",
            "Action":"rds:StopActivityStream",
            "Resource":"*"
        }
    ]
}
```