はじめに
業務内でAmazon QLDBを利用する可能性があり触ってみたので、備忘録としてまとめます。
Amazon QLDB
Amazon QLDB (Quantum Ledger Database)はAWSが提供する台帳型データベースです。台帳というのは一般的に、財務活動や経済活動などの履歴を記録するために使用されます。
多くの場合、台帳アプリケーションはリレーショナルデータベースに作成されたカスタムの監査テーブルや監査証跡を使用して実装されます。Amazon QLDB は、台帳のようなアプリケーションを自分で構築するという複雑な開発作業を行う必要がありません。QLDBでは、データに対する変更の履歴は不変です。変更、更新、削除はできません。これを実施するには台帳自体を削除するしか方法はありません。また、暗号化を使用して、アプリケーションのデータに意図しない変更が行われていないことを簡単に確認できます。QLDBでは、イミュータブルなトランザクションログが使用されます。ジャーナルは追加専用であり、コミットされたデータを含む、一連のシーケンスおよびハッシュチェーンされたブロックで構成されます。
QLDBはサーバーレス
QLDBは、サーバーレースアーキテクチャです。 ユーザは、事前にインフラリソースをプロビジョニングする必要がなく、利用した分に応じた料金が課せられます。
QLDBでは他のDBサービスにはない独特のストレージ構造が存在します。 ストレージには、以下の2つがあります。
- ジャーナルストレージ
- データへのすべての変更に関する完全、不変、検証可能な履歴が保存されるストレージ領域
- インデックス付きストレージ
- 台帳のテーブル、インデックス、およびインデックス付き履歴で使用されるストレージ領域
RDBとQLDBの名称の違い
RDBで一般的に使用される用語がQLDBでは異なる点が多々あります。 以下がそれぞれに対応する名称です。
QLDBの操作感確認
QLDBにて台帳の作成
クエリを実行してみる
1. 台帳を選択し、台帳テーブルを作成
create table "sample_tb"
2. インデックスを追加
create index on "sample_tb" (id)
3. 適当にデータを挿入
insert into "sample_tb" <<{'id':'01', 'name':'Yuu', 'age':28}>>
insert into "sample_tb" <<{'id':'02', 'name':'Smith', 'age':20}>>
insert into "sample_tb" <<{'id':'03', 'name':'Adam', 'age':30}>>
4. 書き込んだ内容を読み込む
select * from "sample_tb"
# 絞り込む
select * from "sample_tb" where id='02'
5. Smithの歳を変更してみる
update "sample_tb" as st
set st.age = '40'
where st.id = '02'
# 更新確認
select * from "sample_tb" where id = '02'
6. テーブルの変更履歴を見てみる
select * from history("sample_tb")
変更したジャーナルのメタデータがversion1になって追加されていることが確認できます。 この変更履歴は削除できないです。
select value h.metadata
from history("sample_tb") as h
where h.metadata.id = '96EivpHcx1O1Bm9Ft1m1g3'
QLDBの応用
AWSソリューションライブラリの一例にQLDBを利用した品質データの改ざん防止ソリューションがあります。これはQLDBの特性を生かし、データ変更の正確な履歴を維持することにより、攻撃者による品質データの改ざんを防止するシステムです。 Lambda関数はJavaScriptで書かれていますが、こういったことへの応用もできるようです。
(Amazon QLDB を活用した品質データの改ざん防止)
最後に
QLDB触ってみました。 思ったより簡単な操作感でした。また、合わせてSQL互換のPartiQLを触ってみましたが、レコードの中のオブジェクトまで指定して取得したりできるので便利だと感じました。
参考
- Anazon QLDB デベロッパーガイド
- AWS Black Belt Amazon QLDB
- Amazon QLDBのチュートリアルをやってみる
- Amazon QLDB を活用した品質データの改ざん防止d.jp/articles/getting-start-api-gateway/)