

# DynamoDB Streams の変更データキャプチャ
<a name="Streams"></a>

 DynamoDB Streams は、DynamoDB テーブル内の項目レベルの変更に関するシーケンスを時間順にキャプチャし、その情報を最大 24 時間ログに保存します。アプリケーションは、このログにアクセスし、データ項目の変更前および変更後の内容をほぼリアルタイムで参照できます。

 保管時の暗号化では、DynamoDB Streams のデータが暗号化されます。詳細については、「[保管時の DynamoDB 暗号化](EncryptionAtRest.md)」を参照してください。

*DynamoDB Streams* は、DynamoDB テーブル内の項目に加えられた変更に関する情報の順序付けされた情報です。テーブルでストリーミングを有効にすると、DynamoDB はテーブル内のデータ項目に加えられた各変更に関する情報をキャプチャします。

アプリケーションがテーブル内の項目を作成、更新、または削除するたびに、DynamoDB Streams は変更された項目のプライマリキー属性を付けてストリーミングレコードを書き込みます。*ストリーミングレコード*には、DynamoDB テーブル内の単一の項目に加えられたデータ変更についての情報が含まれています。ストリームレコードが追加情報（変更された項目の前後のイメージ）をキャプチャするようにストリームを設定できます。

DynamoDB Streams を使用すれば、以下のことを確認できます。
+ 各ストリームレコードは、ストリームに 1 回だけ出現します。
+ DynamoDB テーブルで変更された各項目について、ストリーミングレコードは項目に対する実際の変更と同じ順序で出現します。

DynamoDB Streams は、ストリーミングレコードをほぼリアルタイムで書き込むため、これらのストリーミングを使用し、内容に基づいてアクションを実行するアプリケーションを構築できます。

**Topics**
+ [DynamoDB Streams のエンドポイント](#Streams.Endpoints)
+ [ストリームの有効化](#Streams.Enabling)
+ [ストリームの読み込みと処理](#Streams.Processing)
+ [DynamoDB Streams と有効期限 (TTL)](time-to-live-ttl-streams.md)
+ [DynamoDB Streams Kinesis Adapter を使用したストリームレコードの処理](Streams.KCLAdapter.md)
+ [DynamoDB Streams 低レベル API: Java の例](Streams.LowLevel.Walkthrough.md)
+ [DynamoDB Streams と AWS Lambda のトリガー](Streams.Lambda.md)
+ [DynamoDB Streams と Apache Flink](StreamsApacheFlink.xml.md)

## DynamoDB Streams のエンドポイント
<a name="Streams.Endpoints"></a>

AWS では、DynamoDB と DynamoDB Streams 用に個別のエンドポイントを維持しています。データベースのテーブルとインデックスを使用するには、アプリケーションが DynamoDB エンドポイントにアクセスする必要があります。DynamoDB Streams レコードを読み込んで処理するには、アプリケーションが同じリージョンの DynamoDB Streams エンドポイントにアクセスする必要があります。

DynamoDB Streams には 2 つのエンドポイントセットが用意されています。具体的には次の 2 つです。
+ **IPv4 専用エンドポイント**: `streams.dynamodb.{{<region>}}.amazonaws.com` 命名規則を持つエンドポイント。
+ **デュアルスタックエンドポイント**: IPv4 と IPv6 の両方と互換性があり、`streams-dynamodb.{{<region>}}.api.aws` 命名規則に従う新しいエンドポイント。

**注記**  
DynamoDB および DynamoDB Streams のリージョンとエンドポイントの完全なリストについては、「*AWS 全般のリファレンス*」の「[リージョンとエンドポイント](https://docs.aws.amazon.com/general/latest/gr/rande.html)」を参照してください。

AWS SDK は、DynamoDB と DynamoDB Streams 用に個別のクライアントを提供します。要件によっては、アプリケーションは、DynamoDB エンドポイント、DynamoDB Streams エンドポイント、または両方に同時にアクセスできます。両方のエンドポイントに接続するには、アプリケーションで 2 つのクライアントをインスタンス化する必要があります。1 つは DynamoDB 用、もう 1 つは DynamoDB Streams 用です。

## ストリームの有効化
<a name="Streams.Enabling"></a>

新しいテーブルでは、AWS CLI または AWS SDK 経由でそのテーブルの作成時にストリームを有効にできます。また、既存のテーブルでストリーミングを有効または無効にすることや、ストリーミングの設定を変更することができます。DynamoDB Streams は非同期的に動作するため、ストリーミングを有効にしてもテーブルのパフォーマンスに影響はありません。

DynamoDB Streams を管理する最も簡単な方法は、AWS マネジメントコンソール を使用することです。

1. AWS マネジメントコンソール にサインインして DynamoDB コンソール ([https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)) を開きます。

1. DynamoDB コンソールのダッシュボードで、[**Tables (テーブル)**] を選択して既存テーブルを選びます。

1. [**エクスポートとストリーム**] タブを選択します。

1. **[DynamoDB ストリームの詳細]** セクションで、**[オンにする]** を選択します。

1. **[DynamoDB ストリームをオンにする]** ウィンドウで、テーブルのデータが変更されるたびにストリーミングに書き込まれる情報を選択します。
   + [**キー属性のみ**] - 変更された項目のキー属性のみ。
   + **[New image]** (新規イメージ) — 変更後に表示される項目全体。
   + **[Old image]** (古いイメージ) — 変更前に表示されていた項目全体。
   + **[New and old images]** (新規イメージおよび古いイメージ) — 項目の新しいイメージと古いイメージの両方。

   すべての設定が正しいことを確認したら、**[ストリームをオンにする]** を選択します。

1. (オプション) 既存のストリーミングを無効にするには、**[DynamoDB ストリームの詳細]** で **[オフにする]** を選択します。

`CreateTable` または `UpdateTable` API オペレーションを使用して、ストリームを有効にするか、変更することもできます。ストリームの設定内容は、`StreamSpecification` パラメータにより決まります。
+ `StreamEnabled` — テーブルでストリーミングが有効 (`true`) か無効 (`false`) かを指定します。
+ `StreamViewType` — テーブル内のデータが変更されるたびにストリーミングに書き込まれる情報を指定します。
  + `KEYS_ONLY` — 変更された項目のキー属性のみ。
  + `NEW_IMAGE` — 変更後に表示される項目全体。
  + `OLD_IMAGE` — 変更前に表示されていた項目全体。
  + `NEW_AND_OLD_IMAGES` — 項目の新しいイメージと古いイメージの両方。

ストリームはいつでも有効または無効にできます。ただし、既にストリームがあるテーブルでストリームを有効にしようとした場合、`ValidationException` を受け取ります。また、ストリームのないテーブルでストリームを無効にしようとすると、`ValidationException` が発生します。

`StreamEnabled` を `true` に設定すると、一意のストリーミング記述子が割り当てられた新しいストリーミングが DynamoDB で作成されます。テーブルでストリームを無効にして再度有効にすると、新しいストリームは異なるストリーム記述子で作成されます。

各ストリームは、Amazon リソースネーム（ARN）により一意に識別されます。次に、`TestTable` という名前の DynamoDB テーブルにあるストリーミングのサンプル ARN を示します。

```
arn:aws:dynamodb:us-west-2:111122223333:table/TestTable/stream/2015-05-11T21:21:33.291
```

テーブルの最新のストリーミング記述子を調べるには、DynamoDB `DescribeTable` リクエストを発行し、レスポンスで `LatestStreamArn` 要素を探します。

**注記**  
ストリームのセットアップ後は `StreamViewType` を編集できません。セットアップ後にストリームを変更する必要がある場合は、現在のストリームを無効にして新しいストリームを作成する必要があります。

## ストリームの読み込みと処理
<a name="Streams.Processing"></a>

ストリームを読み取って処理するには、アプリケーションから DynamoDB Streams エンドポイントに接続して API リクエストを発行する必要があります。

ストリームは、*ストリームレコード*で構成されています。各ストリーミングレコードは、ストリーミングが属する DynamoDB テーブル内の 1 件のデータ変更を表しています。各ストリームレコードには、レコードがストリームに発行された順序を反映したシーケンス番号が割り当てられます。

ストリームレコードは、グループ (つまり、*シャード*) に整理されます。各シャードは、複数のストリームレコードのコンテナとして機能し、これらのレコードへのアクセスと反復処理に必要な情報が含まれています。シャード内のストリームレコードは 24 時間後に自動的に削除されます。

シャードはエフェメラルであり、必要に応じて自動的に作成および削除されます。また、任意のシャードは複数の新しいシャードに分割できます。これもまた自動的に行われます (親シャードが 1 つの子シャードのみを持つ場合もあります)。アプリケーションが複数のシャードからレコードを並列処理できるように、シャードは親テーブルで高レベルな書き込みアクティビティに応じて分割される場合があります。

ストリームを無効にすると、開かれているシャードは閉じられます。ストリーミング内のデータは 24 時間読み込み可能な状態になります。

シャードには系列 (親と子) があるため、アプリケーションは子シャードを処理する前に、必ず親シャードを処理する必要があります。これにより、ストリームレコードも正しい順序で処理されるようになります。(DynamoDB Streams Kinesis Adapter を使用している場合、これは自動的に処理されます。アプリケーションは、シャードとストリーミングレコードを正しい順序で処理します。アプリケーションの実行中に分割されたシャードに加えて、新しいシャードまたは有効期限切れのシャードは自動的に処理されます。詳細については、「[DynamoDB Streams Kinesis Adapter を使用したストリームレコードの処理](Streams.KCLAdapter.md)」を参照してください。)

次の図は、ストリーム、ストリーム内のシャード、シャード内のストリームレコードの関係を示しています。

![DynamoDB Streams 構造。データ変更を表すストリームレコードは、シャードに編成されます。](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/images/streams-terminology.png)


**注記**  
項目内のデータを何も変更しない `PutItem` または `UpdateItem` オペレーションを実行した場合、そのオペレーションのストリーミングレコードは DynamoDB Streams によって書き込まれ*ません*。

ストリームにアクセスしてその中のストリームレコードを処理するには、以下の操作を実行する必要があります。
+ アクセスするストリームの一意の ARN を調べます。
+ 目的のストリームレコードがストリーム内のどのシャードに含まれているかを調べます。
+ シャードにアクセスし、目的のストリームレコードを取得します。

**注記**  
最大でも 2 つを超えるプロセスが、同時に同じストリームシャードから読み込みを行うことはできません。シャードごとに 2 つを超えるリーダーがあると、スロットリングが発生する場合があります。

DynamoDB Streams API は、アプリケーションプログラム用の以下のアクションを提供します。
+  `[ListStreams](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_ListStreams.html)` — 現在のアカウントおよびエンドポイントのストリーミング記述子のリストを返します。必要に応じて、特定のテーブル名のストリーム記述子だけをリクエストできます。
+ `[DescribeStream](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_DescribeStream.html)` — ストリームに関する情報 (例: ストリームの最新ステータス、Amazon リソースネーム (ARN)、シャードの構成、対応する DynamoDB テーブル) を返します。オプションで `ShardFilter` フィールドを使用して、親シャードに関連付けられた既存の子シャードを取得できます。
+ `[GetShardIterator](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetShardIterator.html)` — シャード内の場所を表す*シャードイテレーター*を返します。イテレータがストリーム内の最も古いポイント、最も新しいポイント、特定のポイントへのアクセスを提供することをリクエストできます。
+ `[GetRecords](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetRecords.html)` — 特定のシャード内からストリーミングレコードを返します。`GetShardIterator` リクエストから返されたシャードイテレーターを指定する必要があります。

リクエストやレスポンスの例など、これらの API オペレーションの詳細な説明については、「[Amazon DynamoDB Streams API リファレンス](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Operations_Amazon_DynamoDB_Streams.html)」を参照してください。

### シャード検出
<a name="Streams.ShardDiscovery"></a>



2 つの強力な方法で、DynamoDB ストリーム内の新しいシャードを検出します。Amazon DynamoDB Streams ユーザーには、新しいシャードを追跡して識別するための 2 つの効果的な方法があります。

**ストリームトポロジ全体のポーリング**  
`DescribeStream` API を使用して、ストリームを定期的にポーリングします。これにより、作成された新しいシャードを含む、ストリーム内のすべてのシャードが返されます。時間経過に伴う結果を比較することで、新しく追加されたシャードを検出できます。

**子シャードの検出**  
`DescribeStream` API を `ShardFilter` パラメータとともに使用して、シャードのサブセットを見つけます。リクエストで親シャードを指定することで、DynamoDB Streams は直下の子シャードを返します。このアプローチは、ストリーム全体をスキャンせずにシャード系統のみを追跡する必要がある場合に役立ちます。  
DynamoDB Streams からデータを使用するアプリケーションは、この `ShardFilter` パラメータを使用して閉じたシャードの読み取りから子シャードに効率的に移行でき、`DescribeStream` API への繰り返しの呼び出しを回避して、すべての閉じたシャードと開いているシャードのシャードマップを取得してトラバースできます。これにより、親シャードが閉じられた後に子シャードをすばやく検出できるため、ストリーム処理アプリケーションの応答性とコスト効率が向上します。

どちらの方法でも、DynamoDB Streams の進化する構造を常に把握できるため、重要なデータの更新やシャードの変更を見逃すことはありません。

### DynamoDB Streams のデータ保持期限
<a name="Streams.DataRetention"></a>

DynamoDB Streams 内のすべてのデータは、24 時間保持されます。特定のテーブルの直近 24 時間のアクティビティを取得して分析できます。ただし、24 時間を超えたデータはすぐにトリミング (削除) される可能性があります。

テーブルのストリームを無効にした場合、ストリーム内のデータは 24 時間読み込み可能な状態になります。この時間が経過すると、データは期限切れになり、ストリームレコードは自動的に削除されます。既存のストリームを手動で削除するためのメカニズムはありません。保持期限 (24 時間) が切れ、すべてのストリームレコードが削除されるまで待つ必要があります。