翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
QLDB Kinesis のストリームレコード
重要
サポート終了通知: 既存のお客様は、07/31/2025 のサポート終了QLDBまで Amazon を使用できます。詳細については、「Amazon Ledger QLDB を Amazon Aurora Postgre に移行するSQL
Amazon ストリームはQLDB、コントロール 、ブロックサマリー 、リビジョンの詳細 の 3 種類のデータレコードを特定の Amazon Kinesis Data Streams リソースに書き込みます。 3 つのレコードタイプはすべて、Amazon Ion 形式のバイナリ表現で記述されます。
コントロールレコードは、QLDBストリームの開始と完了を示します。リビジョンがジャーナルにコミットされるたびに、QLDBストリームは関連するすべてのジャーナルブロックデータをブロックサマリーレコードとリビジョン詳細レコードに書き込みます。
3 つのレコードタイプは多相型です。これらはすべて、QLDBストリーム 、レコードタイプARN、およびレコードペイロードを含む共通の最上位レコードで構成されます。この最上位レベルのレコードは、次の形式になります。
{ qldbStreamArn: string, recordType: string, payload: { //control | block summary | revision details record } }
recordType
フィールドには、次の 3 つの値のいずれかを指定できます。
-
CONTROL
-
BLOCK_SUMMARY
-
REVISION_DETAILS
次のセクションでは、個々のペイロードレコードの形式と内容について説明します。
注記
QLDB は、Amazon Ion のバイナリ表現ですべてのストリームレコードを Kinesis Data Streams に書き込みます。以下の例は、Ion のテキスト表現で、レコードの内容を読みやすい形式で説明しています。
コントロールレコード
QLDB ストリームは、開始イベントと完了イベントを示すコントロールレコードを書き込みます。次に、それぞれの controlRecordType
のサンプルデータを含むコントロールレコードの例を示します。
-
CREATED
– 新しく作成されたQLDBストリームがアクティブであることを示すためにストリームが Kinesis に書き込む最初のレコード。{ qldbStreamArn:"arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy", recordType:"CONTROL", payload:{ controlRecordType:"CREATED" } }
-
COMPLETED
– QLDBストリームが指定された終了日時に達したことを示すために Kinesis に書き込む最後のレコード。ストリームをキャンセルすると、このレコードは書き込まれません。{ qldbStreamArn:"arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy", recordType:"CONTROL", payload:{ controlRecordType:"COMPLETED" } }
ブロックサマリーレコード
ブロックサマリーレコードは、ドキュメントのリビジョンがコミットされるジャーナルブロックを表します。ブロックは、トランザクション中にQLDBジャーナルにコミットされるオブジェクトです。
ブロックサマリーレコードのペイロードには、ブロックをコミットしたトランザクションのブロックアドレス、タイムスタンプ、およびその他のメタデータが含まれます。また、ブロック内のリビジョンのサマリー属性と、それらをコミットした PartiQL ステートメントも含まれます。以下は、サンプルデータを含むブロックサマリーレコードの例です。
注記
このブロックサマリーの例は、情報提供のみを目的として記載されています。示されているハッシュは、実際に計算されたハッシュ値ではありません。
{ qldbStreamArn:"arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy", recordType:"BLOCK_SUMMARY", payload:{ blockAddress:{ strandId:"ElYL30RGoqrFCbbaQn3K6m", sequenceNo:60807 }, transactionId:"9RWohCo7My4GGkxRETAJ6M", blockTimestamp:2019-09-18T17:00:14.601000001Z, blockHash:{{6Pk9KDYJd38ci09oaHxx0D2grtgh4QBBqbDS6i9quX8=}}, entriesHash:{{r5YoH6+NXDXxgoRzPREGAWJfn73KlZE0eTfbTxZWUDU=}}, previousBlockHash:{{K3ti0Agk7DEponywKcQCPRYVHb5RuyxdmQFTfrloptA=}}, entriesHashList:[ {{pbzvz6ofJC7mD2jvgfyrY/VtR01zIZHoWy8T1VcxlGo=}}, {{k2brC23DLMercmiOWHiURaGwHu0mQtLzdNPuviE2rcs=}}, {{hvw1EV8k4oOkIO36kblO/+UUSFUQqCanKuDGr0aP9nQ=}}, {{ZrLbkyzDcpJ9KWsZMZqRuKUkG/czLIJ4US+K5E31b+Q=}} ], transactionInfo:{ statements:[ { statement:"SELECT * FROM Person WHERE GovId = ?", startTime:2019-09-18T17:00:14.587Z, statementDigest:{{p4Dn0DiuYD3Xm9UQQ75YLwmoMbSfJmopOmTfMnXs26M=}} }, { statement:"INSERT INTO Person ?", startTime:2019-09-18T17:00:14.594Z, statementDigest:{{klMLkLfa5VJqk6JUPtHkQpOsDdG4HmuUaq/VaApQflU=}} }, { statement:"INSERT INTO VehicleRegistration ?", startTime:2019-09-18T17:00:14.598Z, statementDigest:{{B0gO9BWVNrzRYFoe7t+GVLpJ6uZcLKf5t/chkfRhspI=}} } ], documents:{ '7z2OpEBgVCvCtwvx4a2JGn':{ tableName:"Person", tableId:"LSkFkQvkIOjCmpTZpkfpn9", statements:[1] }, 'K0FpsSLpydLDr7hi6KUzqk':{ tableName:"VehicleRegistration", tableId:"Ad3A07z0ZffC7Gpso7BXyO", statements:[2] } } }, revisionSummaries:[ { hash:{{uDthuiqSy4FwjZssyCiyFd90XoPSlIwomHBdF/OrmkE=}}, documentId:"7z2OpEBgVCvCtwvx4a2JGn" }, { hash:{{qJID/amu0gN3dpG5Tg0FfIFTh/U5yFkfT+g/O6k5sPM=}}, documentId:"K0FpsSLpydLDr7hi6KUzqk" } ] } }
revisionSummaries
フィールドでは、一部のリビジョンに documentId
がない場合があります。これらは、ユーザーデータを含まない内部のみのシステムリビジョンです。QLDB これらのリビジョンのハッシュはジャーナルの完全なハッシュチェーンの一部であるため、ストリームはこれらのリビジョンをそれぞれのブロックサマリーレコードに含めます。暗号検証には、完全なハッシュチェーンが必要です。
次のセクションで説明するように、ドキュメント ID を持つリビジョンだけが、個別のリビジョン詳細レコードで発行されます。
リビジョン詳細レコード
リビジョン詳細レコードは、ジャーナルにコミットされたドキュメントのリビジョンを表します。ペイロードには、リビジョンのコミットされたビューのすべての属性と、関連付けられたテーブル名とテーブル ID が含まれます。次に、サンプルデータを含むリビジョンレコードの例を示します。
{ qldbStreamArn:"arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy", recordType:"REVISION_DETAILS", payload:{ tableInfo:{ tableName:"VehicleRegistration", tableId:"Ad3A07z0ZffC7Gpso7BXyO" }, revision:{ blockAddress:{ strandId:"ElYL30RGoqrFCbbaQn3K6m", sequenceNo:60807 }, hash:{{qJID/amu0gN3dpG5Tg0FfIFTh/U5yFkfT+g/O6k5sPM=}}, data:{ VIN:"1N4AL11D75C109151", LicensePlateNumber:"LEWISR261LL", State:"WA", City:"Seattle", PendingPenaltyTicketAmount:90.25, ValidFromDate:2017-08-21, ValidToDate:2020-05-11, Owners:{ PrimaryOwner:{PersonId:"7z2OpEBgVCvCtwvx4a2JGn"}, SecondaryOwners:[] } }, metadata:{ id:"K0FpsSLpydLDr7hi6KUzqk", version:0, txTime:2019-09-18T17:00:14.602Z, txId:"9RWohCo7My4GGkxRETAJ6M" } } } }
重複する レコードと out-of-order レコードの処理
QLDB ストリームは、Kinesis Data Streams に重複する レコードと out-of-order レコードを発行できます。したがって、コンシューマーアプリケーションは、そのようなシナリオを特定して処理するために、独自のロジックを実装する必要があります。ブロックサマリーレコードとリビジョン詳細レコードには、この目的で使用できるフィールドが含まれます。これらのフィールドは、ダウンストリームサービスの機能と組み合わせて、一意の ID とレコードの厳密な順序の両方を示すことができます。
例えば、 OpenSearch インデックスQLDBと統合してドキュメントに全文検索機能を提供するストリームを考えてみましょう。このユースケースでは、ドキュメントの古い (out-of-order) リビジョンのインデックス作成を回避する必要があります。順序付けと重複除外を強制するには、 のドキュメント ID フィールドと外部バージョンフィールド OpenSearch、およびリビジョン詳細レコードのドキュメント ID フィールドとバージョンフィールドを使用できます。
Amazon OpenSearch Service QLDBと統合するサンプルアプリケーションの重複排除ロジックの例については、 GitHub リポジトリ aws-samples/amazon-qldb-streaming-amazon- opensearch-service-sample-python