メニュー
Amazon DynamoDB
開発者ガイド (API Version 2012-08-10)

DynamoDB ストリーム を使用したテーブルアクティビティのキャプチャ

多くのアプリケーションでは、DynamoDB テーブルに保存された項目の変更を、変更の発生時にキャプチャできると役立ちます。ユースケースは次のとおりです。

  • ある AWS リージョンのアプリケーションが、DynamoDB テーブルのデータを変更します。別の AWS リージョンの 2 番目のアプリケーションがそのデータ変更を読み込み、データを別のテーブルに書き込みます。このとき、元のテーブルと同期されたレプリカを作成します。

  • 人気のモバイルアプリは、1 秒あたり数千件の更新速度で、DynamoDB テーブルのデータを変更します。別のアプリケーションは、これらの更新に関するデータをキャプチャして保存し、モバイルアプリの使用状況メトリクスをほぼリアルタイムで提供します。

  • グローバルなマルチプレーヤーゲームには、データを複数の AWS リージョンに保存するマルチマスタートポロジがあります。各マスターは、リモートリージョンで発生した変更を使用および再現することにより同期されます。

  • アプリケーションは、友人の 1 人が新しい画像をアップロードするとすぐに、グループ内のすべての友人のモバイルデバイスに通知を自動送信します。

  • 新しいお客様がデータを DynamoDB テーブルに追加します。このイベントにより、新しいお客様にようこそメールを送信する別のアプリケーションが起動されます。

DynamoDB ストリーム では、このようなソリューションに加えて、他にも多くのソリューションを実現できます。DynamoDB ストリーム は、DynamoDB テーブル内の項目レベルの変更の時系列シーケンスをキャプチャし、この情報を最大 24 時間ログに保存します。アプリケーションは、このログにアクセスし、データ項目の変更前および変更後の内容をほぼリアルタイムで参照できます。

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

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

DynamoDB ストリーム では、以下の点が保証されます。

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

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

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

DynamoDB ストリーム におけるエンドポイント

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

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

注記

DynamoDB と DynamoDB ストリーム のリージョンおよびエンドポイントの詳細なリストについては、『AWS General Reference』の「リージョンとエンドポイント」を参照してください。

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

ストリームの有効化

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

DynamoDB ストリーム を管理するには、AWS マネジメントコンソール を使用するのが最も簡単な方法です。

  1. https://console.aws.amazon.com/dynamodb/ にある DynamoDB コンソールを開きます。

  2. DynamoDB コンソールのダッシュボードから、[Tables] を選択します。

  3. [Overview] タブで、[Manage Stream] を選択します。

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

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

    • [New image] — 変更後に表示される項目全体。

    • [Old image] — 変更前に表示されていた項目全体。

    • [New and old images] — 項目の新しいイメージと古いイメージの両方。

    すべての設定が正しいことを確認したら、[Enable] を選択します。

  5. (オプション) 既存のストリームを無効にするには、[Manage Stream] を選択し、[Disable] を選択します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ストリームを無効にすると、開かれているシャードは閉じられます。

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

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

注記

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

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

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

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

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

注記

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

DynamoDB ストリーム API は、アプリケーションプログラムが使用する次のアクションを提供します。

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

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

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

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

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

DynamoDB ストリーム のデータ保持期限

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

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