翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon のジャーナルコンテンツ QLDB
重要
サポート終了通知: 既存のお客様は、07/31/2025 のサポート終了QLDBまで Amazon を使用できます。詳細については、「Amazon Ledger QLDB を Amazon Aurora Postgre に移行するSQL
Amazon ではQLDB、ジャーナルはデータへのすべての変更の完全で検証可能な履歴を保存するイミュータブルなトランザクションログです。ジャーナルは追加専用であり、コミットされたデータやその他のシステムメタデータを含む、一連のシーケンスおよびハッシュチェーンされたブロックで構成されます。QLDB は、トランザクション内のジャーナルにチェーンされたブロックを 1 つ書き込みます。
このセクションでは、サンプルデータを含むジャーナルブロックの例を示し、ブロックの内容について説明します。
ブロックの例
ジャーナルブロックには、トランザクションのメタデータ、トランザクションでコミットされたドキュメントリビジョンを表すエントリ、およびそれらをコミットした PartiQL ステートメントが含まれます。
以下に、サンプルデータを含むブロックの例を示します。
注記
このブロック例は、情報提供のみを目的として記載されています。示されているハッシュは、実際に計算されたハッシュ値ではありません。
{ blockAddress:{ strandId:"4o5UuzWSW5PIoOGm5jPA6J", sequenceNo:25 }, transactionId:"3gtB8Q8dfIMA8lQ5pzHAMo", blockTimestamp:2022-06-08T18:46:46.512Z, blockHash:{{QS5lJt8vRxT30L9OGL5oU1pxFTe+UlEwakYBCrvGQ4A=}}, entriesHash:{{buYYc5kV4rrRtJAsrIQnfnhgkzfQ8BKjI0C2vFnYQEw=}}, previousBlockHash:{{I1UKRIWUgkM1X6042kcoZ/eN1rn0uxhDTc08zw9kZ5I=}}, entriesHashList:[ {{BUCXP6oYgmug2AfPZcAZup2lKolJNTbTuV5RA1VaFpo=}}, {{cTIRkjuULzp/4KaUEsb/S7+TG8FvpFiZHT4tEJGcANc=}}, {{3aktJSMyJ3C5StZv4WIJLu/w3D8mGtduZvP0ldKUaUM=}}, {{GPKIJ1+o8mMZmPj/35ZQXoca2z64MVYMCwqs/g080IM=}} ], transactionInfo:{ statements:[ { statement:"INSERT INTO VehicleRegistration VALUE ?", startTime:2022-06-08T18:46:46.063Z, statementDigest:{{KY2nL6UGUPs5lXCLVXcUaBxcEIop0Jvk4MEjcFVBfwI=}} }, { statement:"SELECT p_id FROM Person p BY p_id WHERE p.FirstName = ? and p.LastName = ?", startTime:2022-06-08T18:46:46.173Z, statementDigest:{{QS2nfB8XBf2ozlDx0nvtsliOYDSmNHMYC3IRH4Uh690=}} }, { statement:"UPDATE VehicleRegistration r SET r.Owners.PrimaryOwner.PersonId = ? WHERE r.VIN = ?", startTime:2022-06-08T18:46:46.278Z, statementDigest:{{nGtIA9Qh0/dwIplOR8J5CTeqyUVtNUQgXfltDUo2Aq4=}} }, { statement:"DELETE FROM DriversLicense l WHERE l.LicenseNumber = ?", startTime:2022-06-08T18:46:46.385Z, statementDigest:{{ka783dcEP58Q9AVQ1m9NOJd3JAmEvXLjzl0OjN1BojQ=}} } ], documents:{ HwVFkn8IMRa0xjze5xcgga:{ tableName:"VehicleRegistration", tableId:"HQZ6cgIMUi204Lq1tT4oaJ", statements:[0,2] }, IiPTRxLGJZa342zHFCFT15:{ tableName:"DriversLicense", tableId:"BvtXEB1JxZg0lJlBAtbtSV", statements:[3] } } }, revisions:[ { hash:{{FR1IWcWew0yw1TnRklo2YMF/qtwb7ohsu5FD8A4DSVg=}} }, { blockAddress:{ strandId:"4o5UuzWSW5PIoOGm5jPA6J", sequenceNo:25 }, hash:{{6TTHbcfIVdWoFC/j90BOZi0JdHzhjSXo1tW+uHd6Dj4=}}, data:{ VIN:"1N4AL11D75C109151", LicensePlateNumber:"LEWISR261LL", State:"WA", City:"Seattle", PendingPenaltyTicketAmount:90.25, ValidFromDate:2017-08-21, ValidToDate:2020-05-11, Owners:{ PrimaryOwner:{ PersonId:"3Ax20JIix5J2ulu2rCMvo2" }, SecondaryOwners:[] } }, metadata:{ id:"HwVFkn8IMRa0xjze5xcgga", version:0, txTime:2022-06-08T18:46:46.492Z, txId:"3gtB8Q8dfIMA8lQ5pzHAMo" } }, { blockAddress:{ strandId:"4o5UuzWSW5PIoOGm5jPA6J", sequenceNo:25 }, hash:{{ZVF/f1uSqd5DIMqzI04CCHaCGFK/J0Jf5AFzSEk0l90=}}, metadata:{ id:"IiPTRxLGJZa342zHFCFT15", version:1, txTime:2022-06-08T18:46:46.492Z, txId:"3gtB8Q8dfIMA8lQ5pzHAMo" } } ] }
revisions
フィールドには、hash
値のみを含み、その他の属性を含まないリビジョンオブジェクトもあります。これらは、ユーザーデータを含まない内部のみのシステムリビジョンです。これらのリビジョンのハッシュは、ジャーナルの完全なハッシュチェーンの一部であり、暗号検証に必要です。
ブロックの内容
ジャーナルブロックには、次のフィールドがあります。
blockAddress
-
ジャーナル内のブロックの位置。アドレスは、
strandId
とsequenceNo
という 2 つのフィールドを含む Amazon Ion 構造です。例:
{strandId:"BlFTjlSXze9BIh1KOszcE3",sequenceNo:14}
transactionId
-
ブロックをコミットしたトランザクションの一意の ID。
blockTimestamp
-
ブロックがジャーナルにコミットされた時刻を示すタイムスタンプ。
blockHash
-
ブロックを一意に表す 256 ビットのハッシュ値。これは、
entriesHash
とpreviousBlockHash
の連結のハッシュです。 entriesHash
-
ブロック内のすべてのエントリ (内部専用のシステムエントリを含む) を表すハッシュ。これは、Merkle ツリーのルートハッシュです。このツリーのリーフノードは、
entriesHashList
のすべてのハッシュで構成されます。 previousBlockHash
-
ジャーナル内の 1 つ前のチェーンされたブロックのハッシュ。
entriesHashList
-
ブロック内の各エントリを表すハッシュのリスト。このリストには、次のエントリハッシュが含まれる場合があります。
-
transactionInfo
を表す Ion ハッシュ。この値は、transactionInfo
構造全体の Ion ハッシュを取得することによって計算されます。 -
リーフノードが
revisions
のすべてのハッシュで構成される Merkle ツリーのルートハッシュ。 -
redactionInfo
を表す Ion ハッシュ。このハッシュは、秘匿化のトランザクションによってコミットされたブロックにのみ存在します。この値は、redactionInfo
構造全体の Ion ハッシュを取得することによって計算されます。 -
内部専用のシステムメタデータを表すハッシュ。これらのハッシュは、すべてのブロックに存在するとは限りません。
-
transactionInfo
-
ブロックをコミットしたトランザクション内のステートメントに関する情報を含む Amazon Ion 構造。この構造には次のフィールドがあります。
-
statements
- PartiQL ステートメントのリストと、ステートメントの実行が開始したときのstartTime
。各ステートメントには、transactionInfo
構造のハッシュを計算するために必要なstatementDigest
ハッシュがあります。 -
documents
– ステートメントによってIDs更新されたドキュメント。各ドキュメントには、そのドキュメントが所属する先のtableName
とtableId
、およびそのドキュメントを更新した各ステートメントのインデックスが含まれます。
-
revisions
-
ブロック内でコミットされたドキュメントリビジョンのリスト。各リビジョン構造には、リビジョンのコミットされたビューのすべてのフィールドが含まれます。
これには、ジャーナルのハッシュチェーン全体の一部を構成する内部専用のシステムリビジョンを表すハッシュも含まれます。
秘匿化済みのリビジョン
Amazon ではQLDB、DELETE
ステートメントは、ドキュメントを削除済みとしてマークする新しいリビジョンを作成することによってのみ、ドキュメントを論理的に削除します。QLDB は、テーブルの履歴で非アクティブなドキュメントリビジョンを完全に削除できるデータ秘匿化オペレーションもサポートしています。
秘匿化オペレーションでは、指定されたリビジョンのユーザーデータのみが削除され、ジャーナルシーケンスとドキュメントのメタデータは変更されません。これにより、台帳の全体的なデータの整合性が維持されます。詳細と秘匿化オペレーションの例については、「ドキュメントのリビジョンを秘匿化する」を参照してください。
秘匿化済みのリビジョンの例
先ほどのブロックの例を考えてみましょう。このブロックでは、秘匿化中のリビジョンのドキュメント ID が HwVFkn8IMRa0xjze5xcgga
で、バージョン番号が 0
とします。
秘匿化が完了すると、リビジョン内の (data
構造で表される) dataHash
ユーザーデータは新しいフィールドに置き換えられます。このフィールドの値は、削除された data
構造の Ion ハッシュです。その結果、台帳は全体的なデータ整合性を維持し、既存の検証APIオペレーションを通じて暗号的に検証可能なままになります。
次のリビジョンの例は、このリダクションの結果を示しています。新しいdataHash
フィールドは で強調表示されています。red italics
.
注記
このリビジョンの例は、情報提供のみを目的として記載されています。示されているハッシュは、実際に計算されたハッシュ値ではありません。
...
{
blockAddress:{
strandId:"4o5UuzWSW5PIoOGm5jPA6J",
sequenceNo:25
},
hash:{{6TTHbcfIVdWoFC/j90BOZi0JdHzhjSXo1tW+uHd6Dj4=}},
dataHash:{{s83jd7sfhsdfhksj7hskjdfjfpIPP/DP2hvionas2d4=}},
metadata:{
id:"HwVFkn8IMRa0xjze5xcgga",
version:0,
txTime:2022-06-08T18:46:46.492Z,
txId:"3gtB8Q8dfIMA8lQ5pzHAMo"
}
}
...
QLDB は、完了した秘匿化リクエストのために新しいブロックをジャーナルに追加します。このブロックには、次の例に示すように、トランザクション内で秘匿化済みのリビジョンのリストを含む追加 redactionInfo
エントリが含まれます。
... redactionInfo:{ revisions:[ { blockAddress:{ strandId:"4o5UuzWSW5PIoOGm5jPA6J", sequenceNo:25 }, tableId:"HQZ6cgIMUi204Lq1tT4oaJ", documentId:"HwVFkn8IMRa0xjze5xcgga", version:0 } ] } ...
サンプルアプリケーション
エクスポートされたデータを使用してジャーナルのハッシュチェーンを検証する Java コード例については、 GitHub リポジトリ aws-samples/-java amazon-qldb-dmv-sample
-
ValidateQldbHashChain.java
– 台帳からジャーナルブロックをエクスポートし、エクスポートされたデータを使用してブロック間のハッシュチェーンを検証するチュートリアルコードが含まれています。 -
JournalBlock.java
– ブロック内の個々のハッシュコンポーネントを計算する方法 verifyBlockHash()
を示す という名前のメソッドが含まれています。このメソッドは、ValidateQldbHashChain.java
のチュートリアルコードによって呼び出されます。
この完全なサンプルアプリケーションをダウンロードしてインストールする方法については、「Amazon QLDBJava サンプルアプリケーションのインストール」を参照してください。チュートリアルコードを実行する前に、「Java チュートリアル」のステップ 1~3 を実行し、サンプル台帳をセットアップして、サンプルデータを使用してロードしてください。
以下も参照してください。
のジャーナルの詳細についてはQLDB、以下のトピックを参照してください。
-
「Amazon からのジャーナルデータのエクスポート QLDB」- ジャーナルデータを Amazon Simple Storage Service (Amazon S3) にエクスポートする方法について説明します。
-
「Amazon からのジャーナルデータのストリーミング QLDB」- ジャーナルデータを Amazon Kinesis Data Streams にストリーミングする方法について説明します。
-
「Amazon でのデータ検証 QLDB」- ジャーナルデータの暗号検証について説明します。