AKIBA.AWS 第10回 特別編で「DynamoDB Localを手軽に使える公式のDockerイメージ」を発表しました #akibaaws

AKIBA.AWS #10 Developers.IO東京 前夜祭!AWS Update LT大会にて「DynamoDB Localを手軽に使える公式のDockerイメージ」の発表をしたので、その内容を共有します。
2018.10.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。プロダクトグループのshoito(しょいと)です。

AKIBA.AWS #10 Developers.IO東京 前夜祭!AWS Update LT大会にて登壇した内容を共有します。

発表スライド

紹介したアップデート

新しいドッカーイメージで Amazon DynamoDB ローカルをさらに容易に 投稿日: Aug 22, 2018

これは何?

  • DynamoDBのダウンロード可能バージョン
  • Dockerイメージとして公式に提供

何に使うの?

  • DynamoDBを使うアプリケーションの開発とテスト
    • ローカル開発環境
    • CI(Contenious Integration)による自動テスト

使うメリットは?

  • 使用料無料
    • プロビジョニングされたスループット
    • データストレージ
    • データ転送料金
    • ...
  • 開発・テスト中にインターネット接続が不要

制約は何?

  • スループット設定は無視される
  • 並列スキャンできない
  • ...他

ダウンロード可能な DynamoDB と DynamoDB ウェブサービスの違い

DynamoDB Local

  • これまでに提供されていたダウンロード可能バージョン
  • Java実行環境で動かすJARファイル(DynamoDBLocal.jar)として提供
  • 昔からローカル開発サポートとして提供済みだったもの

DynamoDB Local Dockerイメージと以前の違いは?

デフォルトが InMemory: true なので、コンテナ停止後はデータが保存されません。

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

どんなコンテナになっているのか、Dockerfileは見当たらないので docker inspect でコンテナ内部を覗いてみます。

$ docker inspect amazon/dynamodb-local:latest
[
    {
        ...
        "Config": {
            ...
            "ExposedPorts": {
                "8000/tcp": {}
            },
            ...
            "Cmd": [
                "-jar",
                "DynamoDBLocal.jar",
                "-inMemory"
            ],
            ...
            "Entrypoint": [
                "java"
            ],
        ...
    }
]

すると実体が以下のコマンドの実行であることが分かります。

java -jar DynamoDBLocal.jar -inMemory

-inMemory オプションがデフォルトで付いているため、データはファイルとして出力されず、プロセスの停止時に消えてしまいます。

Docker Composeに組み込む

$ docker-compose up

docker-compose.yml

version: "3"

services:
  dynamodb:
    image: amazon/dynamodb-local
    ports:
      - "8000:8000"
…

このDockerイメージで気をつけること

デフォルトが InMemory: true なので、コンテナ停止後はデータが保存されません。
そのため、ローカルの開発環境として扱う場合は、オプションから -inMemory を外してあげる必要があります。

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

docker run でDockerコンテナを立ち上げる場合は以下のように、 Cmd-inMemory がない記述で上書きし、さらにデータが残るように -v でボリュームの指定をします。

$ docker run -p 8000:8000 -v $PWD/data:/data amazon/dynamodb-local -jar DynamoDBLocal.jar -dbPath /data

Docker Composeの場合は commandvolumes で上記と同様の指定をします。

docker-compose.yml

version: "3"

services:
  dynamodb:
    image: amazon/dynamodb-local
    ports:
      - "8000:8000"
    command: -jar DynamoDBLocal.jar -dbPath /data 
    volumes:
      - $PWD/data:/data

何はともあれ

公式のDockerイメージの公開により、開発者・チーム毎にDynamoDB Local(JAR)を組み込んだDockerfileの定義し、Dockerイメージをビルド・プッシュする煩わしさから解放されてみんな幸せになりますね。

ちょっと気になったのでDocker Hubdynamodb-localとDockerイメージを検索してみたところ4,410件ヒットしました。
ヒットしたものが全てDynamoDB Localのものではないですが、かなり需要があったことが伺えます。