2
2

dynamodb-localをシードデータで初期化して起動する

Last updated at Posted at 2024-02-27

概要

amazon/dynamodb-localのDockerをシードデータで初期化して起動したかったので作りました。
事前に用意したデータを取り込んでDynamoDBをDocker上で起動できます。

下記のレポジトリをクローンしてREADMEの手順で実行すれば使えます。

使い方

READMEに書いてありますが解説も交えて手順書いときます。

1. リポジトリのクローン

git clone https://github.com/sasakitimaru/dynamo-local-init.git

2. DynamoDBにマウントするボリュームのディレクトリ作成

mkdir -p dynamodb-local
sudo chmod 777 ./dynamodb-local

書き込み権限を振っておかないとエラーになります。(参考)

3. シードデータの準備

テーブルの作成

./schema/tables.ymlがテーブルを定義しているファイルです。
設定したいテーブル定義に書き換えてください。
データはaws-cli ver2のcreate-table —cli-input-yamlで取り込まれます。
デフォルトのデータは下記です。ドキュメントを参考に書き換えてください。

Tables:
  - TableName: Product
    AttributeDefinitions:
      - AttributeName: id
        AttributeType: S
      - AttributeName: name
        AttributeType: S
      - AttributeName: category
        AttributeType: S
      - AttributeName: price
        AttributeType: N 
    KeySchema:
      - AttributeName: id
        KeyType: HASH
    BillingMode: PAY_PER_REQUEST
    GlobalSecondaryIndexes:
      - IndexName: NameIndex
        KeySchema:
          - AttributeName: name
            KeyType: HASH
        Projection:
          ProjectionType: ALL
      - IndexName: CategoryIndex
        KeySchema:
          - AttributeName: category
            KeyType: HASH
        Projection:
          ProjectionType: ALL
      - IndexName: PriceIndex
        KeySchema:
          - AttributeName: category
            KeyType: HASH
          - AttributeName: price
            KeyType: RANGE
        Projection:
          ProjectionType: INCLUDE
          NonKeyAttributes: [ "name", "price" ] 

シードデータの定義

./schema/seeds.ymlでテーブルと流し込むシードデータのファイルと紐づけます。

- table: Product
  sources: [Product.json]

jsonファイルの名前は任意です。テーブル名と同じである必要はありません。

Product.jsonは下記のようになっています。

[
  {
    "id": "product1",
    "name": "Laptop Pro 15",
    "category": "Electronics",
    "price": 1000
  },
  {
    "id": "product2",
    "name": "Smartphone X2",
    "category": "Electronics",
    "price": 700
  },
...
  }
]

--cli-input-ymlで取り込める形式に内部でコンパイルされます。

リストやマップも対応しています。

参考:コンパイル前

[
  {
    "id": "xxx",
    "name": "example",
    "data": {
      "price": 100,
      "category": "free",
    },
    "tag": ["new", "sample", "season"]
  }
]

参考:コンパイル後

{
  "PutRequest": {
    "Item": {
      "id": {"S": "xxx"},
      "name": {"S": "example"},
      "data": {
        "M": {
          "price": {"N": "100"},
          "category": {"S": "free"}
        }
      },
      "tag": {
        "L": [{"S": "new"}, {"S": "sample"}, {"S": "season"}]
      }
    }
  }
}

4. 起動

docker-compose up

下記のdocker-compose.ymlを起動します。
dynamoadb-adminはlocalhost:8001にアクセスすれば使用できます。

version: '3.8'
services:
  dynamodb-local:
    command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data"
    image: "amazon/dynamodb-local:1.17.0"
    container_name: dynamodb-local
    ports:
      - "8000:8000"
    working_dir: /home/dynamodblocal
    volumes:
      - "./dynamodb-local:/home/dynamodblocal/data"

  # 管理ページが不要な場合は削除してください
  dynamodb-admin:
    image: aaronshaf/dynamodb-admin:4.6.1
    container_name: dynamodb-admin
    environment:
      - DYNAMO_ENDPOINT=http://dynamodb-local:8000
    ports:
      - 8001:8001
    depends_on:
      - dynamodb-local

  dynamodb-migrator:
    image: "sasakitimaru/dynamodb-local:1.0.6"
    environment:
      - AWS_ACCESS_KEY_ID=dummy
      - AWS_SECRET_ACCESS_KEY=dummy
      - AWS_DEFAULT_REGION=ap-northeast-1
      - DYNAMODB_ENDPOINT=http://dynamodb-local:8000
    depends_on:
      - dynamodb-local
    volumes:
      - ./schema/:/home/dynamodblocal/schema/

dynamo-adminのコンテナを毎回起動するのが面倒な人は下記でglobalにインストールして必要な時だけ起動するのがおすすめです。

npm install -g dynamodb-admin

# For Windows:
set DYNAMO_ENDPOINT=http://localhost:8000
dynamodb-admin

# For Mac/Linux:
DYNAMO_ENDPOINT=http://localhost:8000 dynamodb-admin

5. 停止

docker-compose down

停止してもdynamodbのデータは残ります。

./dynamodb-local/shared-local-instance.dbを削除すればデータも消えます。

データを消さずに再度docker-compose upを実行するとシードデータの取り込みはスキップされます。(すでにテーブルが存在する場合はスキップする)

シードデータを変更したりテーブルのスキーマを変えた場合は./dynamodb-local/shared-local-instance.dbを削除してから起動してください。

作成したイメージ

下記のリポジトリにソースコードがあります。

不具合や要望とかあればコメントください。対応します。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2