

# データベースアクティビティストリームを使用した Amazon RDS のモニタリング
<a name="DBActivityStreams"></a><a name="das"></a>

データベースアクティビティストリームを使用すると、データベースアクティビティのストリームをほぼリアルタイムでモニタリングできます。

**Topics**
+ [データベースアクティビティストリーミングの概要](#DBActivityStreams.Overview)
+ [Oracle Database の統合監査の設定](DBActivityStreams.configuring-auditing.md)
+ [Amazon RDS for Microsoft SQL Server の監査ポリシーの設定](DBActivityStreams.configuring-auditing-SQLServer.md)
+ [データベースアクティビティストリーミングのスタート](DBActivityStreams.Enabling.md)
+ [Amazon RDS のデータベースアクティビティストリーミングの変更](DBActivityStreams.Modifying.md)
+ [データベースアクティビティストリーミングのステータスの取得](DBActivityStreams.Status.md)
+ [データベースアクティビティストリーミングの停止](DBActivityStreams.Disabling.md)
+ [データベースアクティビティストリーミングのモニタリング](DBActivityStreams.Monitoring.md)
+ [データベースアクティビティストリームの IAM ポリシーの例](DBActivityStreams.ManagingAccess.md)

## データベースアクティビティストリーミングの概要
<a name="DBActivityStreams.Overview"></a>

Amazon RDS データベース管理者として、データベースを保護し、コンプライアンスおよび規制要件を満たす必要があります。1 つの戦略は、データベースアクティビティストリーミングをモニタリングツールに統合することです。このようにして、データベースでモニタリングを行い、監査アクティビティのアラームを設定します。

セキュリティの脅威は、外部と内部の両方です。内部の脅威から保護するために、データベースアクティビティストリーミング機能を設定して、データストリームへの管理者アクセスを制御できます。Amazon RDS DBA には、ストリームの収集、送信、保存、および処理に対するアクセス権限がありません。

**Contents**
+ [データベースアクティビティストリーミングの機能](#DBActivityStreams.Overview.how-they-work)
+ [Oracle データベースおよび Microsoft SQL Server データベースでの監査](#DBActivityStreams.Overview.auditing)
  + [Oracle Database での統合監査](#DBActivityStreams.Overview.unified-auditing)
  + [Microsoft SQL Server での監査](#DBActivityStreams.Overview.SQLServer-auditing)
  + [Oracle Database および SQL Server の非ネイティブ監査フィールド](#DBActivityStreams.Overview.unified-auditing.non-native)
  + [DB パラメータグループオーバーライド](#DBActivityStreams.Overview.unified-auditing.parameter-group)
+ [データベースアクティビティストリーミングの非同期モード](#DBActivityStreams.Overview.sync-mode)
+ [データベースアクティビティストリームの要件と制限](#DBActivityStreams.Overview.requirements)
+ [利用可能なリージョンとバージョン](#DBActivityStreams.RegionVersionAvailability)
+ [データベースアクティビティストリーミングでサポートされる DB インスタンスクラス](#DBActivityStreams.Overview.requirements.classes)

### データベースアクティビティストリーミングの機能
<a name="DBActivityStreams.Overview.how-they-work"></a>

Amazon RDS は、アクティビティをほぼリアルタイムで Amazon Kinesis データストリームにプッシュします。Kinesis ストリーミングが自動的に作成されます。Kinesis から、Amazon Data Firehose や AWS Lambda などの AWS サービスを設定して、ストリーミングを消費し、データを保存できます。

**重要**  
Amazon RDS のデータベースアクティビティストリーム機能は無料でご利用いただけますが、Amazon Kinesis のデータストリームに対しては課金されます。詳細については、「[Amazon Kinesis Data Streams の料金表](https://aws.amazon.com/kinesis/data-streams/pricing/)」を参照してください。

コンプライアンス管理のためのアプリケーションを設定して、データベースアクティビティストリーミングを使用できます。このようなアプリケーションでストリームを使用して、データベースについてのアラートと監査アクティビティを生成できます。

Amazon RDS は、マルチ AZ 配置でのデータベースアクティビティストリームをサポートしています。この場合、データベースアクティビティストリーミングはプライマリインスタンスとスタンバイインスタンスの両方を監査します。

### Oracle データベースおよび Microsoft SQL Server データベースでの監査
<a name="DBActivityStreams.Overview.auditing"></a>

監査とは、設定されたデータベースアクションをモニタリングし記録することです。Amazon RDS は、デフォルトではデータベースアクティビティをキャプチャしません。データベースで監査ポリシーを自分で作成し、管理します。

**Topics**
+ [Oracle Database での統合監査](#DBActivityStreams.Overview.unified-auditing)
+ [Microsoft SQL Server での監査](#DBActivityStreams.Overview.SQLServer-auditing)
+ [Oracle Database および SQL Server の非ネイティブ監査フィールド](#DBActivityStreams.Overview.unified-auditing.non-native)
+ [DB パラメータグループオーバーライド](#DBActivityStreams.Overview.unified-auditing.parameter-group)

#### Oracle Database での統合監査
<a name="DBActivityStreams.Overview.unified-auditing"></a>

Oracle データベースでは、*統合監査ポリシー*とは、ユーザーの動作のある面を監査するために使用できる監査設定の名前付きグループです。単一のユーザーのアクティビティを監査するといったシンプルなポリシーもあり得ます。条件を使用する複雑な監査ポリシーも作成できます。

Oracle データベースは、`SYS` 監査レコードを含む監査レコードを*統合監査証跡*に書き込みます。例えば、`INSERT` ステートメントでエラーが発生した場合、標準監査では、エラー番号と実行された SQL が示されます。監査証跡は、`AUDSYS` スキーマの読み取り専用テーブルに格納されます。これらのレコードにアクセスするには、`UNIFIED_AUDIT_TRAIL` データディクショナリビューにクエリを実行します。

通常、データベースアクティビティストリーミングは次のように設定します。

1. `CREATE AUDIT POLICY` コマンドを使用して、Oracle Database の監査ポリシーを作成します。

   Oracle Database は、監査レコードを生成します。

1. `AUDIT POLICY` コマンドを使用して、監査ポリシーを有効にします。

1. データベースアクティビティストリーミングを設定します。

   Oracle Database の監査ポリシーに適合するアクティビティのみがキャプチャされ、Amazon Kinesis データストリーミングに送信されます。データベースアクティビティストリーミングが有効な場合、Oracle データベース管理者は監査ポリシーを変更したり、監査ログを削除したりできません。

統合監査ポリシーの詳細については、*Oracle Database セキュリティガイド*の「[統合監査ポリシーおよび AUDIT を使用した監査アクティビティについて](https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-audit-policies.html#GUID-2435D929-10AD-43C7-8A6C-5133170074D0)」を参照してください。

#### Microsoft SQL Server での監査
<a name="DBActivityStreams.Overview.SQLServer-auditing"></a>

データベースアクティビティストリームは、SQLAudit 機能を使用して SQL Server データベースを監査します。

RDS for SQL Server インスタンスには、以下が含まれます。
+ サーバー監査 — SQL サーバー監査では、サーバーレベルまたはデータベースレベルのアクションの単一のインスタンスと、監視するアクションのグループを収集します。サーバーレベルの監査 `RDS_DAS_AUDIT` と `RDS_DAS_AUDIT_CHANGES` は、RDS によって管理されます。
+ サーバー監査仕様 — サーバー監査仕様は、サーバーレベルのイベントを記録します。`RDS_DAS_SERVER_AUDIT_SPEC` 仕様は変更できます。この仕様はサーバー監査 `RDS_DAS_AUDIT` にリンクされています。`RDS_DAS_CHANGES_AUDIT_SPEC` 仕様は RDS によって管理されます。
+ データベース監査仕様 — データベース監査仕様は、データベースレベルのイベントを記録します。データベース監査仕様 `RDS_DAS_DB_<name>` を作成し、それを `RDS_DAS_AUDIT` サーバー監査にリンクできます。

データベースアクティビティストリームは、コンソールまたは CLI を使用して設定できます。通常、データベースアクティビティストリーミングは次のように設定します。

1. (オプション) `CREATE DATABASE AUDIT SPECIFICATION` コマンドを使用してデータベース監査仕様を作成し、それを `RDS_DAS_AUDIT` サーバー監査にリンクします。

1. (オプション) `ALTER SERVER AUDIT SPECIFICATION` コマンドを使用してサーバー監査仕様を変更し、ポリシーを定義します。

1. データベースおよびサーバー監査ポリシーを有効にします。例えば、次のようになります。

   `ALTER DATABASE AUDIT SPECIFICATION [<Your database specification>] WITH (STATE=ON)`

   `ALTER SERVER AUDIT SPECIFICATION [RDS_DAS_SERVER_AUDIT_SPEC] WITH (STATE=ON)`

1. データベースアクティビティストリーミングを設定します。

   サーバーおよびデータベース監査ポリシーに一致するアクティビティのみがキャプチャされ、Amazon Kinesis データストリームに送信されます。データベースアクティビティストリームが有効であり、ポリシーがロックされているときには、データベース管理者は監査ポリシーを変更したり、監査ログを削除したりできません。
**重要**  
特定のデータベースのデータベース監査仕様が有効であり、ポリシーがロック状態の場合、データベースを削除することはできません。

詳細については、*Microsoft SQL Server ドキュメント*の「[SQL Server 監査コンポーネント](https://learn.microsoft.com/en-us/sql/relational-databases/security/auditing/sql-server-audit-database-engine?view=sql-server-ver16)」を参照してください。



#### Oracle Database および SQL Server の非ネイティブ監査フィールド
<a name="DBActivityStreams.Overview.unified-auditing.non-native"></a>

データベースアクティビティストリーミングをスタートすると、すべてのデータベースイベントが対応するアクティビティストリーミングイベントを生成します。例えば、データベースユーザーが `SELECT` ステートメントと `INSERT` ステートメントを実行したとします。データベースは、これらのイベントを監査し、Amazon Kinesis データストリーミングに送信します。

イベントは、ストリーミングの中で、JSON オブジェクトとして表されます。JSON オブジェクトには、`DatabaseActivityMonitoringRecord` が含まれ、これには `databaseActivityEventList` アレイが含まれています。アレイ内の定義済みフィールドには、`class`、`clientApplication`、`command`などがあります。

デフォルトでは、アクティビティストリーミングにはエンジンネイティブの監査フィールドは含まれません。Amazon RDS for Oracle と SQL Server を設定して、これらの追加フィールドを `engineNativeAuditFields` JSON オブジェクトに含めることができます。

Oracle Database では、統合監査証跡のほとんどのイベントは、RDS データアクティビティストリームのフィールドにマップされます。例えば、統合監査の `UNIFIED_AUDIT_TRAIL.SQL_TEXT` フィールドは、データベースアクティビティストリーミング内の `commandText` フィールドにマッピングされます。ただし、`OS_USERNAME` などの Oracle Database 監査フィールドは、データベースアクティビティストリーミングの定義済みフィールドにマッピングされません。

SQL Server では、SQLAudit によって記録されるイベントのフィールドのほとんどが RDS データベースアクティビティストリームのフィールドにマップされます。例えば、監査の `sys.fn_get_audit_file` の`code` フィールドは、データベースアクティビティストリームの `commandText` フィールドにマップされます。ただし、`permission_bitmask` などの SQL Server データベース監査フィールドは、データベースアクティビティストリームの定義済みフィールドにマップされません。

databaseActivityEventList の詳細については、「[データベースアクティビティストリームの databaseActivityEventList JSON 配列](DBActivityStreams.AuditLog.databaseActivityEventList.md)」を参照してください。

#### DB パラメータグループオーバーライド
<a name="DBActivityStreams.Overview.unified-auditing.parameter-group"></a>

通常、RDS for Oracle で統一監査を有効にするには、パラメータグループをアタッチします。ただし、データベースアクティビティストリームには、追加の設定が必要です。カスタマーエクスペリエンスを向上させるため、Amazon RDS では以下を実行しています。
+ アクティビティストリームを有効にすると、RDS for Oracle はパラメータグループの監査パラメータを無視します。
+ アクティビティストリームを無効にすると、RDS for Oracle は監査パラメータの無視を停止します。

SQL Server のデータベースアクティビティストリームは、SQL Audit オプションで設定したパラメータとは無関係です。

### データベースアクティビティストリーミングの非同期モード
<a name="DBActivityStreams.Overview.sync-mode"></a>

Amazon RDS のアクティビティストリームは、常に非同期です。データベースセッションでアクティビティストリーミングイベントが生成されると、セッションは直ちに通常のアクティビティに戻ります。バックグラウンドでは、Amazon RDS によりアクティビティストリームイベントが永続的なレコードになります。

バックグラウンドタスクでエラーが発生した場合は、Amazon RDS はイベントを生成します。このイベントは、アクティビティストリーミングのイベントレコードが失われた可能性がある時間枠のスタートと終了を示します。非同期モードでは、アクティビティストリーミングの精度よりもデータベースのパフォーマンスが優先されます。

### データベースアクティビティストリームの要件と制限
<a name="DBActivityStreams.Overview.requirements"></a>

RDS では、データベースアクティビティストリームに、次の要件と制限があります。
+ データベースアクティビティストリーミングには、Amazon Kinesis が必要です。
+ 常に暗号化されているため、アクティビティストリーミングには AWS Key Management Service (AWS KMS) が必要です。
+ Amazon Kinesis データストリームに追加の暗号化を適用することは、AWS KMS キーで暗号化済みのデータベースアクティビティストリーミングと互換性がありません。
+ 監査ポリシーは自分で作成して、管理します。Amazon Aurora とは異なり、RDS for Oracle はデフォルトでデータベースアクティビティをキャプチャしません。
+ 監査ポリシーまたは仕様は自分で作成して、管理します。Amazon Aurora とは異なり、Amazon RDS はデフォルトではデータベースアクティビティをキャプチャしません。
+ マルチ AZ 配置では、プライマリ DB インスタンスのみでデータベースアクティビティストリームを開始してください。アクティビティストリーミングは、プライマリインスタンスとスタンバイ DB インスタンスの両方を自動的に監査します。フェイルオーバー中に追加のステップは必要ありません。
+ DB インスタンスの名前を変更しても、新しい Kinesis ストリームは作成されません。
+ CDB は、RDS for Oracle ではサポートされません。
+ リードレプリカはサポートされていません。

### 利用可能なリージョンとバージョン
<a name="DBActivityStreams.RegionVersionAvailability"></a>

機能の可用性とサポートは、各データベースエンジンの特定のバージョン、および AWS リージョン によって異なります。データベースアクティビティストリーミングでのバージョンとリージョンの可用性の詳細については、「[Amazon RDS のデータベースアクティビティストリームでサポートされているリージョンと DB エンジン](Concepts.RDS_Fea_Regions_DB-eng.Feature.DBActivityStreams.md)」を参照してください。

### データベースアクティビティストリーミングでサポートされる DB インスタンスクラス
<a name="DBActivityStreams.Overview.requirements.classes"></a>

RDS for Oracle では、次の DB インスタンスクラスでデータベースアクティビティストリームを使用できます。
+ db.m4.\$1large
+ db.m5.\$1large
+ db.m5d.\$1large
+ db.m6i.\$1large
+ db.r4.\$1large
+ db.r5.\$1large
+ db.r5.\$1large.tpc\$1.mem\$1x
+ db.r5b.\$1large
+ db.r5b.\$1large.tpc\$1.mem\$1x
+ db.r5d.\$1large
+ db.r6i.\$1large
+ db.r6i.\$1large.tpc\$1.mem\$1x
+ db.x2idn.\$1large
+ db.x2iedn.\$1large
+ db.x2iezn.\$1large
+ db.z1d.\$1large

RDS for Oracle では、次の DB インスタンスクラスでデータベースアクティビティストリームを使用できます。
+ db.m4.\$1large
+ db.m5.\$1large
+ db.m5d.\$1large
+ db.m6i.\$1large
+ db.r4.\$1large
+ db.r5.\$1large
+ db.r5b.\$1large
+ db.r5d.\$1large
+ db.r6i.\$1large
+ db.x1e.\$1large
+ db.x2iedn.\$1large
+ db.z1d.\$1large

インスタンスクラスのタイプの詳細については、「[ DB インスタンスクラス](Concepts.DBInstanceClass.md)」を参照してください。

# Oracle Database の統合監査の設定
<a name="DBActivityStreams.configuring-auditing"></a>

データベースアクティビティストリーミングで使用する統合監査を設定すると、次のような状況が発生する可能性があります。
+ Oracle データベースに対して統合監査は設定されていません。

  この場合、新しいポリシーを `CREATE AUDIT POLICY` コマンドで作成し、それを `AUDIT POLICY` コマンドで有効にします。次の例では、特定の権限とロールを持つユーザーをモニタリングするポリシーの作成および有効化を行います。

  ```
  CREATE AUDIT POLICY table_pol
  PRIVILEGES CREATE ANY TABLE, DROP ANY TABLE
  ROLES emp_admin, sales_admin;
  
  AUDIT POLICY table_pol;
  ```

  詳細な手順については、Oracle Database のドキュメントの「[監査ポリシーの設定](https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-audit-policies.html#GUID-22CDB667-5AA2-4051-A262-FBD0236763CB)」を参照してください。
+ Oracle データベースに対して統合監査が設定されます。

  データベースアクティビティストリームを有効にすると、RDS for Oracle によって既存の監査データが自動的にクリアされます。また、監査証跡権限も取り消されます。RDS for Oracle では、次の処理を実行できなくなります。
  + 統合監査証跡レコードを消去する。
  + 統合監査ポリシーを追加、削除、または変更する。
  + 最後にアーカイブされたタイムスタンプを更新します。
**重要**  
データベースアクティビティストリームを有効にする前に、監査データをバックアップすることを強くお勧めします。

  `UNIFIED_AUDIT_TRAIL` ビューについては、「[UNIFIED\$1AUDIT\$1TRAIL](https://docs.oracle.com/database/121/REFRN/GUID-B7CE1C02-2FD4-47D6-80AA-CF74A60CDD1D.htm#REFRN29162)」を参照してください。Oracle Support のアカウントをお持ちの場合は、「[UNIFIED AUDIT TRAIL を消去する方法](https://support.oracle.com/knowledge/Oracle%20Database%20Products/1582627_1.html)」を参照してください。

# Amazon RDS for Microsoft SQL Server の監査ポリシーの設定
<a name="DBActivityStreams.configuring-auditing-SQLServer"></a>

SQL Server データベースインスタンスにはサーバー監査 `RDS_DAS_AUDIT` があり、Amazon RDS によって管理されます。サーバー監査仕様 `RDS_DAS_SERVER_AUDIT_SPEC` にサーバーイベントを記録するポリシーを定義できます。`RDS_DAS_DB_<name>` などのデータベース監査仕様を作成し、データベースイベントを記録するポリシーを定義できます。サーバーレベルとデータベースレベルの監査アクショングループのリストについては、*Microsoft SQL Server ドキュメント*の「[SQL Server 監査アクショングループとアクション](https://learn.microsoft.com/en-us/sql/relational-databases/security/auditing/sql-server-audit-action-groups-and-actions)」を参照してください。

デフォルトのサーバーポリシーは、失敗したログインと、データベースアクティビティストリームのデータベースまたはサーバー監査仕様の変更のみを監視します。

監査および監査仕様の制限には以下が含まれます。
+ データベースアクティビティストリームが*ロック*状態の場合、サーバーまたはデータベースの監査仕様を変更することはできません。
+ サーバー監査 `RDS_DAS_AUDIT` の仕様は変更できません。
+ SQL Server 監査 `RDS_DAS_CHANGES` または関連するサーバー監査仕様 `RDS_DAS_CHANGES_AUDIT_SPEC` は変更できません。
+ データベース監査仕様を作成するときには、`RDS_DAS_DB_databaseActions` などの形式 `RDS_DAS_DB_<name>` を使用する必要があります。

**重要**  
小規模なインスタンスクラスでは、すべてを監査せず、必要なデータだけを監査することをお勧めします。これにより、これらのインスタンスクラスに対するデータベースアクティビティストリームのパフォーマンスへの影響を軽減できます。

次のサンプルコードは、サーバー監査仕様 `RDS_DAS_SERVER_AUDIT_SPEC` を変更し、ログアウトと成功したログインアクションを監査します。

```
ALTER SERVER AUDIT SPECIFICATION [RDS_DAS_SERVER_AUDIT_SPEC]
      WITH (STATE=OFF);
ALTER SERVER AUDIT SPECIFICATION [RDS_DAS_SERVER_AUDIT_SPEC]
      ADD (LOGOUT_GROUP),
      ADD (SUCCESSFUL_LOGIN_GROUP)
      WITH (STATE = ON );
```

次のサンプルコードは、データベース監査仕様 `RDS_DAS_DB_database_spec` を作成し、それをサーバー監査 `RDS_DAS_AUDIT` に添付します。

```
USE testDB;
CREATE DATABASE AUDIT SPECIFICATION [RDS_DAS_DB_database_spec]
     FOR SERVER AUDIT [RDS_DAS_AUDIT]
     ADD ( INSERT, UPDATE, DELETE  
          ON testTable BY testUser )  
     WITH (STATE = ON);
```

監査仕様を設定したら、仕様 `RDS_DAS_SERVER_AUDIT_SPEC` および `RDS_DAS_DB_<name>` が `ON` の状態に設定されていることを確認します。これで、監査データをデータベースアクティビティストリームに送信できます。

# データベースアクティビティストリーミングのスタート
<a name="DBActivityStreams.Enabling"></a>

DB インスタンスのアクティビティストリームを開始すると、監査ポリシーで設定したデータベースアクティビティイベントごとに、アクティビティストリームイベントが生成されます。アクセスイベントは `CONNECT`、`SELECT` などの SQL コマンドから生成されます。変更イベントは `CREATE`、`INSERT` などの SQL コマンドから生成されます。

**重要**  
Oracle DB インスタンスのアクティビティストリーミングを有効にすると、既存の監査データが消去されます。また、監査証跡権限も取り消されます。ストリーミングを有効にすると、RDS for Oracle では次の処理を実行できなくなります。  
統合監査証跡レコードを消去する。
統合監査ポリシーを追加、削除、または変更する。
最後にアーカイブされたタイムスタンプを更新する。

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

**データベースアクティビティストリーミングをスタートするには**

1. Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、**[Databases]** (データベース) を選択します。

1. アクティビティストリームを有効にする Amazon RDS データベースインスタンスを選択します。マルチ AZ 配置では、プライマリインスタンスのみでストリーミングをスタートします。アクティビティストリーミングは、プライマリインスタンスとスタンバイインスタンスの両方を監査します。

1. [**アクション**] で [**アクティビティストリーミングの開始**] を選択します。

   [**データベースアクティビティストリーミングの開始: ***名前*] ウィンドウが表示されます。ここで、*name* は RDS インスタンスです。

1. 以下の設定を入力します。
   + [**AWS KMS key**] では、 AWS KMS keys のリストからキーを選択します。

     Amazon RDS は、KMS キーを使用してキーを暗号化し、それによってデータベースアクティビティを暗号化します。デフォルトキー以外の KMS キーを選択します。暗号化キーと AWS KMS の詳細については、*AWS Key Management Service デベロッパーガイド*の「[AWS Key Management Service とは？](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)」を参照してください。
   + **[データベースアクティビティイベント]** で、**[エンジンネイティブ監査フィールドを有効にする]** を選択して、エンジン固有の監査フィールドを含めます。
   + [**すぐに適用**] を選択します。

     **[直ちに]** を選択する場合直ちにとすると、RDS インスタンスがすぐに再起動します。を選択すると**次のメンテナンス時間中**とすると、RDS インスタンスはすぐには再起動しません。この場合、データベースアクティビティストリーミングは、次のメンテナンスウィンドウまでスタートされません。

1. **[Start database activity stream]** (データベースアクティビティストリームを開始) を選択します。

   データベースのステータスは、アクティビティストリームが開始していることを示します。
**注記**  
`You can't start a database activity stream in this configuration` というエラーが表示された場合は、[データベースアクティビティストリーミングでサポートされる DB インスタンスクラス](DBActivityStreams.md#DBActivityStreams.Overview.requirements.classes) で RDS インスタンスがサポートされているインスタンスクラスを使用しているかを確認してください。

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

DB インスタンスのデータベースアクティビティストリームを開始するには、AWS CLI コマンド [start-activity-stream](https://docs.aws.amazon.com/cli/latest/reference/rds/start-activity-stream.html) を使用して データベースを設定します。
+ `--resource-arn arn` - DB インスタンスの Amazon リソースネーム (ARN) を指定します。
+ `--kms-key-id key` - データベースアクティビティストリーミング内のメッセージを暗号化するための KMS キー識別子を指定します。AWS KMS キー識別子は、キー ARN、キー ID、エイリアス ARN、または AWS KMS key のエイリアス名です。
+ `--engine-native-audit-fields-included` - エンジン固有の監査フィールドをデータストリームに含めます。これらのフィールドを除外するには、`--no-engine-native-audit-fields-included` (デフォルト) を指定します。

次の例では、非同期モードで DB インスタンスのデータベースアクティビティストリームを開始します。

Linux、macOS、Unix の場合:

```
aws rds start-activity-stream \
    --mode async \
    --kms-key-id my-kms-key-arn \
    --resource-arn my-instance-arn \
    --engine-native-audit-fields-included \
    --apply-immediately
```

Windows の場合:

```
aws rds start-activity-stream ^
    --mode async ^
    --kms-key-id my-kms-key-arn ^
    --resource-arn my-instance-arn ^
    --engine-native-audit-fields-included ^
    --apply-immediately
```

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

DB インスタンスのデータベースアクティビティストリームを開始するには、[StartActivityStream](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_StartActivityStream.html) オペレーションを使用してインスタンスを設定します。

以下のパラメータを使用してアクションを呼び出します。
+ `Region`
+ `KmsKeyId`
+ `ResourceArn`
+ `Mode`
+ `EngineNativeAuditFieldsIncluded`

------

# Amazon RDS のデータベースアクティビティストリーミングの変更
<a name="DBActivityStreams.Modifying"></a>

アクティビティストリームの開始時に Amazon RDS 監査ポリシーをカスタマイズしたい場合があります。アクティビティストリーミングを停止して時間とデータを失いたくない場合は、*ポリシーの状態の監査*を以下のいずれかの設定に変更します。

**ロック (デフォルト)**  
データベース内の監査ポリシーは読み取り専用です。

**ロック解除**  
データベース内の監査ポリシーは、読み取り/書き込みが可能です。

基本的なステップは次のとおりです。

1. 監査ポリシーの状態をロック解除に変更します。

1. 監査ポリシーをカスタマイズします。

1. 監査ポリシーの状態をロックに変更します。

## コンソール
<a name="DBActivityStreams.Modifying-collapsible-section-E1"></a>

**アクティビティストリーミングの監査ポリシーステータスを変更するには**

1. Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**データベース**] を選択します。

1. **[Actions]** (アクション) で、選択してください**[Modify database activity stream]** (データベースアクティビティストリーミングの変更) を選択します。

   **[Modify database activity stream: *name*]** (データベースアクティビティストリームの変更: 名前) ウィンドウが表示されます。ここで、*名前*は RDS インスタンスです。

1. 次のいずれかのオプションを選択します。  
**ロック**  
監査ポリシーをロックすると、読み取り専用になります。ポリシーをロック解除するか、アクティビティストリーミングを停止しない限り、監査ポリシーを編集することはできません。  
**ロック解除**  
監査ポリシーをロック解除すると、読み取り/書き込みが可能になります。アクティビティストリーミングの起動中に監査ポリシーを編集できます。

1. **[Modify DB activity stream]** (DB アクティビティストリーミングの変更) を選択します。

   Amazon RDS データベースのステータスは、**[アクティビティストリームの設定中]** と表示されます。

1. (オプション) DB インスタンスリンクを選択します。そして、[**Configuration (設定)**] タブを選択します。

   **[Audit policy status]** (ポリシーステータスの監査) フィールドには、次のいずれかの値が表示されます。
   + **ロック**
   + **ロック解除**
   + **ロックのポリシー**
   + **ロック解除のポリシー**

## AWS CLI
<a name="DBActivityStreams.Modifying-collapsible-section-E2"></a>

データベースインスタンスのアクティビティストリームの状態を変更するには、[modify-activity-stream](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-activity-stream.html) AWS CLI コマンドを使用します。


****  

| オプション | 必須? | [Description] (説明) | 
| --- | --- | --- | 
|  `--resource-arn my-instance-ARN`  |  可能  |  RDS データベースインスタンスの Amazon リソースネーム (ARN)。  | 
|  `--audit-policy-state`  |  不可  |  インスタンスのデータベースアクティビティストリーミングの監査ポリシーの新しい状態: `locked` または `unlocked`。  | 

次の例では、*my-instance-ARN* で起動されたアクティビティストリーミングの監査ポリシーをロック解除します。

Linux、macOS、Unix の場合:

```
aws rds modify-activity-stream \
    --resource-arn my-instance-ARN \
    --audit-policy-state unlocked
```

Windows の場合:

```
aws rds modify-activity-stream ^
    --resource-arn my-instance-ARN ^
    --audit-policy-state unlocked
```

次の例ではインスタンス *my-instance* について説明します。出力例の一部は、監査ポリシーがロック解除されていることを示しています。

```
aws rds describe-db-instances --db-instance-identifier my-instance

{
    "DBInstances": [
        {
            ...
            "Engine": "oracle-ee",
            ...
            "ActivityStreamStatus": "started",
            "ActivityStreamKmsKeyId": "ab12345e-1111-2bc3-12a3-ab1cd12345e",
            "ActivityStreamKinesisStreamName": "aws-rds-das-db-AB1CDEFG23GHIJK4LMNOPQRST",
            "ActivityStreamMode": "async",
            "ActivityStreamEngineNativeAuditFieldsIncluded": true, 
            "ActivityStreamPolicyStatus": "unlocked",
            ...
        }
    ]
}
```

## RDS API
<a name="DBActivityStreams.Modifying-collapsible-section-E3"></a>

データベースアクティビティストリーミングのポリシーステートを変更するには、[ModifyActivityStream](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyActivityStream.html) オペレーションを使用します。

以下のパラメータを使用してアクションを呼び出します。
+ `AuditPolicyState`
+ `ResourceArn`

# データベースアクティビティストリーミングのステータスの取得
<a name="DBActivityStreams.Status"></a>

Amazon RDS データベースインスタンスのアクティビティストリームのステータスを取得するには、コンソールまたは AWS CLI を使用します。

## コンソール
<a name="DBActivityStreams.Status-collapsible-section-S1"></a>

**データベースアクティビティストリーミングのステータスを取得するには**

1. Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**データベース**] を選択し、DB インスタンスのリンクを選択します。

1. [**設定**] タブを選択して、ステータスを取得する [**データベースアクティビティストリーミング**] をオンにします。

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

[describe-db-instances](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) CLI リクエストに対するレスポンスとして、データベースインスタンスのアクティビティストリーム設定を取得できます。

次の例は、 *my-instance* を説明します。

```
aws rds --region my-region describe-db-instances --db-instance-identifier my-db
```

以下は JSON レスポンスの例です。次のフィールドが表示されます。
+ `ActivityStreamKinesisStreamName`
+ `ActivityStreamKmsKeyId`
+ `ActivityStreamStatus`
+ `ActivityStreamMode`
+ `ActivityStreamPolicyStatus`



```
{
    "DBInstances": [
        {
            ...
            "Engine": "oracle-ee",
            ...
            "ActivityStreamStatus": "starting",
            "ActivityStreamKmsKeyId": "ab12345e-1111-2bc3-12a3-ab1cd12345e",
            "ActivityStreamKinesisStreamName": "aws-rds-das-db-AB1CDEFG23GHIJK4LMNOPQRST",
            "ActivityStreamMode": "async",
            "ActivityStreamEngineNativeAuditFieldsIncluded": true, 
            "ActivityStreamPolicyStatus": locked",
            ...
        }
    ]
}
```

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

 [DescribeDBInstances](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBInstances.html) オペレーションに対するレスポンスとして、データベースのアクティビティストリーミングの設定を取得できます。

# データベースアクティビティストリーミングの停止
<a name="DBActivityStreams.Disabling"></a>

アクティビティストリーミングを停止するには、コンソールまたは AWS CLI を使用します。

Amazon RDS データベースインスタンスを削除すると、アクティビティストリームが停止し、基になる Amazon Kinesis ストリームが自動的に削除されます。

## コンソール
<a name="DBActivityStreams.Disabling-collapsible-section-D1"></a>

**アクティビティストリーミングを停止するには**

1. Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**データベース**] を選択します。

1. データベースアクティビティストリーミングを停止する データベースを選択します。

1. [**アクション**] で [**アクティビティストリーミングの停止**] を選択します。[**データベースアクティビティストリーミング**] ウィンドウが表示されます。

   1. [**すぐに適用**] を選択します。

      **[直ちに]** を選択する場合直ちにとすると、RDS インスタンスがすぐに再起動します。を選択すると**次のメンテナンス時間中**とすると、RDS インスタンスはすぐには再起動しません。この場合、データベースアクティビティストリーミングは、次のメンテナンスウィンドウまで停止しません。

   1. [**続行**] を選択します。

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

データベースのデータベースアクティビティストリーミングを停止するには、AWS CLI コマンドの [stop-activity-stream](https://docs.aws.amazon.com/cli/latest/reference/rds/stop-activity-stream.html) を使用して DB インスタンスを設定します。のDB インスタンスの AWS リージョンを識別するには、`--region` パラメータを指定します。`--apply-immediately` パラメータはオプションです。

Linux、macOS、Unix の場合:

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

Windows の場合:

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

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

データベースのデータベースアクティビティストリーミングを停止するには、[StopActivityStream](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_StopActivityStream.html) オペレーションを使用して、DB インスタンスを設定します。のDB インスタンスの AWS リージョンを識別するには、`Region` パラメータを指定します。`ApplyImmediately` パラメータはオプションです。

# データベースアクティビティストリーミングのモニタリング
<a name="DBActivityStreams.Monitoring"></a>

データベースアクティビティストリーミングは、アクティビティをモニタリングして報告します。アクティビティのストリーミングは、収集後、Amazon Kinesis に送信されます。Kinesis から、アクティビティストリーミングをモニタリングしたり、他のサービスやアプリケーションがアクティビティストリーミングを使用して詳細な分析を行うことができます。基礎となる Kinesis ストリーム名は、AWS CLI コマンドの `describe-db-instances` または RDS API `DescribeDBInstances` オペレーションを使用して検索できます。

Amazon RDS は、Kinesis ストリーミングを次のように管理します。
+ Amazon RDS は、24 時間の保存期間の Kinesis ストリーミングを自動的に作成します。
+  Amazon RDS は、必要に応じて Kinesis ストリーミングをスケールします。
+  データベースアクティビティストリーミングを停止したり、DB インスタンスを削除したりすると、Amazon RDS によって Kinesis ストリームが削除されます。

以下のカテゴリのアクティビティがモニタリングされ、アクティビティストリーミングの監査ログに追加されます。
+ **SQL コマンド** - すべての SQL コマンドに加えて、準備済みステートメント、組み込み関数、および PL/SQL の関数も監査されます。ストアドプロシージャへの呼び出しが監査されます。ストアドプロシージャまたは関数内で発行された SQL ステートメントも監査されます。
+ **他のデータベース情報** - モニタリングされるアクティビティには、完全な SQL ステートメント、DML コマンドから影響を受ける行の行数、アクセスされたオブジェクト、および一意のデータベース名が含まれます。また、データベースアクティビティストリーミングは、バインド可変とストアドプロシージャパラメータもモニタリングします。
**重要**  
各ステートメントの完全な SQL テキストは、機密データを含むアクティビティストリーミング監査ログに表示されます。ただし、Oracle が次の SQL ステートメントのようにコンテキストから判断できる場合、データベースユーザーのパスワードは訂正されます。  

  ```
  ALTER ROLE role-name WITH password
  ```
+ **接続情報** - モニタリングされるアクティビティには、セッションとネットワークの情報、サーバープロセス ID、および終了コードなどがあります。

DB インスタンスのモニタリング中にアクティビティストリーミングに障害が発生した場合は、RDS イベントを通じて通知されます。

以下のセクションでは、データベースアクティビティストリームへのアクセス、監査、処理を行うことができます。

**Topics**
+ [Amazon Kinesis からのアクティビティストリーミングへのアクセス](DBActivityStreams.KinesisAccess.md)
+ [データベースアクティビティストリームの監査ログコンテンツおよび例](DBActivityStreams.AuditLog.md)
+ [データベースアクティビティストリームの databaseActivityEventList JSON 配列](DBActivityStreams.AuditLog.databaseActivityEventList.md)
+ [AWS SDK を使用したデータベースアクティビティストリーミングの処理](DBActivityStreams.CodeExample.md)

# Amazon Kinesis からのアクティビティストリーミングへのアクセス
<a name="DBActivityStreams.KinesisAccess"></a>

データベースのアクティビティストリーミングを有効にすると、Kinesis ストリーミングが作成されます。データベースのアクティビティは、Kinesis からリアルタイムでモニタリングできます。データベースのアクティビティを詳細に分析するには、Kinesis ストリーミングをコンシューマーアプリケーションに接続します。また、IBM の Security Guardium または Imperva の SecureSphere Database Audit and Protection などのコンプライアンス管理アプリケーションにストリーミングを接続することもできます。

Kinesis ストリームには、RDS コンソールまたは Kinesis コンソールからアクセスできます。

**RDS コンソールを使用して、Kinesis からアクティビティストリーミングにアクセスするには**

1. Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、[**データベース**] を選択します。

1. アクティビティストリームを開始する Amazon RDS データベースインスタンスを選択します。

1. **[設定]** を選択します。

1. **[Database activity stream]** (データベースアクティビティストリーム) で、**[Kinesis stream]** (Kinesis ストリーム) の下のリンクを選択します。

1. データベースアクティビティの観察を開始するには、Kinesis コンソールで **[Monitoring]** (モニタリング) を選択します。

**Kinesis コンソールを使用して、Kinesis からアクティビティストリーミングにアクセスするには**

1. Kinesis コンソール ([https://console.aws.amazon.com/kinesis](https://console.aws.amazon.com/kinesis)) を開きます。

1. Kinesis ストリーミングのリストからアクティビティストリーミングを選択します。

   アクティビティストリーミングの名前には、プレフィックス `aws-rds-das-db-` が付き、その後に データベースのリソース ID が続きます。次に例を示します。

   ```
   aws-rds-das-db-NHVOV4PCLWHGF52NP
   ```

   Amazon RDS コンソールを使用して データベースのリソース ID を検索するには、データベースのリストから DB インスタンスを選択した上で、[**設定**] タブを選択します。

   AWS CLI を使用して、アクティビティストリーミングの Kinesis ストリームの完全な名前を検索するには、 [describe-db-instances](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) CLI リクエストを使用し、そのレスポンスに含まれる `ActivityStreamKinesisStreamName` の値を書き留めます。

1. データベースアクティビティの観察をスタートするには、[**モニタリング**] を選択します。

Amazon Kinesis の使用の詳細については、「[Amazon Kinesis Data Streams とは](https://docs.aws.amazon.com/streams/latest/dev/introduction.html)」を参照してください。

# データベースアクティビティストリームの監査ログコンテンツおよび例
<a name="DBActivityStreams.AuditLog"></a>

モニタリングされるイベントは、データベースアクティビティストリーミングでは JSON 文字列として表されます。この構造は、`DatabaseActivityMonitoringRecord` を含む JSON オブジェクトで構成されます。このオブジェクトには、アクティビティイベントの `databaseActivityEventList` 配列が含まれます。

**注記**  
データベースアクティビティストリームの場合、`paramList` JSON 配列には Hibernate アプリケーションからの null 値は含まれません。

**Topics**
+ [アクティビティストリーミングの監査ログの例](#DBActivityStreams.AuditLog.Examples)
+ [DatabaseActivityMonitoringRecords JSON オブジェクト](#DBActivityStreams.AuditLog.DatabaseActivityMonitoringRecords)
+ [databaseActivityEvents JSON オブジェクト](#DBActivityStreams.AuditLog.databaseActivityEvents)

## アクティビティストリーミングの監査ログの例
<a name="DBActivityStreams.AuditLog.Examples"></a>

以下に、アクティビティイベントレコードの復号されたサンプルの JSON 監査ログを示します。

**Example CONNECT SQL ステートメント のアクティビティイベントレコード**  
次のアクティビティイベントレコードは、Oracle DB について、JDBC Thin Client (`clientApplication`) による `CONNECT` SQL ステートメント (`command`) を使用したログインを示しています。  

```
{
    "class": "Standard",
    "clientApplication": "JDBC Thin Client",
    "command": "LOGON",
    "commandText": null,
    "dbid": "0123456789",
    "databaseName": "ORCL",
    "dbProtocol": "oracle",
    "dbUserName": "TEST",
    "endTime": null,
    "errorMessage": null,
    "exitCode": 0,
    "logTime": "2021-01-15 00:15:36.233787",
    "netProtocol": "tcp",
    "objectName": null,
    "objectType": null,
    "paramList": [],
    "pid": 17904,
    "remoteHost": "123.456.789.012",
    "remotePort": "25440",
    "rowCount": null,
    "serverHost": "987.654.321.098",
    "serverType": "oracle",
    "serverVersion": "19.0.0.0.ru-2020-01.rur-2020-01.r1.EE.3",
    "serviceName": "oracle-ee",
    "sessionId": 987654321,
    "startTime": null,
    "statementId": 1,
    "substatementId": null,
    "transactionId": "0000000000000000",
    "engineNativeAuditFields": {
        "UNIFIED_AUDIT_POLICIES": "TEST_POL_EVERYTHING",
        "FGA_POLICY_NAME": null,
        "DV_OBJECT_STATUS": null,
        "SYSTEM_PRIVILEGE_USED": "CREATE SESSION",
        "OLS_LABEL_COMPONENT_TYPE": null,
        "XS_SESSIONID": null,
        "ADDITIONAL_INFO": null,
        "INSTANCE_ID": 1,
        "DBID": 123456789
        "DV_COMMENT": null,
        "RMAN_SESSION_STAMP": null,
        "NEW_NAME": null,
        "DV_ACTION_NAME": null,
        "OLS_PROGRAM_UNIT_NAME": null,
        "OLS_STRING_LABEL": null,
        "RMAN_SESSION_RECID": null,
        "OBJECT_PRIVILEGES": null,
        "OLS_OLD_VALUE": null,
        "XS_TARGET_PRINCIPAL_NAME": null,
        "XS_NS_ATTRIBUTE": null,
        "XS_NS_NAME": null,
        "DBLINK_INFO": null,
        "AUTHENTICATION_TYPE": "(TYPE\u003d(DATABASE));(CLIENT ADDRESS\u003d((ADDRESS\u003d(PROTOCOL\u003dtcp)(HOST\u003d205.251.233.183)(PORT\u003d25440))));",
        "OBJECT_EDITION": null,
        "OLS_PRIVILEGES_GRANTED": null,
        "EXCLUDED_USER": null,
        "DV_ACTION_OBJECT_NAME": null,
        "OLS_LABEL_COMPONENT_NAME": null,
        "EXCLUDED_SCHEMA": null,
        "DP_TEXT_PARAMETERS1": null,
        "XS_USER_NAME": null,
        "XS_ENABLED_ROLE": null,
        "XS_NS_ATTRIBUTE_NEW_VAL": null,
        "DIRECT_PATH_NUM_COLUMNS_LOADED": null,
        "AUDIT_OPTION": null,
        "DV_EXTENDED_ACTION_CODE": null,
        "XS_PACKAGE_NAME": null,
        "OLS_NEW_VALUE": null,
        "DV_RETURN_CODE": null,
        "XS_CALLBACK_EVENT_TYPE": null,
        "USERHOST": "a1b2c3d4e5f6.amazon.com",
        "GLOBAL_USERID": null,
        "CLIENT_IDENTIFIER": null,
        "RMAN_OPERATION": null,
        "TERMINAL": "unknown",
        "OS_USERNAME": "sumepate",
        "OLS_MAX_READ_LABEL": null,
        "XS_PROXY_USER_NAME": null,
        "XS_DATASEC_POLICY_NAME": null,
        "DV_FACTOR_CONTEXT": null,
        "OLS_MAX_WRITE_LABEL": null,
        "OLS_PARENT_GROUP_NAME": null,
        "EXCLUDED_OBJECT": null,
        "DV_RULE_SET_NAME": null,
        "EXTERNAL_USERID": null,
        "EXECUTION_ID": null,
        "ROLE": null,
        "PROXY_SESSIONID": 0,
        "DP_BOOLEAN_PARAMETERS1": null,
        "OLS_POLICY_NAME": null,
        "OLS_GRANTEE": null,
        "OLS_MIN_WRITE_LABEL": null,
        "APPLICATION_CONTEXTS": null,
        "XS_SCHEMA_NAME": null,
        "DV_GRANTEE": null,
        "XS_COOKIE": null,
        "DBPROXY_USERNAME": null,
        "DV_ACTION_CODE": null,
        "OLS_PRIVILEGES_USED": null,
        "RMAN_DEVICE_TYPE": null,
        "XS_NS_ATTRIBUTE_OLD_VAL": null,
        "TARGET_USER": null,
        "XS_ENTITY_TYPE": null,
        "ENTRY_ID": 1,
        "XS_PROCEDURE_NAME": null,
        "XS_INACTIVITY_TIMEOUT": null,
        "RMAN_OBJECT_TYPE": null,
        "SYSTEM_PRIVILEGE": null,
        "NEW_SCHEMA": null,
        "SCN": 5124715
    }
}
```
次のアクティビティイベントレコードは、SQL Server DB のログイン失敗を示しています。  

```
{
    "type": "DatabaseActivityMonitoringRecord",
    "clusterId": "",
    "instanceId": "db-4JCWQLUZVFYP7DIWP6JVQ77O3Q",
    "databaseActivityEventList": [
        {
            "class": "LOGIN",
            "clientApplication": "Microsoft SQL Server Management Studio",
            "command": "LOGIN FAILED",
            "commandText": "Login failed for user 'test'. Reason: Password did not match that for the login provided. [CLIENT: local-machine]",
            "databaseName": "",
            "dbProtocol": "SQLSERVER",
            "dbUserName": "test",
            "endTime": null,
            "errorMessage": null,
            "exitCode": 0,
            "logTime": "2022-10-06 21:34:42.7113072+00",
            "netProtocol": null,
            "objectName": "",
            "objectType": "LOGIN",
            "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": 0,
            "startTime": null,
            "statementId": "0x1eb0d1808d34a94b9d3dcf5432750f02",
            "substatementId": 1,
            "transactionId": "0",
            "type": "record",
            "engineNativeAuditFields": {
                "target_database_principal_id": 0,
                "target_server_principal_id": 0,
                "target_database_principal_name": "",
                "server_principal_id": 0,
                "user_defined_information": "",
                "response_rows": 0,
                "database_principal_name": "",
                "target_server_principal_name": "",
                "schema_name": "",
                "is_column_permission": false,
                "object_id": 0,
                "server_instance_name": "EC2AMAZ-NFUJJNO",
                "target_server_principal_sid": null,
                "additional_information": "<action_info "xmlns=\"http://schemas.microsoft.com/sqlserver/2008/sqlaudit_data\"><pooled_connection>0</pooled_connection><error>0x00004818</error><state>8</state><address>local machine</address><PasswordFirstNibbleHash>B</PasswordFirstNibbleHash></action_info>"-->,
                "duration_milliseconds": 0,
                "permission_bitmask": "0x00000000000000000000000000000000",
                "data_sensitivity_information": "",
                "session_server_principal_name": "",
                "connection_id": "98B4F537-0F82-49E3-AB08-B9D33B5893EF",
                "audit_schema_version": 1,
                "database_principal_id": 0,
                "server_principal_sid": null,
                "user_defined_event_id": 0,
                "host_name": "EC2AMAZ-NFUJJNO"
            }
        }
    ]
}
```
データベースアクティビティストリーミングが有効になっていない場合、JSON ドキュメントの最後のフィールドは `"engineNativeAuditFields": { }` になります。

**Example CREATE TABLE ステートメントのアクティビティイベントレコード**  
次の例は、Oracle データベースの `CREATE TABLE` イベントを示しています。  

```
{
    "class": "Standard",
    "clientApplication": "sqlplus@ip-12-34-5-678 (TNS V1-V3)",
    "command": "CREATE TABLE",
    "commandText": "CREATE TABLE persons(\n    person_id NUMBER GENERATED BY DEFAULT AS IDENTITY,\n    first_name VARCHAR2(50) NOT NULL,\n    last_name VARCHAR2(50) NOT NULL,\n    PRIMARY KEY(person_id)\n)",
    "dbid": "0123456789",
    "databaseName": "ORCL",
    "dbProtocol": "oracle",
    "dbUserName": "TEST",
    "endTime": null,
    "errorMessage": null,
    "exitCode": 0,
    "logTime": "2021-01-15 00:22:49.535239",
    "netProtocol": "beq",
    "objectName": "PERSONS",
    "objectType": "TEST",
    "paramList": [],
    "pid": 17687,
    "remoteHost": "123.456.789.0",
    "remotePort": null,
    "rowCount": null,
    "serverHost": "987.654.321.01",
    "serverType": "oracle",
    "serverVersion": "19.0.0.0.ru-2020-01.rur-2020-01.r1.EE.3",
    "serviceName": "oracle-ee",
    "sessionId": 1234567890,
    "startTime": null,
    "statementId": 43,
    "substatementId": null,
    "transactionId": "090011007F0D0000",
    "engineNativeAuditFields": {
        "UNIFIED_AUDIT_POLICIES": "TEST_POL_EVERYTHING",
        "FGA_POLICY_NAME": null,
        "DV_OBJECT_STATUS": null,
        "SYSTEM_PRIVILEGE_USED": "CREATE SEQUENCE, CREATE TABLE",
        "OLS_LABEL_COMPONENT_TYPE": null,
        "XS_SESSIONID": null,
        "ADDITIONAL_INFO": null,
        "INSTANCE_ID": 1,
        "DV_COMMENT": null,
        "RMAN_SESSION_STAMP": null,
        "NEW_NAME": null,
        "DV_ACTION_NAME": null,
        "OLS_PROGRAM_UNIT_NAME": null,
        "OLS_STRING_LABEL": null,
        "RMAN_SESSION_RECID": null,
        "OBJECT_PRIVILEGES": null,
        "OLS_OLD_VALUE": null,
        "XS_TARGET_PRINCIPAL_NAME": null,
        "XS_NS_ATTRIBUTE": null,
        "XS_NS_NAME": null,
        "DBLINK_INFO": null,
        "AUTHENTICATION_TYPE": "(TYPE\u003d(DATABASE));(CLIENT ADDRESS\u003d((PROTOCOL\u003dbeq)(HOST\u003d123.456.789.0)));",
        "OBJECT_EDITION": null,
        "OLS_PRIVILEGES_GRANTED": null,
        "EXCLUDED_USER": null,
        "DV_ACTION_OBJECT_NAME": null,
        "OLS_LABEL_COMPONENT_NAME": null,
        "EXCLUDED_SCHEMA": null,
        "DP_TEXT_PARAMETERS1": null,
        "XS_USER_NAME": null,
        "XS_ENABLED_ROLE": null,
        "XS_NS_ATTRIBUTE_NEW_VAL": null,
        "DIRECT_PATH_NUM_COLUMNS_LOADED": null,
        "AUDIT_OPTION": null,
        "DV_EXTENDED_ACTION_CODE": null,
        "XS_PACKAGE_NAME": null,
        "OLS_NEW_VALUE": null,
        "DV_RETURN_CODE": null,
        "XS_CALLBACK_EVENT_TYPE": null,
        "USERHOST": "ip-10-13-0-122",
        "GLOBAL_USERID": null,
        "CLIENT_IDENTIFIER": null,
        "RMAN_OPERATION": null,
        "TERMINAL": "pts/1",
        "OS_USERNAME": "rdsdb",
        "OLS_MAX_READ_LABEL": null,
        "XS_PROXY_USER_NAME": null,
        "XS_DATASEC_POLICY_NAME": null,
        "DV_FACTOR_CONTEXT": null,
        "OLS_MAX_WRITE_LABEL": null,
        "OLS_PARENT_GROUP_NAME": null,
        "EXCLUDED_OBJECT": null,
        "DV_RULE_SET_NAME": null,
        "EXTERNAL_USERID": null,
        "EXECUTION_ID": null,
        "ROLE": null,
        "PROXY_SESSIONID": 0,
        "DP_BOOLEAN_PARAMETERS1": null,
        "OLS_POLICY_NAME": null,
        "OLS_GRANTEE": null,
        "OLS_MIN_WRITE_LABEL": null,
        "APPLICATION_CONTEXTS": null,
        "XS_SCHEMA_NAME": null,
        "DV_GRANTEE": null,
        "XS_COOKIE": null,
        "DBPROXY_USERNAME": null,
        "DV_ACTION_CODE": null,
        "OLS_PRIVILEGES_USED": null,
        "RMAN_DEVICE_TYPE": null,
        "XS_NS_ATTRIBUTE_OLD_VAL": null,
        "TARGET_USER": null,
        "XS_ENTITY_TYPE": null,
        "ENTRY_ID": 12,
        "XS_PROCEDURE_NAME": null,
        "XS_INACTIVITY_TIMEOUT": null,
        "RMAN_OBJECT_TYPE": null,
        "SYSTEM_PRIVILEGE": null,
        "NEW_SCHEMA": null,
        "SCN": 5133083
    }
}
```
次の例は、SQL Server データベースの `CREATE TABLE` イベントを示しています。  

```
{
    "type": "DatabaseActivityMonitoringRecord",
    "clusterId": "",
    "instanceId": "db-4JCWQLUZVFYP7DIWP6JVQ77O3Q",
    "databaseActivityEventList": [
        {
            "class": "SCHEMA",
            "clientApplication": "Microsoft SQL Server Management Studio - Query",
            "command": "ALTER",
            "commandText": "Create table [testDB].[dbo].[TestTable2](\r\ntextA varchar(6000),\r\n    textB varchar(6000)\r\n)",
            "databaseName": "testDB",
            "dbProtocol": "SQLSERVER",
            "dbUserName": "test",
            "endTime": null,
            "errorMessage": null,
            "exitCode": 1,
            "logTime": "2022-10-06 21:44:38.4120677+00",
            "netProtocol": null,
            "objectName": "dbo",
            "objectType": "SCHEMA",
            "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": 84,
            "startTime": null,
            "statementId": "0x5178d33d56e95e419558b9607158a5bd",
            "substatementId": 1,
            "transactionId": "4561864",
            "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": "",
                "is_column_permission": false,
                "object_id": 1,
                "server_instance_name": "EC2AMAZ-NFUJJNO",
                "target_server_principal_sid": null,
                "additional_information": "",
                "duration_milliseconds": 0,
                "permission_bitmask": "0x00000000000000000000000000000000",
                "data_sensitivity_information": "",
                "session_server_principal_name": "test",
                "connection_id": "EE1FE3FD-EF2C-41FD-AF45-9051E0CD983A",
                "audit_schema_version": 1,
                "database_principal_id": 1,
                "server_principal_sid": "0x010500000000000515000000bdc2795e2d0717901ba6998cf4010000",
                "user_defined_event_id": 0,
                "host_name": "EC2AMAZ-NFUJJNO"
            }
        }
    ]
}
```

**Example SELECT ステートメントのアクティビティイベントレコード**  
次の例は、Oracle DB の `SELECT` イベントを示しています。  

```
{
    "class": "Standard",
    "clientApplication": "sqlplus@ip-12-34-5-678 (TNS V1-V3)",
    "command": "SELECT",
    "commandText": "select count(*) from persons",
    "databaseName": "1234567890",
    "dbProtocol": "oracle",
    "dbUserName": "TEST",
    "endTime": null,
    "errorMessage": null,
    "exitCode": 0,
    "logTime": "2021-01-15 00:25:18.850375",
    "netProtocol": "beq",
    "objectName": "PERSONS",
    "objectType": "TEST",
    "paramList": [],
    "pid": 17687,
    "remoteHost": "123.456.789.0",
    "remotePort": null,
    "rowCount": null,
    "serverHost": "987.654.321.09",
    "serverType": "oracle",
    "serverVersion": "19.0.0.0.ru-2020-01.rur-2020-01.r1.EE.3",
    "serviceName": "oracle-ee",
    "sessionId": 1080639707,
    "startTime": null,
    "statementId": 44,
    "substatementId": null,
    "transactionId": null,
    "engineNativeAuditFields": {
        "UNIFIED_AUDIT_POLICIES": "TEST_POL_EVERYTHING",
        "FGA_POLICY_NAME": null,
        "DV_OBJECT_STATUS": null,
        "SYSTEM_PRIVILEGE_USED": null,
        "OLS_LABEL_COMPONENT_TYPE": null,
        "XS_SESSIONID": null,
        "ADDITIONAL_INFO": null,
        "INSTANCE_ID": 1,
        "DV_COMMENT": null,
        "RMAN_SESSION_STAMP": null,
        "NEW_NAME": null,
        "DV_ACTION_NAME": null,
        "OLS_PROGRAM_UNIT_NAME": null,
        "OLS_STRING_LABEL": null,
        "RMAN_SESSION_RECID": null,
        "OBJECT_PRIVILEGES": null,
        "OLS_OLD_VALUE": null,
        "XS_TARGET_PRINCIPAL_NAME": null,
        "XS_NS_ATTRIBUTE": null,
        "XS_NS_NAME": null,
        "DBLINK_INFO": null,
        "AUTHENTICATION_TYPE": "(TYPE\u003d(DATABASE));(CLIENT ADDRESS\u003d((PROTOCOL\u003dbeq)(HOST\u003d123.456.789.0)));",
        "OBJECT_EDITION": null,
        "OLS_PRIVILEGES_GRANTED": null,
        "EXCLUDED_USER": null,
        "DV_ACTION_OBJECT_NAME": null,
        "OLS_LABEL_COMPONENT_NAME": null,
        "EXCLUDED_SCHEMA": null,
        "DP_TEXT_PARAMETERS1": null,
        "XS_USER_NAME": null,
        "XS_ENABLED_ROLE": null,
        "XS_NS_ATTRIBUTE_NEW_VAL": null,
        "DIRECT_PATH_NUM_COLUMNS_LOADED": null,
        "AUDIT_OPTION": null,
        "DV_EXTENDED_ACTION_CODE": null,
        "XS_PACKAGE_NAME": null,
        "OLS_NEW_VALUE": null,
        "DV_RETURN_CODE": null,
        "XS_CALLBACK_EVENT_TYPE": null,
        "USERHOST": "ip-12-34-5-678",
        "GLOBAL_USERID": null,
        "CLIENT_IDENTIFIER": null,
        "RMAN_OPERATION": null,
        "TERMINAL": "pts/1",
        "OS_USERNAME": "rdsdb",
        "OLS_MAX_READ_LABEL": null,
        "XS_PROXY_USER_NAME": null,
        "XS_DATASEC_POLICY_NAME": null,
        "DV_FACTOR_CONTEXT": null,
        "OLS_MAX_WRITE_LABEL": null,
        "OLS_PARENT_GROUP_NAME": null,
        "EXCLUDED_OBJECT": null,
        "DV_RULE_SET_NAME": null,
        "EXTERNAL_USERID": null,
        "EXECUTION_ID": null,
        "ROLE": null,
        "PROXY_SESSIONID": 0,
        "DP_BOOLEAN_PARAMETERS1": null,
        "OLS_POLICY_NAME": null,
        "OLS_GRANTEE": null,
        "OLS_MIN_WRITE_LABEL": null,
        "APPLICATION_CONTEXTS": null,
        "XS_SCHEMA_NAME": null,
        "DV_GRANTEE": null,
        "XS_COOKIE": null,
        "DBPROXY_USERNAME": null,
        "DV_ACTION_CODE": null,
        "OLS_PRIVILEGES_USED": null,
        "RMAN_DEVICE_TYPE": null,
        "XS_NS_ATTRIBUTE_OLD_VAL": null,
        "TARGET_USER": null,
        "XS_ENTITY_TYPE": null,
        "ENTRY_ID": 13,
        "XS_PROCEDURE_NAME": null,
        "XS_INACTIVITY_TIMEOUT": null,
        "RMAN_OBJECT_TYPE": null,
        "SYSTEM_PRIVILEGE": null,
        "NEW_SCHEMA": null,
        "SCN": 5136972
    }
}
```
次の例は、SQL Server DB の `SELECT` イベントを示しています。  

```
{
    "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"
            }
        }
    ]
}
```

## DatabaseActivityMonitoringRecords JSON オブジェクト
<a name="DBActivityStreams.AuditLog.DatabaseActivityMonitoringRecords"></a>

データベースアクティビティイベントレコードは、次の情報を含む JSON オブジェクトにあります。


****  

| JSON フィールド | データ型 | 説明 | 
| --- | --- | --- | 
|  `type`  | 文字列 |  JSON レコードのタイプ。値は `DatabaseActivityMonitoringRecords` です。  | 
| version | 文字列 |  データベースアクティビティモニタリングレコードのバージョン。Oracle DB ではバージョン 1.3、SQL Server ではバージョン 1.4 を使用します。これらのエンジンバージョンでは engineNativeAuditFields JSON オブジェクトが導入されています。  | 
|  [databaseActivityEvents](#DBActivityStreams.AuditLog.databaseActivityEvents)  | string |  アクティビティイベントを含む JSON オブジェクト。  | 
| key | string | [databaseActivityEventList JSON 配列](DBActivityStreams.AuditLog.databaseActivityEventList.md) の復号に使用する暗号化キー。 | 

## databaseActivityEvents JSON オブジェクト
<a name="DBActivityStreams.AuditLog.databaseActivityEvents"></a>

`databaseActivityEvents` JSON オブジェクトには、次の情報が含まれています。

### JSON レコードの最上位フィールド
<a name="DBActivityStreams.AuditLog.topLevel"></a>

 監査ログの各イベントは、JSON 形式のレコード内にラップされます。このレコードには、次のフィールドが含まれます。

**type**  
 このフィールドは常に値 `DatabaseActivityMonitoringRecords` を持ちます。

**バージョン**  
 このフィールドは、データベースアクティビティストリーミングデータプロトコルまたはコントラクトのバージョンを表します。これは、使用可能なフィールドを定義します。

**databaseActivityEvents**  
 1 つ以上のアクティビティイベントを表す暗号化された文字列。これは、base64 バイト配列として表されます。文字列を復号すると、このセクションの例に示すフィールドを持つ JSON 形式のレコードが生成されます。

**key**  
 `databaseActivityEvents` 文字列の暗号化に使用される暗号化されたデータキー。これは、データベースアクティビティストリーミングをスタートしたときに指定した AWS KMS key と同じです。

 以下の例は、このレコードの形式を示しています。

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

```
           "type":"DatabaseActivityMonitoringRecords",
           "version":"1.4",
           "databaseActivityEvents":"encrypted audit records",
           "key":"encrypted key"
```

`databaseActivityEvents` フィールドの内容を復号化するには、次のステップを実行します。

1.  データベースアクティビティストリーミングをスタートするときに指定した KMS キーを使用して、`key` JSON フィールドの値を復号します。これにより、データ暗号化キーがクリアテキストで返されます。

1.  `databaseActivityEvents` JSON フィールドの値を Base64 デコードして、監査ペイロードの暗号化テキストをバイナリ形式で取得します。

1.  初期のステップでデコードしたデータ暗号化キーを使用して、バイナリ暗号文を復号化します。

1.  復号化されたペイロードを解凍します。
   +  暗号化されたペイロードは、`databaseActivityEvents` フィールドにあります。
   +  `databaseActivityEventList` フィールドには、監査レコードの配列が含まれます。配列内の `type` フィールドには、 `record` または `heartbeat` を使用できます。

監査ログのアクティビティイベントレコードは、次の情報を含む JSON オブジェクトです。


****  

| JSON フィールド | データ型 | 説明 | 
| --- | --- | --- | 
|  `type`  | 文字列 |  JSON レコードのタイプ。値は `DatabaseActivityMonitoringRecord` です。  | 
| instanceId | 文字列 | DB インスタンスのリソース識別子。DB インスタンス属性 DbiResourceId に対応します。 | 
|  [databaseActivityEventList JSON 配列](DBActivityStreams.AuditLog.databaseActivityEventList.md)   | 文字列 |  アクティビティ監査レコードまたはハートビートメッセージの配列。  | 

# データベースアクティビティストリームの databaseActivityEventList JSON 配列
<a name="DBActivityStreams.AuditLog.databaseActivityEventList"></a>

監査ログのペイロードは、暗号化された `databaseActivityEventList` JSON 配列です。次の表に、監査ログの復号された `DatabaseActivityEventList` 配列内の各アクティビティイベントのフィールドをアルファベット順に示します。

Oracle Database で統合監査が有効になっている場合、この新しい監査証跡に監査レコードが配置されます。`UNIFIED_AUDIT_TRAIL` ビューでは、監査証跡から監査レコードを取得することにより、監査レコードを表形式で表示します。データベースアクティビティストリーミングをスタートすると、`UNIFIED_AUDIT_TRAIL` 内の列が `databaseActivityEventList` 配列のフィールドにマッピングされます。

**重要**  
イベントの構造は変わる場合があります。Amazon RDS では、将来、アクティビティイベントに新しいフィールドが追加される可能性があります。JSON データを分析するアプリケーションでは、コードが未知のフィールド名に対して無視または適切なアクションを実行できることを確認します。

## Amazon RDS for Oracle の databaseActivityEventList フィールド
<a name="DBActivityStreams.AuditLog.databaseActivityEventList.ro"></a>

Amazon RDS for Oracle の `databaseActivityEventList` フィールドは以下のとおりです。


| フィールド | データ型 | 送信元 | 説明 | 
| --- | --- | --- | --- | 
|  `class`  |  文字列  |  `UNIFIED_AUDIT_TRAIL` の `AUDIT_TYPE` 列  |  アクティビティイベントのクラス。これは `UNIFIED_AUDIT_TRAIL` ビューの `AUDIT_TYPE` 列に対応します。Amazon RDS for Oracle の有効な値は以下のとおりです。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/DBActivityStreams.AuditLog.databaseActivityEventList.html) 詳細については、Oracle ドキュメントの「[UNIFIED\$1AUDIT\$1TRAIL](https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/UNIFIED_AUDIT_TRAIL.html#GUID-B7CE1C02-2FD4-47D6-80AA-CF74A60CDD1D)」を参照してください。  | 
|  `clientApplication`  |  文字列  |  `CLIENT_PROGRAM_NAME` ( 内)`UNIFIED_AUDIT_TRAIL`  |  クライアントのレポートどおりにクライアントが接続に使用していたアプリケーション。クライアントはこの情報を指定する必要はないため、値は null でも問題ありません。サンプル値は`JDBC Thin Client`。  | 
|  `command`  |  文字列  |  `UNIFIED_AUDIT_TRAIL` の `ACTION_NAME` 列  |  ユーザーによって実行されるアクションの名前。完全なアクションを把握するには、コマンド名と `AUDIT_TYPE` 値の両方を読み取ります。サンプル値は`ALTER DATABASE`。  | 
|  `commandText`  |  文字列  |  `UNIFIED_AUDIT_TRAIL` の `SQL_TEXT` 列  |  イベントに関連付けられる SQL ステートメント。サンプル値は`ALTER DATABASE BEGIN BACKUP`。  | 
|  `databaseName`  |  文字列  |  `V$DATABASE` の `NAME` 列  |  データベースの名前。  | 
|  `dbid`  |  number  |  `UNIFIED_AUDIT_TRAIL` の `DBID` 列  |  データベースの数値識別子。サンプル値は`1559204751`。  | 
|  `dbProtocol`  |  文字列  |  該当なし  |  データベースプロトコル。このベータ版では、値は `oracle` です。  | 
|  `dbUserName`  |  文字列  |  `UNIFIED_AUDIT_TRAIL` の `DBUSERNAME` 列  |  アクションが監査されたデータベースユーザーの名前。サンプル値は`RDSADMIN`。  | 
|  `endTime`  |  文字列  |  該当なし  |  このフィールドは RDS for Oracle には使用されず、常に null です。  | 
|  `engineNativeAuditFields`  |  オブジェクト  |  `UNIFIED_AUDIT_TRAIL`  |  デフォルトでは、このオブジェクトは空です。`--engine-native-audit-fields-included` オプションでアクティビティストリーミングをスタートすると、このオブジェクトには以下の列とその値が含まれます。 <pre>ADDITIONAL_INFO<br />APPLICATION_CONTEXTS<br />AUDIT_OPTION<br />AUTHENTICATION_TYPE<br />CLIENT_IDENTIFIER<br />CURRENT_USER<br />DBLINK_INFO<br />DBPROXY_USERNAME<br />DIRECT_PATH_NUM_COLUMNS_LOADED<br />DP_BOOLEAN_PARAMETERS1<br />DP_TEXT_PARAMETERS1<br />DV_ACTION_CODE<br />DV_ACTION_NAME<br />DV_ACTION_OBJECT_NAME<br />DV_COMMENT<br />DV_EXTENDED_ACTION_CODE<br />DV_FACTOR_CONTEXT<br />DV_GRANTEE<br />DV_OBJECT_STATUS<br />DV_RETURN_CODE<br />DV_RULE_SET_NAME<br />ENTRY_ID<br />EXCLUDED_OBJECT<br />EXCLUDED_SCHEMA<br />EXCLUDED_USER<br />EXECUTION_ID<br />EXTERNAL_USERID<br />FGA_POLICY_NAME<br />GLOBAL_USERID<br />INSTANCE_ID<br />KSACL_SERVICE_NAME<br />KSACL_SOURCE_LOCATION<br />KSACL_USER_NAME<br />NEW_NAME<br />NEW_SCHEMA<br />OBJECT_EDITION<br />OBJECT_PRIVILEGES<br />OLS_GRANTEE<br />OLS_LABEL_COMPONENT_NAME<br />OLS_LABEL_COMPONENT_TYPE<br />OLS_MAX_READ_LABEL<br />OLS_MAX_WRITE_LABEL<br />OLS_MIN_WRITE_LABEL<br />OLS_NEW_VALUE<br />OLS_OLD_VALUE<br />OLS_PARENT_GROUP_NAME<br />OLS_POLICY_NAME<br />OLS_PRIVILEGES_GRANTED<br />OLS_PRIVILEGES_USED<br />OLS_PROGRAM_UNIT_NAME<br />OLS_STRING_LABEL<br />OS_USERNAME<br />PROTOCOL_ACTION_NAME<br />PROTOCOL_MESSAGE<br />PROTOCOL_RETURN_CODE<br />PROTOCOL_SESSION_ID<br />PROTOCOL_USERHOST<br />PROXY_SESSIONID<br />RLS_INFO<br />RMAN_DEVICE_TYPE<br />RMAN_OBJECT_TYPE<br />RMAN_OPERATION<br />RMAN_SESSION_RECID<br />RMAN_SESSION_STAMP<br />ROLE<br />SCN<br />SYSTEM_PRIVILEGE<br />SYSTEM_PRIVILEGE_USED<br />TARGET_USER<br />TERMINAL<br />UNIFIED_AUDIT_POLICIES<br />USERHOST<br />XS_CALLBACK_EVENT_TYPE<br />XS_COOKIE<br />XS_DATASEC_POLICY_NAME<br />XS_ENABLED_ROLE<br />XS_ENTITY_TYPE<br />XS_INACTIVITY_TIMEOUT<br />XS_NS_ATTRIBUTE<br />XS_NS_ATTRIBUTE_NEW_VAL<br />XS_NS_ATTRIBUTE_OLD_VAL<br />XS_NS_NAME<br />XS_PACKAGE_NAME<br />XS_PROCEDURE_NAME<br />XS_PROXY_USER_NAME<br />XS_SCHEMA_NAME<br />XS_SESSIONID<br />XS_TARGET_PRINCIPAL_NAME<br />XS_USER_NAME</pre> 詳細については、Oracle Database ドキュメントの「[UNIFIED\$1AUDIT\$1TRAIL](https://docs.oracle.com/database/121/REFRN/GUID-B7CE1C02-2FD4-47D6-80AA-CF74A60CDD1D.htm#REFRN29162)」を参照してください。  | 
|  `errorMessage`  |  文字列  |  該当なし  |  このフィールドは RDS for Oracle には使用されず、常に null です。  | 
|  `exitCode`  |  number  |  `UNIFIED_AUDIT_TRAIL` の `RETURN_CODE` 列  |  アクションによって生成された Oracle データベースのエラーコード。アクションが成功した場合、値は `0` です。  | 
|  `logTime`  |  文字列  |  `UNIFIED_AUDIT_TRAIL` の `EVENT_TIMESTAMP_UTC` 列  |  監査証跡エントリの作成のタイムスタンプ。サンプル値は`2020-11-27 06:56:14.981404`。  | 
|  `netProtocol`  |  文字列  |  `UNIFIED_AUDIT_TRAIL` の `AUTHENTICATION_TYPE` 列  |  ネットワーク通信プロトコル。サンプル値は`TCP`。  | 
|  `objectName`  |  文字列  |  `UNIFIED_AUDIT_TRAIL` の `OBJECT_NAME` 列  |  アクションによって影響を及ぼされるオブジェクトの名前。サンプル値は`employees`。  | 
|  `objectType`  |  文字列  |  `UNIFIED_AUDIT_TRAIL` の `OBJECT_SCHEMA` 列  |  アクションによって影響を及ぼされるオブジェクトのスキーマ名。サンプル値は`hr`。  | 
|  `paramList`  |  リスト  |  `UNIFIED_AUDIT_TRAIL` の `SQL_BINDS` 列  |  `SQL_TEXT` に関連付けられているバインド可変のリスト (存在する場合)。サンプル値は`parameter_1,parameter_2`。  | 
|  `pid`  |  number  |  `UNIFIED_AUDIT_TRAIL` の `OS_PROCESS` 列  |  Oracle データベースプロセスのオペレーティングシステムプロセス識別子。サンプル値は`22396`。  | 
|  `remoteHost`  |  文字列  |  `UNIFIED_AUDIT_TRAIL` の `AUTHENTICATION_TYPE` 列  |  セッションを生成したホストのクライアント IP アドレスまたは名前です。サンプル値は`123.456.789.123`。  | 
|  `remotePort`  |  文字列  |  `UNIFIED_AUDIT_TRAIL` の `AUTHENTICATION_TYPE` 列  |  クライアントのポート番号。Oracle Database 環境における一般的な値は `1521` です。  | 
|  `rowCount`  |  number  |  該当なし  |  このフィールドは RDS for Oracle には使用されず、常に null です。  | 
|  `serverHost`  |  文字列  |  データーベースホスト:   |  データベースサーバーのホスト IP アドレス。サンプル値は`123.456.789.123`。  | 
|  `serverType`  |  文字列  |  該当なし  |  データベースサーバーのタイプ。値は常に `ORACLE` です。  | 
|  `serverVersion`  |  文字列  |  データーベースホスト:   |  Amazon RDS for Oracle のバージョン、リリースアップデート (RU)、およびリリースアップデートリビジョン (RUR)。サンプル値は`19.0.0.0.ru-2020-01.rur-2020-01.r1.EE.3`。  | 
|  `serviceName`  |  文字列  |  データーベースホスト:   |  サービスの名前。サンプル値は`oracle-ee`。  | 
|  `sessionId`  |  number  |  `UNIFIED_AUDIT_TRAIL` の `SESSIONID` 列  |  監査のセッション識別子。例: 「`1894327130`」。  | 
|  `startTime`  |  文字列  |  該当なし  |  このフィールドは RDS for Oracle には使用されず、常に null です。  | 
|  `statementId`  |  number  |  `UNIFIED_AUDIT_TRAIL` の `STATEMENT_ID` 列  |  実行する各ステートメントの数値 ID。1 つのステートメントで多くのアクションが起こる可能性があります。サンプル値は`142197`。  | 
|  `substatementId`  |  該当なし  |  該当なし  |  このフィールドは RDS for Oracle には使用されず、常に null です。  | 
|  `transactionId`  |  文字列  |  `UNIFIED_AUDIT_TRAIL` の `TRANSACTION_ID` 列  |  オブジェクトが変更されるトランザクションの識別子。サンプル値は`02000800D5030000`。  | 

## Amazon RDS for SQL Server の databaseActivityEventList フィールド
<a name="DBActivityStreams.AuditLog.databaseActivityEventList.rss"></a>

Amazon RDS for SQL Server の `databaseActivityEventList` フィールドは次のとおりです。


| フィールド | データ型 | 送信元 | 説明 | 
| --- | --- | --- | --- | 
|  `class`  |  string  |  ` sys.fn_get_audit_file.class_type` のマッピング先 `sys.dm_audit_class_type_map.class_type_desc`  |  アクティビティイベントのクラス。詳細については、Microsoft ドキュメントの「[SQL Server 監査 (データベースエンジン)](https://learn.microsoft.com/en-us/sql/relational-databases/security/auditing/sql-server-audit-database-engine?view=sql-server-ver16)」を参照してください。  | 
|  `clientApplication`  |  文字列  |  `sys.fn_get_audit_file.application_name`  |  クライアントから報告されたとおりにクライアントが接続するアプリケーション (SQL Server バージョン 14 以降)。SQL Server バージョン 13 では、このフィールドは NULL になっています。  | 
|  `command`  |  文字列  |  `sys.fn_get_audit_file.action_id` のマッピング先 `sys.dm_audit_actions.name`  |  SQL ステートメントの一般的なカテゴリ。このフィールドの値はクラスの値によって異なります。  | 
|  `commandText`  |  文字列  |  `sys.fn_get_audit_file.statement`  |  このフィールドは SQL ステートメントを示します。  | 
|  `databaseName`  |  文字列  |  `sys.fn_get_audit_file.database_name`  |  データベースの名前  | 
|  `dbProtocol`  |  文字列  |  該当なし  |  データベースプロトコル。値は `SQLSERVER` です。  | 
|  `dbUserName`  |  文字列  |  `sys.fn_get_audit_file.server_principal_name`  |  クライアント認証のためのデータベースユーザー。  | 
|  `endTime`  |  文字列  |  該当なし  |  このフィールドは Amazon RDS for SQL Server では使用されず、値は null です。  | 
|  `engineNativeAuditFields`  |  オブジェクト  |  この列にリストされていない `sys.fn_get_audit_file` の各フィールド。  |  デフォルトでは、このオブジェクトは空です。`--engine-native-audit-fields-included` オプションでアクティビティストリームを開始すると、このオブジェクトには他のネイティブエンジン監査フィールドが含まれ、この JSON マップでは返されません。  | 
|  `errorMessage`  |  文字列  |  該当なし  |  このフィールドは Amazon RDS for SQL Server では使用されず、値は null です。  | 
|  `exitCode`  |  integer  |  `sys.fn_get_audit_file.succeeded`  |  イベントを開始したアクションが成功したかどうかを示します。このフィールドを null にすることはできません。ログインイベントを除くすべてのイベントについて、このフィールドはアクセス許可チェックの成否を報告しますが、操作の成否は報告しません。 値には以下のものが含まれます。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/DBActivityStreams.AuditLog.databaseActivityEventList.html)  | 
|  `logTime`  |  文字列  |  `sys.fn_get_audit_file.event_time`  |  SQL Server によって記録されるイベントのタイムスタンプ。  | 
|  `netProtocol`  |  文字列  |  該当なし  |  このフィールドは Amazon RDS for SQL Server では使用されず、値は null です。  | 
|  `objectName`  |  文字列  |  `sys.fn_get_audit_file.object_name`  |  SQL ステートメントがオブジェクトに対して使用されている場合のデータベースオブジェクトの名前。  | 
|  `objectType`  |  文字列  |  `sys.fn_get_audit_file.class_type` のマッピング先 `sys.dm_audit_class_type_map.class_type_desc`  |  SQL ステートメントがオブジェクトタイプに対して使用されている場合のデータベースオブジェクトタイプ。  | 
|  `paramList`  |  文字列  |  該当なし  |  このフィールドは Amazon RDS for SQL Server では使用されず、値は null です。  | 
|  `pid`  |  integer  |  該当なし  |  このフィールドは Amazon RDS for SQL Server では使用されず、値は null です。  | 
|  `remoteHost`  |  文字列  |  `sys.fn_get_audit_file.client_ip`  |  SQL ステートメントを発行したクライアントの IP アドレスまたはホスト名 (SQL Server バージョン 14 以降)。SQL Server バージョン 13 では、このフィールドは NULL になっています。  | 
|  `remotePort`  |  integer  |  該当なし  |  このフィールドは Amazon RDS for SQL Server では使用されず、値は null です。  | 
|  `rowCount`  |  integer  |  `sys.fn_get_audit_file.affected_rows`  |  SQL ステートメントによって影響を受けるテーブルの行数 (SQL Server バージョン 14 以降)。SQL Server バージョン 13 では、このフィールドは null になっています。  | 
|  `serverHost`  |  文字列  |  データーベースホスト   |  ホストデータベースサーバーの IP アドレス。  | 
|  `serverType`  |  文字列  |  該当なし  |  データベースサーバーのタイプ。値は `SQLSERVER` です。  | 
|  `serverVersion`  |  文字列  |  データーベースホスト   |  データベースサーバーのバージョン。SQL Server 2017 の場合は 15.00.4073.23.v1.R1 などです。  | 
|  `serviceName`  |  文字列  |  データーベースホスト   |  サービスの名前。値の例は `sqlserver-ee` です。  | 
|  `sessionId`  |  integer  |  `sys.fn_get_audit_file.session_id`  |  セッションの一意識別子。  | 
|  `startTime`  |  文字列  |  該当なし  |  このフィールドは Amazon RDS for SQL Server では使用されず、値は null です。  | 
|  `statementId`  |  文字列  |  `sys.fn_get_audit_file.sequence_group_id`  |  クライアントの SQL ステートメントの一意識別子。識別子は、生成されるイベントごとに異なります。サンプル値は`0x38eaf4156267184094bb82071aaab644`。  | 
|  `substatementId`  |  integer  |  `sys.fn_get_audit_file.sequence_number`  |  ステートメントのシーケンス番号を決定する識別子。この識別子は、大きなレコードが複数のレコードに分割されている場合に役立ちます。  | 
|  `transactionId`  |  integer  |  `sys.fn_get_audit_file.transaction_id`  |  トランザクションの識別子。アクティブなトランザクションがない場合、値は 0 です。  | 
|  `type`  |  文字列  |  データベースアクティビティストリームが生成されました  |  イベントのタイプ。値は `record` または `heartbeat` です。  | 

# AWS SDK を使用したデータベースアクティビティストリーミングの処理
<a name="DBActivityStreams.CodeExample"></a>

アクティビティストリーミングをプログラムで処理するには、AWS SDK を使用します。以下は、インスタンスベースの有効化に Database Activity Streams レコードを使用する、完全に機能する Java および Python の例です。

------
#### [ 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-[instance-external-resource-id]"; // aws-rds-das-db-ABCD123456
    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 RESOURCE_ID = "[external-resource-id]"; // db-ABCD123456
    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; // note that clusterId will contain an empty string on RDS Oracle and RDS SQL Server
        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:db-id", 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>'      # db-ABCD123456
STREAM_NAME = 'aws-rds-das-' + RESOURCE_ID  # aws-rds-das-db-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:db-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()
```

------

# データベースアクティビティストリームの IAM ポリシーの例
<a name="DBActivityStreams.ManagingAccess"></a>

データベースアクティビティストリーミングに対する適切な AWS Identity and Access Management (IAM) ロールの権限が付与されているユーザーは、DB インスタンスのアクティビティストリーミング設定の作成、スタート、停止、および変更ができます。これらのアクションはストリーミングの監査ログに含まれています。コンプライアンスのベストプラクティスとして、これらの権限は DBA に付与しないことをお勧めします。

データベースアクティビティストリーミングへのアクセスを設定するには、IAM ポリシーを使用します。Amazon RDS 認証の詳細については、「[Amazon RDS での Identity and Access Management](UsingWithRDS.IAM.md)」を参照してください。IAM ポリシーの作成の詳細については、「[IAM データベースアクセス用の IAM ポリシーの作成と使用](UsingWithRDS.IAMDBAuth.IAMPolicy.md)」を参照してください。

**Example データベースアクティビティストリーミングの設定を許可するポリシー**  
アクティビティストリーミングを変更するためのきめ細かいアクセスをユーザーに付与するには、IAM ポリシーでサービス固有のオペレーションコンテキストキー (`rds:StartActivityStream` および `rds:StopActivityStream`) を使用します。次の IAM ポリシーの例では、ユーザーまたはロールがアクティビティストリーミングを設定することを許可します。    
****  

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

**Example データベースアクティビティストリーミングのスタートを許可するポリシー**  
次の IAM ポリシーの例では、ユーザーまたはロールがアクティビティストリーミングをスタートすることを許可します。    
****  

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

**Example データベースアクティビティストリーミングの停止を許可するポリシー**  
次の IAM ポリシーの例では、ユーザーまたはロールがアクティビティストリーミングを停止することを許可します。    
****  

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

**Example データベースアクティビティストリーミングのスタートを拒否するポリシー**  
次の IAM ポリシーの例では、ユーザーまたはロールによるアクティビティストリーミングのスタートが阻止されます。    
****  

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

**Example データベースアクティビティストリーミング停止を拒否するポリシー**  
次の IAM ポリシーの例では、ユーザーまたはロールによるアクティビティストリーミングの停止が阻止されます。    
****  

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