先日、DynamoDBを利用したアプリケーションの開発やテストに便利なDynamoDB Localの公式イメージが公開されたとのアナウンスがありました。
これまでは開発環境にJavaをインストールし、jarファイルをダウンロードしてからDynamoDBLocalを実行する必要があり利用するのに少し手間がかかりました。
今回、公式のDockerImageが公開されたことでよりdockerが利用できる環境であればのより手軽にDynamoDB Localを利用できるようになりました。
実際に使ってみる
今回はDocker for Macで実行しています。
DockerHubのページでは以下の実行コマンドが記載されています。
docker run -p 8000:8000 amazon/dynamodb-local
このコマンドを実行することで公式のdockerhubからイメージがダウンロードされコンテナが実行されます。
ただし、このコマンドだとフォアグラウンドで動くのでターミナルを閉じるとコンテナも終了してしまいます。
そこで、-d
オプションを追加した以下のコマンドで実行するとバックグラウンドで実行されます。
これでターミナルを閉じても利用できますね。
docker run -d -p 8000:8000 amazon/dynamodb-local
AWS CLIでためしてみる
AWS CLIで利用する場合はエンドポイントURLのオプションを利用してエンドポイントを指定することで利用可能です。
例えばテーブルを作成する場合は以下のようなコマンドを実行するとLaunchListと言うテーブルがDynamoDBLocal内に作成されます。
aws --endpoint-url http://localhost:8000 dynamodb create-table --table-name LaunchList --attribute-definitions AttributeName=Name,AttributeType=S --key-schema AttributeName=name,KeyType=HASH --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
テーブルのリストを確認する場合には以下のような形になります。
aws --endpoint-url http://localhost:8000 dynamodb list-tables
SDKで実行するには
AWS CLIでは無く各言語のSDKを利用してDynamDBLocalを扱う場合でもAWS CLI同様エンドポイントURLを指定するだけで利用できます。
例えばpythonのSDKであるboto3で利用するには以下のようなコードになります。
boto3.client("dynamodb",endpoint_url="http://localhost:8000")
もしくは
boto3.resource("dynamodb",endpoint_url="http://localhost:8000")
Rubyでも同様に以下のように指定することで利用できます。
Aws::DynamoDB::Client.new(endpoint: 'http://localhost:8000')
Aws::DynamoDB::Resource.new(endpoint: 'http://localhost:8000')
SDKを利用している場合だとあとのテーブルの作成やデータのGET、PUTなどのコードは変更無く利用することができます。
実際にどんなコマンドが実行されてるの?
docker コンテナ内ではどんなコマンドでDynamoDBLocalが実行されているのでしょうか。
確認するためにdocker ps に --no-trunc
オプションをつけて省略させずに各項目を表示させます。
手元では以下のような表示になりました
docker ps --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
978e3f0d4c19820b55be806b58dc5b28ac90bb0a1696320243b92420d288d9e1 amazon/dynamodb-local "java -jar DynamoDBLocal.jar -inMemory" 22 hours ago Up 22 hours 0.0.0.0:8000->8000/tcp vigorous_shockley
これにより java -jar DynamoDBLocal.jar -inMemory
が実行されていることがわかります。
-inMemory
オプションで実行されているのでテーブルデータなどはDiskには書き込まれずメモリ上のみに存在する形になります。
そのためコンテナを停止するとDynamoDBLocalに格納されたデータは消えてしまいます。 DynamDBLocalはあくまで開発用のツールであるためこのようなコマンドになってると思われます。
まとめ
公式にDocker Image化されたことで利用開始の手間が大幅に少なくなりDynamoDB Localより使いやすくなりました。 これをうまく利用し、コードの動作確認を手元で行えることでDynamoDBを利用するアプリケーションの開発を加速させていきたいですね。