DynamoDB Localの公式Docker Imageが公開されました。

記事タイトルとURLをコピーする

先日、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を利用するアプリケーションの開発を加速させていきたいですね。