DynamoDB の Docker イメージが公式から提供されていたので、このイメージを使用してローカルに DynamoDB をデプロイしてみます。さらに、ローカルに構築した DynamoDB にデータをインサートしてテーブルの中身を確認するところまでやってみたいと思います。
Docker で DynamoDB を構築
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
コンテナを立ち上げます。
docker-compose up -d
DynamoDB Local の構築は以上で終わりです。さすが Docker といった感じでとても簡単です。
サンプル: データをインサートする
ローカルに DynamoDB が構築できたら、実際にデータを登録してみます。まずは、テーブルを作成します。
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 コマンドを使って確認します。
$ aws dynamodb list-tables --endpoint-url http://localhost:8000
{
"TableNames": [
"animals"
]
}
テーブルが作成できたら、データをインサートしてみます。今回は、AWS SDK for JavaScript v3を使ってデータを登録してみます。
まずは、必要なモジュールをインストールします。
npm install @aws-sdk/client-dynamodb uuid
insert-data.js
に SDK を使って DynamoDB に登録する処理を書きます。
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);
}
})();
スクリプトを実行します。
$ 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 コマンドを実行して確認します。
$ 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 を使った開発ができそうですね。