DynamoDB を Docker で動かす


https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.DownloadingAndRunning.html

DynamoDB の Docker イメージが公式から提供されていたので、このイメージを使用してローカルに DynamoDB をデプロイしてみます。さらに、ローカルに構築した DynamoDB にデータをインサートしてテーブルの中身を確認するところまでやってみたいと思います。

## Docker で DynamoDB を構築

``docker-compose.yaml``を用意して、次の内容をファイルにコピーして保存します。

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

コンテナを立ち上げます。

```terminal
docker-compose up -d
```

DynamoDB Local の構築は以上で終わりです。さすが Docker といった感じでとても簡単です。

## サンプル: データをインサートする

ローカルに DynamoDB が構築できたら、実際にデータを登録してみます。まずは、テーブルを作成します。

```terminal
aws dynamodb create-table \
    --region ap-northeast-1 \
    --endpoint-url http://localhost:8000 \
    --table-name animals \
    --key-schema AttributeName=id,KeyType=HASH \
    --attribute-definitions AttributeName=id,AttributeType=S \
    --billing-mode PAY_PER_REQUEST
```

テーブルが作成できたか、[list-tables](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/list-tables.html) コマンドを使って確認します。

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

テーブルが作成できたら、データをインサートしてみます。今回は、[AWS SDK for JavaScript v3](https://github.com/aws/aws-sdk-js-v3)を使ってデータを登録してみます。

まずは、必要なモジュールをインストールします。

```terminal
npm install @aws-sdk/client-dynamodb uuid
```

``insert-data.js``に SDK を使って DynamoDB に登録する処理を書きます。

```javascript:insert-data.js
const { DynamoDBClient, PutItemCommand } = require("@aws-sdk/client-dynamodb");
const { v4: uuidv4 } = require('uuid');

(async () => {
    const client = new DynamoDBClient({
      region: "ap-northeast-1",
      endpoint: "http://localhost:8000"
    });
    const command = new PutItemCommand({
        TableName: 'animals',
        Item: {
            "id": {"S": uuidv4()},
            "Name": {"S": "pug"},
            "AnimalType": {"S": "Dog"}
        }
    });
    try {
      const results = await client.send(command);
      console.log('result:', results);
    } catch (err) {
      console.error(err);
    }
})();
```

スクリプトを実行します。

```terminal
$ node insert-data.js
result: {
  '$metadata': {
    httpStatusCode: 200,
    requestId: 'c910a473-f2a4-41b2-8aab-5cdb6021d0ef',
    extendedRequestId: undefined,
    cfId: undefined,
    attempts: 1,
    totalRetryDelay: 0
  },
  Attributes: undefined,
  ConsumedCapacity: undefined,
  ItemCollectionMetrics: undefined
}
```

データが登録できたか、[scan](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/scan.html) コマンドを実行して確認します。

```terminal
$ aws dynamodb scan --endpoint-url http://localhost:8000 --table-name animals
{
    "Items": [
        {
            "AnimalType": {
                "S": "Dog"
            },
            "id": {
                "S": "350d582d-b9cf-4c3f-9f5e-ef78b5493be6"
            },
            "Name": {
                "S": "pug"
            }
        }
    ],
    "Count": 1,
    "ScannedCount": 1,
    "ConsumedCapacity": null
}
```

データが登録できているのが確認できました。お金をかけずに DynamoDB を使った開発ができそうですね。