概要

DynamoDB を使うアプリケーション開発で、テストを簡単にするためにDynamoDBをローカルに立てる。

AWS公式が紹介しているDynamoDB Localを使うことにする。

Setting up DynamoDB local (downloadable version) - Amazon DynamoDB favicon docs.aws.amazon.com
Setting up DynamoDB local (downloadable version) - Amazon DynamoDB
Learn how to set up and use DynamoDB local, a downloadable version of DynamoDB local that enables local, cost-effective development and testing.

Dockerで実行する

こちらのイメージを使用する https://hub.docker.com/r/amazon/dynamodb-local

docker run -p 8000:8000 amazon/dynamodb-local:latest -jar DynamoDBLocal.jar -sharedDb

これで起動する。 aws cliでendpoint-urlを指定して操作できる。

aws dynamodb --endpoint-url http://localhost:8000 list-tables

データを入れる

aws cliコンテナをDynamoDB Localと同じネットワークで起動して、テーブル作成やデータ投入のコマンドを実行する

$ docker run --rm --network=dynamodb-local -it public.ecr.aws/aws-cli/aws-cli:latest bash
{
    "Title": {"S": "Call Me Today"},
    "Year": {"S": "2022"}
}
# region, endpoint urlは環境変数AWS_REGION, AWS_ENDPOINT_URLでも設定できる
$ aws dynamodb --region ap-northeast-1 --endpoint-url http://dynamodb-local:8000 create-table --table-name MusicCollection --attribute-definitions AttributeName=Title,AttributeType=S --key-schema AttributeName=Title,KeyType=HASH 
$ aws dynamodb --region ap-northeast-1 --endpoint-url http://dynamodb-local:8000 put-item --table-name MusicCollection --item file://items.json

Docker Compose で起動とデータ投入を行う

上記のDynamoDB Localのコンテナを起動して、初回起動時にデータを投入するコンテナをDocker composeで定義する。 これで docker compose up 一発で起動できる。

version: "3.8"
services:
  dynamodb-local:
    command: -jar DynamoDBLocal.jar -sharedDb
    image: amazon/dynamodb-local:latest
    container_name: dynamodb-local
    ports:
      - "8000:8000"
    networks:
      - dynamodb-local
  setup:
    depends_on:
      - dynamodb-local
    build:
      context: .
      dockerfile: setup.Dockerfile
    environment:
      - AWS_ENDPOINT_URL=http://dynamodb-local:8000
    command: ['./setup.sh']
    networks:
      - dynamodb-local
 
networks:
  dynamodb-local:
    name: dynamodb-local
FROM public.ecr.aws/aws-cli/aws-cli:latest
 
ENV AWS_REGION=ap-northeast-1
ENV AWS_ACCESS_KEY_ID=dummy
ENV AWS_SECRET_ACCESS_KEY=dummy
 
COPY setup.sh data.csv ./
 
ENTRYPOINT []
#!/bin/bash
 
DIR=$(cd $(dirname $0); pwd)
 
aws dynamodb create-table --table-name MusicCollection --attribute-definitions AttributeName=Title,AttributeType=S --key-schema AttributeName=Title,KeyType=HASH 
aws dynamodb put-item --table-name MusicCollection --item file://items.json