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使うなら入門にいいかも?