DynamoDB local について
公式ドキュメント に記載されているように .jar
ファイル形式で提供されていて、ダウンロードして手軽に使えます。
導入手順
以下のようにお手軽に利用可能
$ wget https://s3-ap-northeast-1.amazonaws.com/dynamodb-local-tokyo/dynamodb_local_latest.zip
$ unzip dynamodb_local_latest
$ java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb
$ aws configure #=> 認証情報が空の場合は fake でもよいので設定しておく必要がある
$ aws dynamodb list-tables --endpoint-url http://localhost:8000
{
"TableNames": []
}
Docker イメージの利用
便利な Docker イメージも提供されているので、こちらを使うともっとお手軽
$ docker pull amazon/dynamodb-local
$ docker run -p 8000:8000 amazon/dynamodb-local
...
$ aws dynamodb list-tables --endpoint-url http://localhost:8000
{
"TableNames": []
}
ブラウザで DynamoDB local を操作できる
http://localhost:8000/shell/ にアクセスするといい感じの UI で操作できます。とても便利ですね。
サーバーレスアプリケーションとの組み合わせ
実際にはサーバーレスアプリケーションとの組み合わせでテスト実行や CI 時にローカルの DyanamoDB を利用することがおおいと思います。
コンテナの起動は以下のような具合でやります
$ docker run --name dynamodb -p 8000:8000 amazon/dynamodb-local
...
^C
$ docker start dynamodb
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f725804937d7 amazon/dynamodb-local "java -jar DynamoDBL…" 48 seconds ago Up 38 seconds 0.0.0.0:8000->8000/tcp dynamodb
そんでもって Lambda 関数がローカルで実行されているときのみ localhost:8000 へリクエストを送るようにクライアントコードを調整します
dynamodb = boto3.resource('dynamodb', region_name=aws_region, endpoint_url="http://dynamodb:8000")
最後に DynamoDB local と同じネットワークで sam local invoke すれば良い
$ sam local invoke FUNC_NAME --no-event \
--env-vars vars.json \
--docker-network `docker network ls | grep NETWORK_NAME | awk '{print $1}'`
localstack の利用
DynamoDB 以外もさまざまな AWS コンポーネントをローカルでエミュレートするような localstack というものがあり、とてもベンリ
導入方法
- docker イメージを利用するのがよさそう
docker-compose.yaml
を以下のように記述し、docker-compose up -d
- 現状 Kinesis, DynamoDB, Elasticsearch, S3 だけは DATA_DIR に操作内容が保存される
---
version: '3.2'
services:
localstack:
image: localstack/localstack:latest
container_name: monita-sls-sandbox
ports:
- '4563-4584:4563-4584'
environment:
- SERVICES=s3,sns
- DATA_DIR=/tmp/localstack/data
volumes:
- './.localstack:/tmp/localstack'
- '/var/run/docker.sock:/var/run/docker.sock'
awscli-local の導入
aws --endpoint-url=http://localhost:XXXX
と毎回入力するのは面倒なので、そのあたりをラップしてくれる localstack/awscli-local コマンドがベンリ- 導入方法は以下のようにワンコマンド
$ pip install awscli-local
すると以下のように煩わしさがだいぶ緩和する
$ awslocal s3api create-bucket --bucket sam-lambda-layers
$ awslocal s3 ls
2006-02-04 01:45:09 sam-lambda-layers
あとはだいたい DynamoDB local とおなじように環境変数の準備して、localstack と同じネットワークで sam local invoke
すれば OK