DockerでDynamoDBのローカル開発環境を作る
概要
AWS サーバレスでのアプリケーション開発をスムーズに行うために、Docker での DynamoDB ローカル開発環境を作ります。
実際には DynamoDB 単体で使うのでは無く、他の Docker アプリケーション開発環境、あるいは、ホスト上のアプリケーション開発環境と組み合わせて使うことになると思いますので、適宜組み合わせていただければと思います。
構成
最終的に作成する構成は以下の通りとします。
.
├ src :関数コードを格納する
├ bin :AWS CLI用のコンテナとのファイル受け渡し用
├ Dockerfile-awscli :AWS CLI用のコンテナ定義のDockerfile
└ docker-compose.yml :各コンテナの起動設定
以下のファイルを作成していきます。
FROM amazon/aws-cli
ENV AWS_ACCESS_KEY_ID=fake_access_key\
AWS_SECRET_ACCESS_KEY=fake_secret_access_key\
DYNAMODB_REGION=ap-northeast-1
WORKDIR /usr/app
※AWS 公式の AWS CLI イメージを取得して、AWS CLI のアクセスキーなどにダミー値を設定しています。(コンテナ内の DynamoDB に接続するため何でもよい)
※コンテナ内の/usr/app ディレクトリで AWS CLI を実行します。このフォルダは、ローカルの bin/フォルダと共有してファイルを受け渡しできるようにしています。
version: '3'
services:
dynamodb:
image: amazon/dynamodb-local
command: -jar DynamoDBLocal.jar -sharedDb -dbPath . -optimizeDbBeforeStartup
volumes:
- dynamodb:/home/dynamodblocal
ports:
- 8000:8000
awscli:
build:
context: .
dockerfile: Dockerfile-awscli
entrypoint: [""]
tty: true
command:
- /bin/sh
volumes:
- ./bin:/usr/app
volumes:
dynamodb:
driver: local
bin:
driver: local
※DynamoDB のデータは、毎回消えないように volumes 指定で永続化しています。(Docker の管理領域に保管されます)
※DynamoDB の command では、DynamoDB がデフォルトだとメモリ内にデータを保管しており、コンテナを停止するとデータが消えてしまうため、保持するように設定をしています。
※ローカルの bin フォルダを AWS CLI の作業ディレクトリにマウントしています。
コンテナを起動する
docker-compose up -d
AWS CLI 用コンテナ名を確認する
docker ps -a
AWS CLI 用コンテナに入る
docker exec -it [AWS CLI用コンテナ名] /bin/bash
AWS CLI コマンドを実行する
aws dynamodb list-tables --region ap-northeast-1 --endpoint-url http://dynamodb:8000
※AWS CLI 仕様上、--region
と、--endpoint-url
の指定は毎回必要になります。
実行結果
次のような結果が返ってくれば OK です。
{
"TableNames": []
}
テーブル作成
aws dynamodb \
--region ap-northeast-1 \
--endpoint-url http://dynamodb:8000 \
create-table \
--table-name User \
--attribute-definitions \
AttributeName=UserId,AttributeType=S \
AttributeName=SortKey,AttributeType=S \
--key-schema \
AttributeName=UserId,KeyType=HASH AttributeName=SortKey,KeyType=RANGE \
--billing-mode PAY_PER_REQUEST
※結果が表示されたら下までスクロールしてq
で抜けます。
あとは必要に応じて、コマンドを記載したファイルをbin
フォルダに格納しておき、aws dynamodb コマンドを実行しつつ作業を進めていきます。
Discussion