Slide 1

Slide 1 text

GoでDynamoDBのCLI(便利) を作った shuntaka 2022/06/11 Kyoto.go remote #32 LT会

Slide 2

Slide 2 text

自己紹介 kyoto.go初参加です!宜しくお願いします😌 埼玉からお送りしています! GitHub: https://github.com/shuntaka9576 Twitter: @shuntaka_jp blog: https://shuntaka.dev 仕事: AWS,IoT,サーバサイド,TypeScript,Pythonなど Go歴: 仕事ではほぼなく、ときどき趣味で書きます、、 趣味: 原神

Slide 3

Slide 3 text

https://github.com/shuntaka9576/ddbrew DynamoDBのCLI(便利)を作りました https://zenn.dev/shuntaka/articles/68072c0 0f54700

Slide 4

Slide 4 text

そもそもDynamoDB RDBのような複雑なクエリ/トランザクションを犠牲に、引き換えにスケーラビリティ や安定したレイテンシーを実現

Slide 5

Slide 5 text

DynamoDBのR/Wの制約 読み込みリクエスト1回 : ペイロードサイズ4MB 書き込みリクエスト1回 : 最大 25レコード(1レコード400KB) etc..

Slide 6

Slide 6 text

テーブルのバックアップが柔軟にできない(個人的) アカウントA アカウントB 準備するサービス多い ... コンソールポチ数が多い ..

Slide 7

Slide 7 text

BatchRequestを作るのが面倒 { "RequestItems" : RequestItems } RequestItems { "TableName1" : [ Request, Request, ... ], "TableName2" : [ Request, Request, ... ], ... } Request ::= PutRequest | DeleteRequest PutRequest ::={ "PutRequest" : { "Item" : { "Attribute-Name1" : Attribute-Value, "Attribute-Name2" : Attribute-Value, ... } } }

Slide 8

Slide 8 text

GoでCLIを作る Goバイナリ Goバイナリ バックアップ リストア jsonl jsonl ① ② ③ ① ③ RU抑制機能 WU抑制機能 ②

Slide 9

Slide 9 text

https://asciinema.org/a/500437 リストアのデモ DynamoDB(オンデマンド)で約8366くらい。DynamoDBがスケール状態で変化するのであくまで参考まで

Slide 10

Slide 10 text

リストア仕組み worker Pool worker worker worker worker Batch Writer jsonl ① 必要レコード分要 求(default: 25) BatchReq generator ② file.Seek, file.Read で必要な行数取得 ③取得OK ④ ・取りすぎた場合は捨てる ・次読出位置を覚える ・BatchWirteRequestへ変換 ⑤ 返却 ⑥ 書き込み

Slide 11

Slide 11 text

for { select { case <-ctx.Done(): break LOOP case <-ticker.C: limit := *b.LimitUnit for { reqUnitSize := DEFAULT_UNIT_SIZE if limit < reqUnitSize { reqUnitSize = limit } batchReq, err := generator.generate(reqUnitSize) if err != nil { if batchReq.Number() == 0 && err == ErrBatchEOF { close(b.Done) break LOOP } } reqs <- batchReq atomic.AddInt64(b.RemainCount, 1) limit -= batchReq.totalWU if limit == 0 { break } } } } 秒間書き込み制御 1秒に1回イベント受け取る 書き込みリクエスト数を算出 リクエスト生成 リクエストをワーカーへ送信

Slide 12

Slide 12 text

主なライブラリ aws-sdk-go-v2 github.com/alecthomas/kong github.com/pkg/errors(メンテモードですが、枯れているっぽいので利用)

Slide 13

Slide 13 text

github.com/alecthomas/kong var CLI struct { Globals Backup struct { TableName string `arg:"" name:"tableName" help:"Specify table name to backup."` File string `short:"f" name:"file" help:"Specify the file path to output (default backup_tableName_yyyymmdd-HHMMSS.jsonl)."` Limit int `short:"l" help:"Limit the number of reads per second to the specified number (units are automatically determined as RCUs for provisioned tables and RRUs for on-demand tables)."` } `cmd:"" help:"Backup DynamoDB table."` ...

Slide 14

Slide 14 text

今後のはなし デグレしないようにUnit/E2Eを拡充したい E2Eは、litestreamのintegrationディレクトリ を参考に実装している

Slide 15

Slide 15 text

ご静聴頂きありがとうございます。 (運営者様) 機会を頂きありがとうございます。

Slide 16

Slide 16 text

参考文献 ・DynamoDB関連  ・AWS re:Invent 2020: Data modeling with Amazon DynamoDB

Slide 17

Slide 17 text

以上