LoginSignup
10
8

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-09-11

Amazon QLDBがGAになったので、公式チュートリアルに沿って触ってみます。
チュートリアルのシナリオは、車両登録を台帳で管理するというものになっています。
Getting Started with the Amazon QLDB Console - Amazon Quantum Ledger Database (Amazon QLDB)

台帳の作成

スクリーンショット_2019-09-11_11_05_30.png

台帳名はサンプル提供の名前が入力されているので、そのまま「台帳の作成」をクリックします。
ステータスは1分も経たずに作成中からアクティブになりました。

スクリーンショット 2019-09-11 11.02.05.png

サンプルデータの入力

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

スクリーンショット 2019-09-11 11.04.35.png

データの取得

ドキュメントに沿って、クエリを作成してデータを取得します。
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を実行すると、結果のタブに取得結果が表示されました。

スクリーンショット 2019-09-11 11.16.28.png

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

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

スクリーンショット 2019-09-11 11.18.20.png

データの変更

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

  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'

スクリーンショット 2019-09-11 12.06.45.png

ベストプラクティスとして、外部キーはこのメタデータの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'

スクリーンショット 2019-09-11 12.07.41.png

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

SELECT metadata.id FROM _ql_committed_Person AS p
WHERE p.data.FirstName = 'Brent' and p.data.LastName = 'Logan'

スクリーンショット 2019-09-11 12.08.43.png

取得した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'

スクリーンショット 2019-09-11 12.17.50.png

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

SELECT metadata.id FROM _ql_committed_Person AS p
WHERE p.data.FirstName = 'Alexis' and p.data.LastName = 'Pena'

スクリーンショット 2019-09-11 12.18.51.png

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

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'

スクリーンショット 2019-09-11 12.20.28.png

変更履歴の確認

VehicleRegistrationテーブルについて、変更履歴を確認します。
先程行ったcommitted viewからIDを取得する方法とは別にBY句を用いてIDを取得することも可能です。

SELECT r_id FROM VehicleRegistration AS r BY r_id
WHERE r.VIN = '1N4AL11D75C109151'

スクリーンショット 2019-09-11 12.47.31.png

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

スクリーンショット_2019-09-11_12_56_07.png

赤枠で囲ってあるデータが今回の変更履歴になります。
所有者が変更され、副所有者が追加されていることがわかります。

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

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

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

スクリーンショット 2019-09-11 13.00.44.png

検証

SHA-256の暗号化ハッシュを利用して、ドキュメントの整合性を検証することができます。
想定シナリオとして、AlexisとBrentが、所有している車を車販売店で取引し、新しいモデルに変えようと考えています。それに対して、ディーラーが車の所有権を確認します。

まず、ダイジェストを取得します。
ダイジェストとは、データの変更履歴全体のフィンガープリントとして機能する、台帳の出力ファイルです。
台帳一覧画面で、対象の台帳を選択し、「ダイジェストを取得」をクリックします。

スクリーンショット_2019-09-11_14_06_17.png

ダイジェストと、ダイジェストのヒントアドレスが取得できます。
保存をクリックすると、Amazon Ironという形式でダウンロードされます。

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

スクリーンショット 2019-09-11 14.12.13.png

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

SELECT r.metadata.id, r.blockAddress
FROM _ql_committed_VehicleRegistration AS r 
WHERE r.data.VIN = '1N4AL11D75C109151'

スクリーンショット 2019-09-11 14.23.11.png

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

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

スクリーンショット 2019-09-11 14.27.57.png

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

スクリーンショット 2019-09-11 14.28.42.png

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

スクリーンショット 2019-09-11 14.27.26.png

削除

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

スクリーンショット 2019-09-11 14.36.05.png

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

スクリーンショット 2019-09-11 14.36.22.png

感想

  • 管理画面上にエンドポイントが見当たらないので、実運用する際にはどうやって使うことになるんでしょうか?
  • ユーザーが誤って削除する可能性を考慮して、スナップショットは欲しいかも。 エクスポート機能でバックアップできそうですね。
  • QLDB似合わせてPartiQLを初めて利用しましたが、レコードの中のオブジェクトまで指定して取得・更新出来るのは便利。
10
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8