DynamoDBをローカル環境で使う

docker-composeでローカルにDynamoDBを利用できる環境を作る
あと、dynamodb-adminも利用する

セットアップ

docker-compose.yml

version: '3.8'
services:
  dynamodb-local:
    container_name: dynamodb-local
    image: amazon/dynamodb-local:latest
    user: root
    ports:
      - 8000:8000
    volumes:
      - dynamodb-local-data:/data
    command: -jar DynamoDBLocal.jar -sharedDb -dbPath /data
    networks:
      - dynamodb-local-network
  dynamodb-admin:
    container_name: dynamodb-admin
    image: aaronshaf/dynamodb-admin:latest
    environment:
      - DYNAMO_ENDPOINT=dynamodb-local:8000
    ports:
      - 8001:8001
    depends_on:
      - dynamodb-local
    networks:
      - dynamodb-local-network

volumes:
  dynamodb-local-data:

networks:
  dynamodb-local-network:
    driver: bridge

実行

docker-compose up -d

コンテナを起動してから下記にアクセスすると管理コンソールを操作できる

http://localhost:8000/shell/

また、下記でdynamodb-adminを操作できる

http://localhost:8001/

管理コンソールから下記のスクリプトを流してテーブルを作成する

var params = {
    TableName: 'AuthTokenTable',
    KeySchema: [
        {
            AttributeName: 'authToken',
            KeyType: 'HASH', //Partition key
        }
    ],
    AttributeDefinitions: [
        {
            AttributeName: 'authToken',
            AttributeType: 'S'
        },
        {
            AttributeName: 'userId',
            AttributeType: 'N'
        }
    ],
    ProvisionedThroughput: {       // Only specified if using provisioned mode
        ReadCapacityUnits: 1,
        WriteCapacityUnits: 1
    },
    // https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/SQLtoNoSQL.Indexes.Creating.html#SQLtoNoSQL.Indexes.Creating.DynamoDB
    GlobalSecondaryIndexes: [
        {
            IndexName: 'UserIdIndex',
            KeySchema: [
                {
                    AttributeName: 'userId',
                    KeyType: 'HASH',
                }
            ],
            Projection: {
                    ProjectionType: 'INCLUDE',
                    NonKeyAttributes: [
                        'authToken',
                    ],
            },
            ProvisionedThroughput: {
                ReadCapacityUnits: 1,
                WriteCapacityUnits: 1
            }
        }
    ],
};
dynamodb.createTable(params, function(err, data) {
    if (err) ppJson(err); // an error occurred
    else ppJson(data); // successful response
});