@gomi_ningen's Website

DynamoDB local と localstack の導入

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

Copyright © 53ningen.com