Amazon QLDB StreamingによるLedger Replication検証
検証の流れ
1. QLDBを作成
2. QLDB Streams を流し込むKinesis Data Streamsを作成
3.1. Kinesis Data Streams から Kinesis Firehoseを経由してS3へデータを保存する
3.2. Kinesis Data Streams から Lambda へ Streamingして、QLDBへクエリを流し込む
4. Lambdaでは .NET Core 2.1(C#) にて実装し、KinesisEventsからストリームデータを取得し、Amazon.QLDB.Driverを利用
5. Ledger AからLedger Bへ同期されていることを確認した
結論
現行のストリームの利用用途しては下記になりそう。
QLDBのジャーナルIndexing(クロスリージョンも可)
IndexingしたDynamoDBやRDBMSからジャーナルが正しいことを暗号学的に検証ができる(監査性はある程度担保できる)
ただしAPIを開けてもらうのとさして変わらない
レプリケーションという観点において
Ledger AからLedger Bからの同期はあくまで、ジャーナルを完全にインポートしているわけではなく、
同一のPartiQLのクエリを実行しているだけなので、レプリケーションされているわけではない。
現行(2020/03/30)では別アカウントへのQLDBの同期は、Ledger Aが持っているアカウントの責務で、Ledger Bへのアクセス許可をしてもらった上で、Ledger Aを持つアカウントが持つLambda 経由で書き込むのが限界そう。
なので、transactionId等々はLedger AとLedger Bで異なることになるので監査性という観点でも厳しい。
検証アーキテクチャ
https://gyazo.com/9272215b075e06e378f7fcaf7bf07385
Stream 設定
QLDB Streams に付与するロールポリシー(検証用なのでFull Access)
https://gyazo.com/3c7916751ad909dca7d8ce07aaf541db
Streamデータ
code:stream
????
@63f23f0d83a34b8aba6ee65e81500867037d7c149d58bb2f178f67aa12b4ef53
@589ec99df0253bdd44d07c4b3f3d919a3a3da09b0e55c51dbe86576334b7e18b
@3ff659a517ef6cdd283114bf77671cb0a26028f902e322e80187b2589fb537d0
@0273202f9c51cfa12a8295831e23dc3dfd08d4b85a46945830fb212a8c0c831d
@51790772a97f1bb1c263d58fa7e6351000c87374399072d29668cb05b464feb7
@cbbd33e0a846567f54806c2f9573f97040aa88f02ad876e782ae86f540b9a592??????????????qldbStreamArn?recordType?payload?blockAddress?strandId?sequenceNo?transactionId??blockTimestamp?blockHash?entriesHash??previousBlockHash??entriesHashList??transactionInfo?statements?statement?startTime??statementDigest?documents??5vHoNXJVuicDWhogy2lK5D?tableName?tableId??0QcEz22TKVpIZrgE3n0JXu??4ilT4c668Kr3ZK6OnrT0hK??6mW3b3KEs32DpKWxaXXhdn??5ZziI86p5y1LMgoGsBFZN0??revisionSummaries?hash?documentId?????arn:aws:qldb:ap-northeast-1:719818752140:stream/akinama-training/EVaGYclGX1qBTdmikUFWRp??BLOCK_SUMMARY?????????J3hZDFGFgRa1WLDqgCzQLB?"l???6GZuSwWCf1b8JvBurdxVXX?m????????O????c??
??K??n?^?Pg}|?X?/?g???S????7??GgW???M??7
????w??e!.?n??????I???4?
?
???a???0r?x????c1?Y_?????|0?H??:?????u?q?c?
?n?$?W??~
W??qb?O???O?D@(?B??zj;?????q?UF????PKj??|?]L??E??Q?7??m???u?????eA5y??g??tQt9??????q??V&??? ?????????INSERT INTO Person
<< {
'FirstName' : 'Raul',
'LastName' : 'Lewis',
'DOB' : 1963-08-19T,
'GovId' : 'LEWISR261LL',
'GovIdType' : 'Driver License',
'Address' : '1719 University Street, Seattle, WA, 98109'
},
{
'FirstName' : 'Brent',
'LastName' : 'Logan',
'DOB' : 1967-07-03T,
'GovId' : 'LOGANB486CG',
'GovIdType' : 'Driver License',
'Address' : '43 Stockert Hollow Road, Everett, WA, 98203'
},
{
'FirstName' : 'Alexis',
'LastName' : 'Pena',
'DOB' : 1974-02-10T,
'GovId' : '744 849 301',
'GovIdType' : 'SSN',
'Address' : '4058 Melrose Street, Spokane Valley, WA, 99206'
},
{
'FirstName' : 'Melvin',
'LastName' : 'Parker',
'DOB' : 1976-05-22T,
'GovId' : 'P626-168-229-765',
'GovIdType' : 'Passport',
'Address' : '4362 Ryder Avenue, Seattle, WA, 98101'
},
{
'FirstName' : 'Salvatore',
'LastName' : 'Spencer',
'DOB' : 1997-11-15T,
'GovId' : 'S152-780-97-415-0',
'GovIdType' : 'Passport',
'Address' : '4450 Honeysuckle Lane, Seattle, WA, 98101'
} >>?k????????
???:7??????Up?O?6??????+sw&o?A????????Person???JuvoQm8tHg6BkoJ5Jv3VzM?? ?????Person???JuvoQm8tHg6BkoJ5Jv3VzM?? ?????Person???JuvoQm8tHg6BkoJ5Jv3VzM?? ?????Person???JuvoQm8tHg6BkoJ5Jv3VzM?? ?????Person???JuvoQm8tHg6BkoJ5Jv3VzM?? ????????X????%;?D?|K?=??:=??U???Wc4??????0QcEz22TKVpIZrgE3n0JXu???????Y??l?(1?wg??(??"???X??7????4ilT4c668Kr3ZK6OnrT0hK?????s /?Q??*???#?=???ZF?X0?!*?????5ZziI86p5y1LMgoGsBFZN0?????Qyr???c????5?st9?r??h??d?????5vHoNXJVuicDWhogy2lK5D???????3??FVT?l/?s?p@???*?v?????@??????6mW3b3KEs32DpKWxaXXhdn??????????????qldbStreamArn?recordType?payload?tableInfo?tableName?tableId?revision?blockAddress?strandId?sequenceNo?hash?data?FirstName?LastName?DOB?GovId?GovIdType?Address?metadata?id?txTime?txId?????arn:aws:qldb:ap-northeast-1:719818752140:stream/akinama-training/EVaGYclGX1qBTdmikUFWRp???REVISION_DETAILS????????Person???JuvoQm8tHg6BkoJ5Jv3VzM?????????J3hZDFGFgRa1WLDqgCzQLB?"l???X????%;?D?|K?=??:=??U???Wc4????????Brent??Logan?e??????LOGANB486CG???Driver License???43 Stockert Hollow Road, Everett, WA, 98203??????0QcEz22TKVpIZrgE3n0JXu? ?k????????6???6GZuSwWCf1b8JvBurdxVXX??????????????qldbStreamArn?recordType?payload?tableInfo?tableName?tableId?revision?blockAddress?strandId?sequenceNo?hash?data?FirstName?LastName?DOB?GovId?GovIdType?Address?metadata?id?txTime?txId?????arn:aws:qldb:ap-northeast-1:719818752140:stream/akinama-training/EVaGYclGX1qBTdmikUFWRp???REVISION_DETAILS????????Person???JuvoQm8tHg6BkoJ5Jv3VzM?????????J3hZDFGFgRa1WLDqgCzQLB?"l?????Y??l?(1?wg??(??"???X??7??????Alexis??Pena?e??????744 849 301??SSN???4058 Melrose Street, Spokane Valley, WA, 99206??????4ilT4c668Kr3ZK6OnrT0hK? ?k????????6???6GZuSwWCf1b8JvBurdxVXX??????????????qldbStreamArn?recordType?payload?tableInfo?tableName?tableId?revision?blockAddress?strandId?sequenceNo?hash?data?FirstName?LastName?DOB?GovId?GovIdType?Address?metadata?id?txTime?txId?????arn:aws:qldb:ap-northeast-1:719818752140:stream/akinama-training/EVaGYclGX1qBTdmikUFWRp???REVISION_DETAILS????????Person???JuvoQm8tHg6BkoJ5Jv3VzM?????????J3hZDFGFgRa1WLDqgCzQLB?"l???s /?Q??*???#?=???ZF?X0?!*???????Salvatore??Spencer?e???????S152-780-97-415-0??Passport???4450 Honeysuckle Lane, Seattle, WA, 98101??????5ZziI86p5y1LMgoGsBFZN0? ?k????????6???6GZuSwWCf1b8JvBurdxVXX??????????????qldbStreamArn?recordType?payload?tableInfo?tableName?tableId?revision?blockAddress?strandId?sequenceNo?hash?data?FirstName?LastName?DOB?GovId?GovIdType?Address?metadata?id?txTime?txId?????arn:aws:qldb:ap-northeast-1:719818752140:stream/akinama-training/EVaGYclGX1qBTdmikUFWRp???REVISION_DETAILS????????Person???JuvoQm8tHg6BkoJ5Jv3VzM?????????J3hZDFGFgRa1WLDqgCzQLB?"l???Qyr???c????5?st9?r??h??d???????Raul??Lewis?e??????LEWISR261LL???Driver License???1719 University Street, Seattle, WA, 98109??????5vHoNXJVuicDWhogy2lK5D? ?k????????6???6GZuSwWCf1b8JvBurdxVXX??????????????qldbStreamArn?recordType?payload?tableInfo?tableName?tableId?revision?blockAddress?strandId?sequenceNo?hash?data?FirstName?LastName?DOB?GovId?GovIdType?Address?metadata?id?txTime?txId?????arn:aws:qldb:ap-northeast-1:719818752140:stream/akinama-training/EVaGYclGX1qBTdmikUFWRp???REVISION_DETAILS????????Person???JuvoQm8tHg6BkoJ5Jv3VzM?????????J3hZDFGFgRa1WLDqgCzQLB?"l?????3??FVT?l/?s?p@???*?v?????@????????Melvin??Parker?e???????P626-168-229-765??Passport???4362 Ryder Avenue, Seattle, WA, 98101??????6mW3b3KEs32DpKWxaXXhdn? ?k????????6???6GZuSwWCf1b8JvBurdxVXX????,????bC?No?
PartiQL
code: query
INSERT INTO Person
<< {
'FirstName' : 'Raul',
'LastName' : 'Lewis',
'DOB' : 1963-08-19T,
'GovId' : 'LEWISR261LL',
'GovIdType' : 'Driver License',
'Address' : '1719 University Street, Seattle, WA, 98109'
},
{
'FirstName' : 'Brent',
'LastName' : 'Logan',
'DOB' : 1967-07-03T,
'GovId' : 'LOGANB486CG',
'GovIdType' : 'Driver License',
'Address' : '43 Stockert Hollow Road, Everett, WA, 98203'
},
{
'FirstName' : 'Alexis',
'LastName' : 'Pena',
'DOB' : 1974-02-10T,
'GovId' : '744 849 301',
'GovIdType' : 'SSN',
'Address' : '4058 Melrose Street, Spokane Valley, WA, 99206'
},
{
'FirstName' : 'Melvin',
'LastName' : 'Parker',
'DOB' : 1976-05-22T,
'GovId' : 'P626-168-229-765',
'GovIdType' : 'Passport',
'Address' : '4362 Ryder Avenue, Seattle, WA, 98101'
},
{
'FirstName' : 'Salvatore',
'LastName' : 'Spencer',
'DOB' : 1997-11-15T,
'GovId' : 'S152-780-97-415-0',
'GovIdType' : 'Passport',
'Address' : '4450 Honeysuckle Lane, Seattle, WA, 98101'
} >>
参考コード
code:example.cs
// LedgerAのStreamから発火されるLambda Function
public string FunctionHandler(KinesisEvent kinesisEvent)
{
var builder = PooledQldbDriver.Builder();
var driver = builder.WithLedger("LedgerB")
.Build();
var session = driver.GetSession();
foreach (var record in kinesisEvent.Records)
{
var partiql = GetPartiqlFromKinesisRecord(record.Kinesis);
session.Execute(partiql)
}
}
Kinesis Recap
QLDB Getting Started
LInks
memo
txの積み重ねがstateDBに反映される: journalデータ=QLDBに何をしましたかというtxデータ
何をするかというのが積み上がっていく。冪等に実行され、状態が再現される
transactionId等々はLedger AとLedger Bで異なることになるので監査性という観点でも厳しい