LoginSignup
11
6

More than 5 years have passed since last update.

DynamoDB Localに登録したテーブルがほかのプログラムから見えないときに読むやつ

Last updated at Posted at 2019-01-17

DynamoDB LocalをDockerで起動して、AWS CLIでテーブルを作って、いざプログラムからデータを入れようとしたらテーブルが無いといって怒られる、ということに遭遇したのでその解決策をば。

原因

DynamoDB LocalのテーブルはアクセスキーID/リージョンごとに管理されているから。
ローカルで動いてるからアカウントもリージョンも関係ないだろと思ってたけど、ちゃんと区別してるんですね。
具体的には、[アクセスキーID]_[リージョン].dbという名前のデータベースファイルで管理されているそうです。

ちなみに、指定するアクセスキーIDとリージョンは適当な文字列で大丈夫です。

解決策

アクセスキーIDとリージョンを揃える

素直な解決策ですが、AWS CLIでテーブルを作るときに使うアクセスキーIDとリージョンを、プログラムで使用しているものと合わせる方法です。

$ AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXABCD AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXABCD  AWS_DEFAULT_REGION=ap-northeast-1 aws --endpoint-url http://127.0.0.1:8000 dynamodb create-table --table-name example-table ...(略)

-sharedDbオプションを指定する

デフォルトだとアクセスキーIDとリージョンごとにデータベースファイルを作りますが、-sharedDb オプションを使用すると、DynamoDB は shared-local-instance.db という名前の単一のデータベースファイルでデータを管理します。
つまり、アクセスキーIDやリージョン関係なく、必ず同じデータベースファイルを参照します。

具体的には、以下のコマンドでdockerコンテナを実行すればOKです。

$ docker run -d -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -dbPath . -sharedDb

-jar DynamoDBLocal.jar -dbPath .はデフォルトのコマンドです。
それに-sharedDbをくっつけています。

いろいろ設定する必要がなくなって便利ですが、複数アプリケーションからDynamoDB Localを利用する場合はデータベースの情報が混ざるので注意が必要です。
一つのアプリケーションからしか使わない場合はとても便利ですね。

おまけ

http://localhost:8000/shell/にアクセスすると、DynamoDB Web Shellが使えます。
JavaScript SDKのDynamoDB関連のプログラムを試せます。各操作のテンプレートも用意されているので、JS使うなら入門にいいかも?
スクリーンショット 2019-01-13 10.32.41.png

参考

11
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6