Edited at

Amazon QLDBのチュートリアルをやってみる

Amazon QLDBがGAになったので、公式チュートリアルに沿って触ってみます。

チュートリアルのシナリオは、車両登録を台帳で管理するというものになっています。

Getting Started with the Amazon QLDB Console - Amazon Quantum Ledger Database (Amazon QLDB)


台帳の作成

台帳名はサンプル提供の名前が入力されているので、そのまま「台帳の作成」をクリックします。

ステータスは1分も経たずに作成中からアクティブになりました。


サンプルデータの入力

プルダウンから先程作成した台帳を選択し、「サンプルデータをロード」をクリックします。サンプルデータがロードされます。


データの取得

ドキュメントに沿って、クエリを作成してデータを取得します。

Step 3: Query the Tables in a Ledger - Amazon Quantum Ledger Database (Amazon QLDB)

Vehicleテーブルからデータを取得します。

SELECT * FROM Vehicle AS v WHERE v.VIN = '1N4AL11D75C109151'

SQLを実行すると、結果のタブに取得結果が表示されました。

テーブルを結合してみます。

SELECT v.VIN, r.LicensePlateNumber, r.State, r.City, r.Owners

FROM Vehicle AS v, VehicleRegistration AS r
WHERE v.VIN = '1N4AL11D75C109151'
AND v.VIN = r.VIN


データの変更

以下のシナリオを想定してデータを変更していきます。


  1. シアトル在住のRaul LewisがAudi A5を所有している

  2. Raulがエベレット在住のBrent Loganに車を売る

  3. BrentとAlexis Penaが結婚する

  4. Alexisを車の副所有者として登録する

まずはPersonテーブルからRaulのドキュメントIDを取得します。

commited viewというシステムが定義したテーブルから取得できます。

テーブルの頭に_ql_committed_というプレフィックスが付きます。

SELECT metadata.id FROM _ql_committed_Person AS p

WHERE p.data.FirstName = 'Raul' and p.data.LastName = 'Lewis'

ベストプラクティスとして、外部キーはこのメタデータのIDを利用します。

IDはシステムが自動採番するため、自身の環境で取得できたものに適宜置き換えて下さい。

取得できたIDをPersonIdとして、車の所有者を書き換えます。

UPDATE VehicleRegistration AS r

SET r.Owners.PrimaryOwner.PersonId = '77o9bWOlQL1HG0Vv7p726n' --replace with your id
WHERE r.VIN = '1N4AL11D75C109151'

修正できたことを確認します。

SELECT r.Owners FROM VehicleRegistration AS r

WHERE r.VIN = '1N4AL11D75C109151'

次に、車の売り先のBrentのIDを取得します。

SELECT metadata.id FROM _ql_committed_Person AS p

WHERE p.data.FirstName = 'Brent' and p.data.LastName = 'Logan'

取得したIDで所有者を更新します。

UPDATE VehicleRegistration AS r

SET r.Owners.PrimaryOwner.PersonId = 'CX9hTfs8G83LM9WNVRxpqd', --replace with your id
r.City = 'Everett'
WHERE r.VIN = '1N4AL11D75C109151'

変更されたことを確認します。

SELECT r.Owners.PrimaryOwner, r.City

FROM VehicleRegistration AS r
WHERE r.VIN = '1N4AL11D75C109151'

次に、副所有者として登録するAlexisのIDを取得します。

SELECT metadata.id FROM _ql_committed_Person AS p

WHERE p.data.FirstName = 'Alexis' and p.data.LastName = 'Pena'

副所有者として、登録します。

FROM VehicleRegistration AS r 

WHERE r.VIN = '1N4AL11D75C109151'
INSERT INTO r.Owners.SecondaryOwners
VALUE { 'PersonId' : 'BPxNh6SOCsbDTHFB4tbj2y' } --replace with your id

登録されたことを確認します。

SELECT r.Owners.SecondaryOwners FROM VehicleRegistration AS r

WHERE r.VIN = '1N4AL11D75C109151'


変更履歴の確認

VehicleRegistrationテーブルについて、変更履歴を確認します。

先程行ったcommitted viewからIDを取得する方法とは別にBY句を用いてIDを取得することも可能です。

SELECT r_id FROM VehicleRegistration AS r BY r_id

WHERE r.VIN = '1N4AL11D75C109151'

History Functionを使って、このIDの変更履歴を照会できます。

SELECT h.data.VIN, h.data.City, h.data.Owners

FROM history(VehicleRegistration) AS h
WHERE h.metadata.id = '9MCnAfEFUCK8JZsP0RpZmK' --replace with your id

赤枠で囲ってあるデータが今回の変更履歴になります。

所有者が変更され、副所有者が追加されていることがわかります。

(誤ってUPDATEクエリを入力したため不要なデータがあります)

また、各リビジョンについていつ変更があったのか、トランザクションID等のメタデータを取得できます。

SELECT VALUE h.metadata

FROM history(VehicleRegistration) AS h
WHERE h.metadata.id = '9MCnAfEFUCK8JZsP0RpZmK' --replace with your id


検証

SHA-256の暗号化ハッシュを利用して、ドキュメントの整合性を検証することができます。

想定シナリオとして、AlexisとBrentが、所有している車を車販売店で取引し、新しいモデルに変えようと考えています。それに対して、ディーラーが車の所有権を確認します。

まず、ダイジェストを取得します。

ダイジェストとは、データの変更履歴全体のフィンガープリントとして機能する、台帳の出力ファイルです。

台帳一覧画面で、対象の台帳を選択し、「ダイジェストを取得」をクリックします。

ダイジェストと、ダイジェストのヒントアドレスが取得できます。

保存をクリックすると、Amazon Ironという形式でダウンロードされます。


  • ダイジェスト: ダイジェストのSHA256ハッシュ

  • ダイジェストのヒントアドレス: ダイジェストがリクエストされた時点での最新ブロックを特定するための情報。

検証したいドキュメントのIDとBlockAdressを取得します。

SELECT r.metadata.id, r.blockAddress

FROM _ql_committed_VehicleRegistration AS r
WHERE r.data.VIN = '1N4AL11D75C109151'

左メニューの「検証」からドキュメントの検証を行います。

先程取得したドキュメントIDとBlockAddressを入力します。

ダウンロードしたダイジェストのファイルをアップロードし、「検証」をクリックします。

検証が終了すると、結果が表示されます。


削除

一覧画面の「削除」ボタンから削除することができます。

デフォルトで削除保護がかかっているため、「削除保護をオーバーライドして、この台帳を削除できるようにします。」にチェックを入れ削除します。


感想


  • 管理画面上にエンドポイントが見当たらないので、実運用する際にはどうやって使うことになるんでしょうか?


  • ユーザーが誤って削除する可能性を考慮して、スナップショットは欲しいかも。 エクスポート機能でバックアップできそうですね。

  • QLDB似合わせてPartiQLを初めて利用しましたが、レコードの中のオブジェクトまで指定して取得・更新出来るのは便利。