中級読了 3 分

DynamoDB Local と LocalStack への接続方法

ローカルで DynamoDB が動いていて、コードはそれに問題なく話しかけている — でも 毎回 scan スクリプトを書くのではなく、テーブルを見たい。クライアントを ローカルエンドポイントに接続するのは2つの変更です。正しい URL を指定し、使い捨ての 認証情報を渡すこと。以下の詳細は、人がつまずくところです — リージョンの名前空間化、 英数字キーのルール、そして 80004566 のポートの違いです。

DynamoDB Local と LocalStack: 何に接続しているのか

どちらも AWS アカウントなしで localhost に DynamoDB API を提供しますが、別物です。

つまり接続における実用上の唯一の違いはエンドポイント URL です。スタンドアロンの DynamoDB Local には :8000、LocalStack 経由の DynamoDB には :4566。それ以外 — API、認証情報のトリック、GUI 設定 — はすべて同一です。

みんながつまずくエンドポイント + ダミー認証情報のセットアップ

AWS SDK と CLI は、ローカルエンドポイントに話しかけるときでもアクセスキーとリージョンを 要求します — が、それらの値は 本物である必要はありません。AWS 自身のドキュメントは、 これらの値は「ローカルで実行するために有効な AWS の値である必要はない」と述べています (AWS ドキュメント)。

明白でない2つの落とし穴です。

  • リージョン/アクセスキーがデータを暗黙に名前空間化します。 -sharedDb フラグがないと、DynamoDB Local はアクセスキー ID + リージョンの組み合わせごとに 別々の myaccesskeyid_region.db ファイルを書き込みます — AWS の正確な命名です。 アプリが使ったのとは異なるキーやリージョンで接続すると、テーブルが 消えたように見えます。実は別のファイルにあるだけです。-sharedDb で実行する(すべての クライアントに対して1つの shared-local-instance.db)か、アプリが使う正確なキー + リージョンに 合わせましょう。
  • アクセスキー ID は英数字でなければなりません — DynamoDB Local では記号は不可です。 AWS ドキュメントは、 AWS_ACCESS_KEY_ID に含められるのは A–Za–z0–9 だけだと述べています。AWS は これを DynamoDB Local 2.0.0(および 1.23.0+)で導入したので、以前のイメージで動いていた 特殊文字を含むキーが今は失敗します (AWS re:Post)。 下のエラーを参照してください。

LocalStack の安全なデフォルトは test / test です。 シークレットキーを完全に無視し、 シークレット値を検証することはありません。AKIA…/ASIA… のような本物らしいキーは 安全策として拒否され、ダミーアカウント 000000000000 にフォールバックしますtest のような任意のキーが解決されるのと同じアカウントです。test を使い続けましょう。

AWS CLI での接続(動作確認)

GUI を向ける前に、CLI からエンドポイントが生きているか確認しましょう。CLI は ローカルエンドポイントをデフォルトにできないので、 すべてのコマンドで --endpoint-url を渡します。

DynamoDB Local:

aws dynamodb list-tables --endpoint-url http://localhost:8000

LocalStack(同じコマンド、別のポート):

aws dynamodb list-tables --endpoint-url http://localhost:4566

何らかの認証情報が設定されていれば(~/.aws/credentials 内のフェイクのものや AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY 経由でも)、これはテーブルのリストを返します。 エラーなしの空リストは、エンドポイントは動いているがあなたが別のキー/リージョンの 名前空間を見ていることを意味します — 上記の落とし穴を参照してください。

DynamoDB Local GUI: DynoTable でローカルテーブルを参照・クエリ

CLI が動いたら、GUI には同じ3つの値が必要です。エンドポイントリージョン、 そして任意の ダミー認証情報。CLI は目で読む DynamoDB-JSON を返しますが、 GUI は同じデータを、ソート・フィルター・編集できるテーブルとしてレンダリングします。

DynoTable では、接続を追加してカスタムエンドポイントを設定します。

  • エンドポイント: http://localhost:8000(DynamoDB Local)または http://localhost:4566(LocalStack)
  • リージョン: アプリが使うもの — 例 us-east-1。ここではラベルであって、 本物の AWS リージョンではありませんが、同じデータ名前空間に着地するために一致している 必要があります。
  • アクセスキー / シークレット: 何でも可(test / test が慣例)。DynamoDB Local では アクセスキーは英数字のみです。

そこから項目を参照し、QueryScan を実行し、CLI で JSON を手作業で マーシャリングする代わりに、行をビジュアルに編集できます。フィクスチャを読み込むときは、 DynamoDB-JSON コンバーターがプレーン JSON をワイヤー フォーマットに変換し、Query vs Scanがどちらの読み取りを 選ぶべきかを扱っています。 LocalStack DynamoDB ビューアーも同じ手順で — ポートが 4566 に変わるだけです。

DynoTable はローカル専用のデスクトップソフトウェアなので、localhost に向けても フィクスチャはあなたのマシンに留まります。GUI の全体像については、 DynamoDB GUI 比較を参照してください。

よくあるエラー(リージョンの不一致、ポート、認証情報)

  • Connection refused。 間違ったポート — 8000 は DynamoDB Local、4566 は LocalStack です。コンテナが実際にポートを公開したかも確認してください (docker run -p 8000:8000 amazon/dynamodb-local)。LocalStack では、サービスが http://localhost:4566/_localstack/healthで 起動しているか確認してください。
  • DynamoDB Local での The Access Key ID or Security Token is Invalid 2.0.0(および 1.23.0+)イメージ以降、アクセスキー ID は 英数字のみでなければなりません。 以前のイメージで動いていた記号付きのキーは今は失敗します — 文字/数字 (例 test)に置き換え、すべてのツールを一致させて更新してください。
  • LocalStack に対する The security token included in the request is invalid これはほぼ常に認証情報ではなく エンドポイント の問題です — SDK クライアントが --endpoint-url / endpoint_url を取りこぼし、本物の AWS エンドポイントに当たって、ダミーキーが拒否されています。クライアントが実際に http://localhost:4566 を指しているか確認してください。
  • SDK/CLI からの認証情報エラー。 ローカルエンドポイントでも何らかの 認証情報の存在が必要です。SDK の認証情報チェーンが解決するように、AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY(またはフェイクのプロファイル)を設定してください。
  • httphttps ローカルエンドポイントは素の http です。https:// URL は TLS ハンドシェイクで失敗します。

DynamoDB Local は私の実 AWS テーブルと同じデータですか?

いいえ — ローカルとクラウドは完全に別々のストアです。DynamoDB Local(および LocalStack の DynamoDB)はデータをローカルファイルかメモリに保持します。あなたの AWS アカウントに触れることはなく、 AWS リージョン/アカウントはクライアントレベルでサポートされて いません。それが要点で、 開発とテストのためのものです。 後で同じフィクスチャをクラウドに入れたいなら、 AWS は ローカルで有効らしいキー/リージョン値を使うことを推奨しているので、移行時にエンドポイントを 入れ替えるだけで済みます。出荷前にそのスキーマをモデリングするには、 シングルテーブル設計GSI vs LSIが、ローカルと本番で変わらない決定事項を扱っています。

FAQ

本物の AWS 認証情報が必要ですか? いいえ。DynamoDB Local と LocalStack はどちらも ダミー値を受け入れます。それらは存在し、英数字であり(DynamoDB Local では)、 ツール間で一貫している必要があるだけです。

ツールを切り替えるとテーブルが消えるのはなぜ? -sharedDb がないと、DynamoDB Local はデータをアクセスキー + リージョンごとに別々の myaccesskeyid_region.db ファイルに分割します。-sharedDb を使うか、それらの値をどこでも同一に保ってください。

ポート 8000 と 4566 の違いは? 8000 はスタンドアロン DynamoDB Local のデフォルト、4566 はエミュレートされたすべてのサービス(DynamoDB を含む)を 前面に置く LocalStack の単一エッジポートです。

1つの GUI で両方に接続できますか? はい — どちらも同じ DynamoDB API を話します。 エンドポイント URL が変わるだけです(:8000:4566)。

DynamoDB Local は無料ですか? はい。AWS は DynamoDB Local を JAR と Docker イメージとして無償で配布しています — 「プロビジョンドスループット、データストレージ、データ転送のコストはなし」で、 開発とテストのみを意図しており、 本番用ではありません。

ローカルテーブルに対して SQL を実行できますか? ローカル DynamoDB はクラウドと同じ API を 話すので、同じアクセスパターンのルールが適用されます — そして同じ制限も。DynamoDB の PartiQL SELECT 文法SELECT … FROM … WHERE … ORDER BY だけ — JOINGROUP BY も、 COUNT/SUM/AVG のようなグループ化集計関数も ありません(PartiQL vs SQLを参照)。 DynoTable の SQL Workbench は、ローカルを含むあらゆる接続でそうした分析クエリを実行します。

DynoTable を試してlocalhost:8000localhost:4566 に直接接続し、 ローカルテーブルを GUI で参照、クエリ、編集してみてください。

更新日