DynamoDB Localは2013年以来、AWS DynamoDBのラップトップ代替として使われてきた。Java JARで、インメモリまたはSQLiteファイルに対して動作し、ほぼすべてのリクエスト形状を受け入れ、実際の認証はなく、Streamsもかなり緩く扱う。ユニットテストには十分だ。しかしコードがPutItemGetItemを超えたことをする瞬間から割れ始める。

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はすでに有用なツールだ。実際のサービスとのバイト完全なワイヤー互換性に依存するものについては、最初に自分でパスすること。

リンク: