Dynoxide について
Dynoxide は Rust で書かれ、SQLite をストレージとする DynamoDB エミュレーターです。HTTP サーバー、MCP サーバー、組み込みライブラリとして動作し、起動が速くメモリ使用量が少ないため、ローカル開発、テスト、CI を主な対象としています。
主な機能
- 01DynamoDB 互換の HTTP API サーバー
- 02Rust と iOS アプリに組み込めるライブラリモード
- 03MCP 経由で公開される 35 の DynamoDB ツール
- 04SQLite ストレージと WebAssembly ビルド
- 05GSI、LSI、トランザクション、PartiQL、Streams への対応
活用シーン
- 01統合テスト用の高速起動する DynamoDB 代替環境
- 02Rust のテストケースごとに分離したインメモリデータベース
- 03コーディングエージェントによるローカル DynamoDB の操作
MCP 対応
Dynoxide の MCP サーバーは 35 の DynamoDB ツールを MCP クライアントに公開し、コーディングエージェントがローカルデータベースを直接読み書きできるようにします。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
35掲載時のツール一覧 · 5 日前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| statements | any | はい | PartiQL ステートメントの配列。各要素は {Statement: "...", Parameters?: [...], ConsistentRead?: true|false, ReturnValuesOnConditionCheckFailure?: "ALL_OLD"|"NONE"} です。ConsistentRead は要素ごとに設定し、その要素の読み取りに適用される課金レートを指定します。返される行には影響しません。ReturnValuesOnConditionCheckFailure が ALL_OLD の場合、条件に失敗した UPDATE または DELETE の対象項目が、その要素の Error に返されます。バッチ内の操作はすべて読み取り、またはすべて書き込みである必要があります。SELECT 要素ではテーブルの主キーを指定し、インデックスは指定できません。 |
| return_consumed_capacity | enum | いいえ | 返す消費キャパシティ:TOTAL は操作全体の合計、INDEXES はテーブルとインデックス別の内訳、NONE(デフォルト)は返さないことを示します。数値は DynamoDB の課金ルールに従い、同じリクエストに対して DynamoDB API が返す値と一致します。INDEXES | TOTAL | NONE | null |
詳細
Dynoxide
SQLite をバックエンドとする、Rust 製の DynamoDB エミュレーターです。HTTP サーバーまたはコーディングエージェント向けの MCP サーバーとして実行でき、Rust および iOS アプリケーションにライブラリとして組み込めます。また、ブラウザー向けに WebAssembly にコンパイルできます。
上の crates.io バッジに表示されるのは、Rust ライブラリのみを対象とする クレート のバージョンです。依存関係としてではなくインストールするものはすべて、バイナリ、npm パッケージ、コンテナーイメージ、ブラウザーエンジン、Action を含め、別の 製品 バージョンを持ちます。これは
dynoxide --versionが出力する番号であり、バグ報告に記載する番号です。2つのバージョンがある理由。
Dynoxide を選ぶ理由
Dynoxide を開発したのは、DynamoDB Local が遅く、重く、組み込みに対応していないためです。JVM が必要で、一般的な Docker ベースの構成では、有用な作業を始める前にコールドスタートに約3秒、アイドル時のメモリに約209 MB、Docker イメージに約225MB(ディスク上では約473 MB)が追加で必要です。統合テストを実行する場合、Docker の起動、JVM のウォームアップ、そしてパイプラインの待ち時間が発生します。
Dynoxide はネイティブバイナリです。数ミリ秒で起動し、アイドル時のメモリ使用量は約7.2 MB、ダウンロードサイズは約3 MB です。任意の DynamoDB SDK を接続すれば、テストをそのまま実行できます。
Rust プロジェクト向けには、HTTP レイヤーを介さず Database::memory() で API を直接呼び出す組み込みモードもあります。各テストは、起動コストなしで独立したインメモリデータベースを使用します。また、ランタイム依存関係のないネイティブライブラリにコンパイルされるため、iOS を含め、DynamoDB Local が動作しないプラットフォームでも実行できます。
パフォーマンス
ローカル開発(Apple Silicon)
| 指標 | Dynoxide(組み込み) | Dynoxide(HTTP) | DynamoDB Local |
|---|---|---|---|
| コールドスタート | 約0.2ms | 約15ms | 約2,287ms |
| GetItem(p50) | 9µs | 0.1ms | 0.8ms |
| PutItem スループット | 約51,613 ops/s | 約6,703 ops/s | 約945 ops/s |
| 50テストのスイート(逐次) | 約484ms | 約569ms | 約2,407ms |
| 50テストのスイート(4並列) | 約203ms | 約235ms | 約1,189ms |
CI(GitHub Actions)
ubuntu-latest(4コア AMD EPYC 7763、16GB RAM)での数値です。コミット 17be96a。
| 指標 | Dynoxide(組み込み) | Dynoxide(HTTP) | DynamoDB Local | LocalStack(全サービス) | Floci | MiniStack |
|---|---|---|---|---|---|---|
| コールドスタート | <1ms | 約2ms | 約2,605ms | 約12,217ms | 約228ms | 約2,636ms |
| GetItem(p50) | 16µs | 0.3ms | 0.8ms | - | - | - |
| 50テストの CI スイート | 828ms | 859ms | 2,628ms | - | - | - |
| 全ワークロード(10K アイテム) | - | 3.2s | 12.2s | - | - | - |
| バイナリ/イメージ(ダウンロード) | 約3 MB | 約3 MB | 225 MB | 1.1 GB | - | - |
| バイナリ/イメージ(ディスク上) | 8 MB | 8 MB | 473 MB | 1.1 GB | 234 MB | 162 MB |
| アイドル時メモリ(RSS) | 約7.2 MB | 約8 MB | 約209 MB | 約387 MB | 約23 MB | 約47 MB |
Apple Silicon では、CPU が高速なため、ネイティブコードと JVM のオーバーヘッドの差が拡大し、差はさらに大きくなります。どちらも同じベンチマークスイートで実測した値です。測定方法の詳細と操作ごとの内訳 →
適合性
Dynoxide は、AWS 本体と主要なすべての DynamoDB エミュレーターに対して同じテストマトリックスを実行する、DynamoDB 適合性スイートである Parity Suite によって、実際の DynamoDB との適合性を継続的に検証されています。スイートの拡充や各エンジンの変更に伴って合格率も変わるため、古くなるスナップショットを固定するのではなく、最新の結果をご覧ください。
- 最新の結果:各エンジンの現在の合格率を、ティア別に表示しています
- paritysuite/dynamodb-conformance:スイート本体、生の結果、各ターゲットの実行方法をご覧いただけます
開示事項:Dynoxide と Parity Suite は同じ人物がメンテナンスしています。このスイートでは、他のすべてのエンジンと同じ公開マトリックスで Dynoxide を評価しており、結果とテストコードはオープンです。
これはネイティブビルドを対象としています。WebAssembly ビルドは独立した行として評価されます。実装済みのテストにはすべて合格していますが、いくつかの操作がまだ未実装のため、スキップ数は他のどのターゲットよりも大幅に多くなっています。
比較
| Dynoxide | DynamoDB Local | LocalStack(全サービス) | Floci | MiniStack | dynalite | |
|---|---|---|---|---|---|---|
| 言語 | Rust | Java | Python + Java | Java(GraalVM ネイティブイメージ) | Python | Node.js |
| ストレージ | SQLite | SQLite | SQLite(DDB Local 経由) | 独自(インメモリ、永続化または WAL) | 独自(インメモリ、任意でディスク上に状態を保存) | LevelDB |
| 実行時の依存関係 | - | JVM | Docker + LocalStack アカウント(認証トークン) | Docker | Docker または Python | Node.js |
| 組み込み可能(Rust / iOS) | ✓ | - | - | - | - | - |
| エージェント向け MCP サーバー | ✓ | - | - | - | - | - |
LocalStack は内部で DynamoDB エンジンとして DynamoDB Local を使用するため、起動時とメモリのオーバーヘッドには、DynamoDB Local の JVM と LocalStack 独自の Python ルーティングレイヤーが含まれます。2026 年 3 月以降、以前は無料だったサービスも含め、起動には LocalStack アカウントと LOCALSTACK_AUTH_TOKEN が必要です。Floci と MiniStack は LocalStack と同様の汎用 AWS エミュレーターであり、それぞれ DynamoDB Local ではなく独自の DynamoDB エンジンを備えています。
クイックスタート
何もインストールせずにローカルサーバーを実行します。
npx dynoxide --port 8000
または、プロジェクトにインストールしてバージョンを固定できます。その後は npx dynoxide でそのコピーが使用されます。
npm install --save-dev dynoxide
または、amazon/dynamodb-local のドロップイン代替として Docker で実行します。
docker run --rm -p 8000:8000 ghcr.io/nubo-db/dynoxide
任意の AWS SDK または DynamoDB クライアントから http://localhost:8000 を指定してください。Homebrew、Cargo、ビルド済みバイナリ、Rust ライブラリとしての組み込みについては、インストールガイドをご覧ください。
--log quiet を追加すると、起動時とシャットダウン時の情報メッセージが
stderr に出力されなくなります(テストスイートで便利です)。serve、mcp、
import --serve、または --mcp で使用でき、警告とエラーは引き続き出力されます。
--log を指定しない場合、出力は変わりません。
ドキュメント
- インストール - npm、Homebrew、Cargo、バイナリ、GitHub Actions、Docker
- HTTP サーバー - DynamoDB 互換の HTTP API の実行
- Testcontainers - テストスイートからコンテナを操作する方法と、必要な待機戦略
- MCP サーバー - コーディングエージェント向けの Model Context Protocol サーバー
- DynamoDB Streams - ストリームレコードの有効化と読み取り
- インポート CLI - データの読み込み、テーブルのフィルタリング、匿名化
- WebAssembly - ブラウザー向けビルドと埋め込み仕様
- Rust ライブラリとしての使用 - 組み込みモードと機能フラグ
- 互換性 - DynamoDB と比較した操作、式、PartiQL の対応状況
- バージョニング - バージョン番号が保証する内容と、メジャーバージョンを上げる条件
- リリース - リリースの頻度とプロセス
サポートする操作
Dynoxide は、テーブル、項目、クエリとスキャン、バッチ、トランザクション、PartiQL、ストリーム、TTL、タグにわたる DynamoDB API を実装しています。GSI と LSI、すべての式構文、DynamoDB 互換のページネーション、検証、エラーコードもサポートしています。操作ごとの詳細と比較については、互換性の概要をご覧ください。
制限事項
Dynoxide はローカル開発、テスト、CI 向けに作られており、本番環境で DynamoDB を置き換えるものではありません。そのため、意図的に実装していない機能が 2 種類あります。
ローカルで同等の機能を利用できないクラウド専用の操作は実装されていません。バックアップとポイントインタイムリストア、グローバルテーブル、Kinesis ストリーミング、リソースポリシー、キャパシティ管理が該当します。これらを呼び出すと、UnknownOperationException が返されます。
テスト時に把握しておくとよい動作上の違いもいくつかあります。
ConsistentReadは受け付けられますが、動作に影響しません。SQLite は強い一貫性を持つため、読み取りはすべて最初から強い一貫性を持ちます。そのため、結果整合性のある読み取りは再現できません。- ストリームが公開するシャードは 1 つだけです。
DescribeStreamは 1 つのシャードを返し、ページネーション用のExclusiveStartShardIdおよびLimitパラメーターは受け付けられますが、無視されます。 - トランザクションの競合エラー(
TransactionConflictException、TransactionInProgressException)はエミュレートされません。単一プロセス内では同時競合が発生しないためです。
機能ごとの対応状況については、最新の機能対応表をご覧ください。操作ごとの詳細は、互換性の概要に記載されています。
謝辞
Dynoxide の DynamoDB API のセマンティクスと検証ロジックは、Michael Hart が LevelDB を基盤に構築し、現在は Architect チームがメンテナンスしている優れた DynamoDB エミュレーター、dynaliteを参考にしています。
Dynoxide はクリーンルーム方式で実装された Rust プロジェクトです。コードを直接移植したものはありませんが、エッジケースやエラーメッセージも含め、実際の DynamoDB の動作に合わせるための dynaliteの綿密な取り組みは、非常に貴重な参考資料となりました。
Dynoxide はストレージレイヤーとして SQLite を使用しています。(AWS の DynamoDB Localも内部で SQLite を使用しています。)
ライセンス
MIT と Apache 2.0 のデュアルライセンスです。LICENSE-MITおよびLICENSE-APACHEをご覧ください。
商標
Amazon DynamoDB、DynamoDB、および AWS は、Amazon.com, Inc. またはその関連会社の商標です。Dynoxide は独立したプロジェクトであり、Amazon と提携、承認、または後援を受けていません。また、ここに記載されている内容は、これらの名称や商標を使用する権利を付与するものではありません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。