DynamoDB Local(Amazon公式)のDockerイメージを使う

先日の8月22日に、Amazonから公式にDynamoDBのDockerイメージが公開された。

ググっても野良のイメージしか出てこないのでまだあまり認知されてないっぽい。

ちょうどDynamoDB Localを利用していたところだったので、早速試してみた。

とりあえず立ち上げる

$ docker run --rm amazon/dymamodb-local
Initializing DynamoDB Local with the following configuration:
Port:   8000
InMemory:   true
DbPath: null
SharedDb:   false
shouldDelayTransientStatuses:   false
CorsParams: *

jarで配布されていたものと同じっぽい。

オプションを使用したい

とりあえず開発時のテストとはいえ、データを永続化したい。

jar版では起動時の引数で設定することができたので、Dockerイメージにおいても引数を渡せれば設定できるはず。 Dockerfileは見当たらないので、とりあえずinspectしてみる。

$ docker inspect amazon/dynamodb-local:latest
(snip)
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "dynamodblocal",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "8000/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "-jar",
                "DynamoDBLocal.jar",
                "-inMemory"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:6901b80d033a1d94e1283711be031f2657d90edf0768118bb22c952feba780bd",
            "Volumes": null,
            "WorkingDir": "/home/dynamodblocal",
            "Entrypoint": [
                "java"
            ],
            "OnBuild": null,
            "Labels": {
                "aws.java.sdk.version": "1.11.119"
            }
        },
(snip)
  • Entrypoint: java
  • Cmd: -jar DynamoDBLocal.jar -inMemory

となっているので、docker runの際に javaのオプションとなる部分をすべて指定することで設定を変えられそう。

データを永続化する

dbPathでパスを指定することができるので、Volumeを指定してそこにデータを置くようにする。 ひとまずフォアグラウンドで起動する。

$ docker run --rm -p 8000:8000 -v ~/dynamodb-data:/home/dynamodblocal/data \
amazon/dynamodb-local -jar DynamoDBLocal.jar -dbPath /home/dynamodblocal/data
Initializing DynamoDB Local with the following configuration:
Port:   8000
InMemory:   false
DbPath: /home/dynamodblocal/data
SharedDb:   false
shouldDelayTransientStatuses:   false
CorsParams: *

別のターミナルからawsコマンドを使用し、テーブルを作成してみる。

$ aws dynamodb create-table --table-name Clients \
    --attribute-definitions AttributeName=id,AttributeType=S \
    --key-schema AttributeName=id,KeyType=HASH \
    --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
    --endpoint-url http://localhost:8000
{
    "TableDescription": {
        "TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/Clients",
(snip)
    }
}

一覧で取得できるか確認。

$ aws dynamodb list-tables --endpoint-url http://localhost:8000
{
    "TableNames": [
        "Clients"
    ]
}

ホスト側のデータ保存先に指定した場所を確認してみる。

$ ls ~/dynamodb-data
AKIAIOSFODNN7EXAMPLE_ap-northeast-1.db

この中にデータが入ってそう。

まとめ

DockerイメージでのDynamoDB Localの動作確認ができた。

Javaの環境を用意しなくても動作ができるので、気楽に利用できるようになった。ありがたい。