DynamoDB Streams の変更データキャプチャ - Amazon DynamoDB

DynamoDB Streams の変更データキャプチャ

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

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

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

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

DynamoDB Streams を使用すれば、以下のことを確認できます。

  • 各ストリームレコードは、ストリームに 1 回だけ出現します。

  • DynamoDB テーブルで変更された各項目について、ストリーミングレコードは項目に対する実際の変更と同じ順序で出現します。

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

DynamoDB Streams のエンドポイント

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

DynamoDB Streams エンドポイントの命名規則は streams.dynamodb.<region>.amazonaws.com です。たとえば、エンドポイント dynamodb.us-west-2.amazonaws.com を使用して DynamoDB にアクセスする場合は、エンドポイント streams.dynamodb.us-west-2.amazonaws.com を使用して DynamoDB Streams にアクセスします。

注記

DynamoDB および DynamoDB Streams のリージョンとエンドポイントの完全なリストについては、「AWS 全般のリファレンス」の「リージョンとエンドポイント」を参照してください。

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

ストリームの有効化

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

DynamoDB Streams を管理する最も簡単な方法は、AWS Management Console を使用することです。

  1. AWS Management Console にサインインして DynamoDB コンソール (https://console.aws.amazon.com/dynamodb/) を開きます。

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

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

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

  5. [DynamoDB ストリームをオンにする] ウィンドウで、テーブルのデータが変更されるたびにストリーミングに書き込まれる情報を選択します。

    • [キー属性のみ] - 変更された項目のキー属性のみ。

    • [New image] (新規イメージ) — 変更後に表示される項目全体。

    • [Old image] (古いイメージ) — 変更前に表示されていた項目全体。

    • [New and old images] (新規イメージおよび古いイメージ) — 項目の新しいイメージと古いイメージの両方。

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

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

CreateTable または UpdateTable API オペレーションを使用して、ストリームを有効にするか、変更することもできます。ストリームの設定内容は、StreamSpecification パラメータにより決まります。

  • StreamEnabled — テーブルでストリーミングが有効 (true) か無効 (false) かを指定します。

  • StreamViewType — テーブル内のデータが変更されるたびにストリーミングに書き込まれる情報を指定します。

    • KEYS_ONLY — 変更された項目のキー属性のみ。

    • NEW_IMAGE — 変更後に表示される項目全体。

    • OLD_IMAGE — 変更前に表示されていた項目全体。

    • NEW_AND_OLD_IMAGES — 項目の新しいイメージと古いイメージの両方。

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

StreamEnabledtrue に設定すると、一意のストリーミング記述子が割り当てられた新しいストリーミングが 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 を編集できません。セットアップ後にストリームを変更する必要がある場合は、現在のストリームを無効にして新しいストリームを作成する必要があります。

ストリームの読み込みと処理

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

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

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

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

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

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

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

DynamoDB Streams 構造。データ変更を表すストリームレコードは、シャードに編成されます。
注記

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

ストリームにアクセスしてその中のストリームレコードを処理するには、以下の操作を実行する必要があります。

  • アクセスするストリームの一意の ARN を調べます。

  • 目的のストリームレコードがストリーム内のどのシャードに含まれているかを調べます。

  • シャードにアクセスし、目的のストリームレコードを取得します。

注記

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

DynamoDB Streams API は、アプリケーションプログラム用の以下のアクションを提供します。

  • ListStreams — 現在のアカウントおよびエンドポイントのストリーミング記述子のリストを返します。必要に応じて、特定のテーブル名のストリーム記述子だけをリクエストできます。

  • DescribeStream — 特定のストリーミングに関する詳細情報を返します。出力には、ストリームに関連付けられたシャードのリストが含まれています(シャード ID を含む)。

  • GetShardIterator — シャード内の場所を表すシャードイテレーターを返します。イテレータがストリーム内の最も古いポイント、最も新しいポイント、特定のポイントへのアクセスを提供することをリクエストできます。

  • GetRecords — 特定のシャード内からストリーミングレコードを返します。GetShardIterator リクエストから返されたシャードイテレーターを指定する必要があります。

リクエストやレスポンスの例など、これらの API オペレーションの詳細な説明については、「Amazon DynamoDB Streams API リファレンス」を参照してください。

DynamoDB Streams のデータ保持期限

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

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