公式ドキュメント に記載されているように .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 pull amazon/dynamodb-local $ docker run -p 8000:8000 amazon/dynamodb-local ... $ aws dynamodb list-tables --endpoint-url http://localhost:8000 { "TableNames": [] }
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}'`
DynamoDB 以外もさまざまな AWS コンポーネントをローカルでエミュレートするような localstack というものがあり、とてもベンリ
docker-compose.yaml
を以下のように記述し、docker-compose up -d
--- 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'
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