

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

# 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()
```

------