ローカルDynamoDBが成長した: ExtendDBのハンズオンレビュー

DynamoDB Localは2013年以来、AWS DynamoDBのラップトップ代替として使われてきた。Java JARで、インメモリまたはSQLiteファイルに対して動作し、ほぼすべてのリクエスト形状を受け入れ、実際の認証はなく、Streamsもかなり緩く扱う。ユニットテストには十分だ。しかしコードがPutItemとGetItemを超えたことをする瞬間から割れ始める。
ExtendDB v0.1.0が出荷された。AWSエンジニアによってRustで書かれたDynamoDBワイヤープロトコルのクリーンルーム実装で、PostgreSQLをバックエンドとし、Apache 2.0ライセンスだ。売り文句は「DynamoDB Local、ただし真剣に受け止められる」というものだ。この記事は、それが通用するかどうかを単一のMacで並行ラボとして実行したハンズオンレビューだ。
ExtendDBの正体
ExtendDBはDynamoDBのフォークではない。DynamoDBのソースコードは含まれていない。それはDynamoDBのワイヤープロトコル(AWS SDKが使用するJSON-1.0 X-Amz-Targetディスパッチ)を話すため、既存のboto3やAWS CLIクライアントはフラグ変更だけでExtendDBエンドポイントに向けられ、変更なしで動作する。
内部では小さく集中したRustワークスペースだ:
flowchart LR
bin[extenddb<br/>CLI + daemon] --> server[extenddb-server<br/>HTTP + console]
server --> engine[extenddb-engine<br/>DynamoDB op handlers]
server --> auth[extenddb-auth<br/>SigV4 + IAM policy]
engine --> core[extenddb-core<br/>types, expressions]
engine --> storage[extenddb-storage<br/>trait definitions]
storage --> pg[extenddb-storage-postgres<br/>PostgreSQL backend]extenddb-storageクレートは単なるトレイト定義だ。extenddb-storage-postgresが現時点で唯一の実装だ。異なるバックエンド(sqlite、foundationdb、何でも)は主にトレイトを実装することになる。
Verdict(評決)
DynamoDB Localを回避するテストコードを書いたことがあり(認証をモックアウト、Streamsのアサーションをスキップ、TTLをスタブ)、実際のサービスが異なる動作をするのではないかと静かに心配していたなら、ExtendDBは興味深い。認証、Streams、TTL、マルチアカウント分離、永続性を真剣に受け止めた初めてのローカルDynamoDB代替であり、ストレージレイヤーはpsqlでアクセスできるプレーンなPostgreSQLだ。
現実的な認証とストリームセマンティクスを必要とするCIパイプライン、オンプレミスやエアギャップデプロイメント、「DynamoDB Localでは動くのに...」で時間を失ってきた開発チームにとって、v0.1.0はすでに有用なツールだ。実際のサービスとのバイト完全なワイヤー互換性に依存するものについては、最初に自分でパスすること。
リンク:
- リポジトリ: https://github.com/ExtendDB/extenddb
- リリース: https://github.com/ExtendDB/extenddb/releases/tag/v0.1.0
- はじめに: https://github.com/ExtendDB/extenddb/blob/v0.1.0/docs/getting-started.md
- 動作の違い: https://github.com/ExtendDB/extenddb/blob/v0.1.0/docs/differences-from-dynamodb.md
- DynamoDB Local Dockerイメージ: https://hub.docker.com/r/amazon/dynamodb-local
- AWS DynamoDB Localドキュメント: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html
- DynamoDB TTLストリーム
userIdentity仕様: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/time-to-live-ttl-streams.html
Ercan の他のサイト
同じ著者、別の領域のサイトが2つ。