Pocket

状況

ホスト側のターミナルから見た、DynamoDb LocalのURLは、http://localhost:5003です。

ホスト側のターミナルで、aws dynamodbコマンドを使って、create-table、put-item、get-itemしました。問題ありません。

別のDockerコンテナでwebサーバを走らせています。そのwebサーバから見た、DynamoDb LocalのURLは、http://dynamodb.container:8000です。

そのWebサーバから、DynamoDB LocalへgetItemしたところ、テーブルがないよ、とエラーになってしまいました。

解決方法

ホスト側のターミナルで作業するときのAWS_ACCESS_KEY_IDとリージョン、Dockerコンテナのwebサーバに渡すAWS_ACCESS_KEY_IDとリージョンを同じにします。

ホスト側のターミナル

Dynamo DB LocalのAWS_ACCESS_KEY_IDとリージョンは任意です。仮に、次のようにします。

AWS_ACCESS_KEY_ID=hoge
リージョン=local

任意なので、リージョン=ap-northeast-1 にしても問題ありません。

ホスト側のターミナルでaws dynamodbコマンドを打つ前に、AWS_ACCESS_KEY_IDを設定します。

Dynamo DB Localへaws dynamodbコマンドを打つとき、--region オプションでリージョンを指定します。

Dockerコンテナのwebサーバ側

Dockerコンテナに渡すための環境変数の設定ファイルを作ります。ファイル名は、web.envとします。

docker-compose.ymlでenv_fileを記述します。

PHPの場合、Aws\Sdkコンストラクタで、'region'を'local'にします。

DynamoDB Localのデータファイル

docker-compose.ymlで、Dockerコンテナを停止してもデータが消えないように、dbPathを設定し、Dockerコンテナの/home/dynamodblocal/dataをホスト側のディレクトリに外部マウントしました。

すると、ローカルの ./dynamo/data/ 下に、DynamoDB Localのデータファイルが見えるようになります。

いろいろ試したので、いくつかのファイルができています。

つまり、[AWSアカウントID]_[リージョン].db で、分かれて保存されるんですね。

ターミナルから、AWS_ACCESS_KEY_ID=AK****、リージョン=ap-northeast-1で、テーブル作成すると、AK****_ap-northeast-1.db が作られます。

Dockerコンテナのwebサーバから、AWS_ACCESS_KEY_ID=hoge、リージョン=localで、getItemすると、hoge_local.db を読もうとします。

そのため、テーブルがないよ、とエラーになったんですね。