Open4

ローカルのDocker上でDynamoDBを動かしてみる

ふじしろふじしろ

とにかく動かす(最低限動く状態へ)

準備

  1. docker-compose.ymlの記載
version: '3'
services:
  dynamodb:
    image: amazon/dynamodb-local
    ports:
      - "8000:8000"
  1. シェルスクリプトでテーブル定義
#!/bin/bash

aws dynamodb create-table --endpoint-url http://localhost:8000 \
  --table-name YourTableName \
  --attribute-definitions AttributeName=YourPrimaryKey,AttributeType=S \
  --key-schema AttributeName=YourPrimaryKey,KeyType=HASH \
  --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
  1. シェルスクリプトを実行可能にしておく
% chmod +x init-dynamodb.sh

起動

  1. docker起動
% docker-compose up dynamodb

[+] Running 5/5
 ✔ dynamodb 4 layers [⣿⣿⣿⣿]      0B/0B      Pulled                                                                                                                      35.5s
   ✔ 0dfb0edac9a7 Pull complete                                                                                                                                         12.2s
   ✔ 5ffbcc73bc8b Pull complete                                                                                                                                         16.7s
   ✔ 4f4fb700ef54 Pull complete                                                                                                                                          4.7s
   ✔ 96b4d4d353f8 Pull complete                                                                                                                                         18.8s
[+] Running 1/1
 ✔ Container prince-hotel-server-dynamodb-1  Created                                                                                                                     0.2s
Attaching to prince-hotel-server-dynamodb-1
prince-hotel-server-dynamodb-1  | Initializing DynamoDB Local with the following configuration:
prince-hotel-server-dynamodb-1  | Port:	8000
prince-hotel-server-dynamodb-1  | InMemory:	true
prince-hotel-server-dynamodb-1  | DbPath:	null
prince-hotel-server-dynamodb-1  | SharedDb:	false
prince-hotel-server-dynamodb-1  | shouldDelayTransientStatuses:	false
prince-hotel-server-dynamodb-1  | CorsParams:	null
prince-hotel-server-dynamodb-1  |

  1. シェルスクリプト実行
% ./dynamodb-init.sh
{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "YourPrimaryKey",
                "AttributeType": "S"
            }
        ],
        "TableName": "YourTableName",
        "KeySchema": [
            {
                "AttributeName": "YourPrimaryKey",
                "KeyType": "HASH"
            }
        ],
        "TableStatus": "ACTIVE",
        "CreationDateTime": "2023-09-27T14:01:10.844000+09:00",
        "ProvisionedThroughput": {
            "LastIncreaseDateTime": "1970-01-01T09:00:00+09:00",
            "LastDecreaseDateTime": "1970-01-01T09:00:00+09:00",
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 5,
            "WriteCapacityUnits": 5
:...skipping...
{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "YourPrimaryKey",
                "AttributeType": "S"
            }
        ],
        "TableName": "YourTableName",
        "KeySchema": [
            {
                "AttributeName": "YourPrimaryKey",
                "KeyType": "HASH"
            }
        ],
        "TableStatus": "ACTIVE",
        "CreationDateTime": "2023-09-27T14:01:10.844000+09:00",
        "ProvisionedThroughput": {
            "LastIncreaseDateTime": "1970-01-01T09:00:00+09:00",
            "LastDecreaseDateTime": "1970-01-01T09:00:00+09:00",
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 5,
            "WriteCapacityUnits": 5
        },
:...skipping...
{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "YourPrimaryKey",
                "AttributeType": "S"
            }
        ],
        "TableName": "YourTableName",
        "KeySchema": [
            {
                "AttributeName": "YourPrimaryKey",
                "KeyType": "HASH"
            }
        ],
        "TableStatus": "ACTIVE",
        "CreationDateTime": "2023-09-27T14:01:10.844000+09:00",
        "ProvisionedThroughput": {
            "LastIncreaseDateTime": "1970-01-01T09:00:00+09:00",
            "LastDecreaseDateTime": "1970-01-01T09:00:00+09:00",
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 5,
            "WriteCapacityUnits": 5
        },
        "TableSizeBytes": 0,
:...skipping...
{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "YourPrimaryKey",
                "AttributeType": "S"
            }
        ],
        "TableName": "YourTableName",
        "KeySchema": [
            {
                "AttributeName": "YourPrimaryKey",
                "KeyType": "HASH"
            }
        ],
        "TableStatus": "ACTIVE",
        "CreationDateTime": "2023-09-27T14:01:10.844000+09:00",
        "ProvisionedThroughput": {
            "LastIncreaseDateTime": "1970-01-01T09:00:00+09:00",
            "LastDecreaseDateTime": "1970-01-01T09:00:00+09:00",
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 5,
            "WriteCapacityUnits": 5
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
:...skipping...
{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "YourPrimaryKey",
                "AttributeType": "S"
            }
        ],
        "TableName": "YourTableName",
        "KeySchema": [
            {
                "AttributeName": "YourPrimaryKey",
                "KeyType": "HASH"
            }
        ],
        "TableStatus": "ACTIVE",
        "CreationDateTime": "2023-09-27T14:01:10.844000+09:00",
        "ProvisionedThroughput": {
            "LastIncreaseDateTime": "1970-01-01T09:00:00+09:00",
            "LastDecreaseDateTime": "1970-01-01T09:00:00+09:00",
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 5,
            "WriteCapacityUnits": 5
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/YourTableName"
    }
}
~
~
~
~
~
  1. 動作確認
    ちゃんと動いているのか不安だったので確認
% aws dynamodb list-tables --endpoint-url http://localhost:8000
{
    "TableNames": [
        "YourTableName"
    ]
}

動作確認のためのコマンド

  • テーブルの作成
% aws dynamodb create-table --endpoint-url http://localhost:8000 --table-name MyTable --attribute-definitions AttributeName=id,AttributeType=N --key-schema AttributeName=id,KeyType=HASH --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
  • テーブルの一覧表示
% aws dynamodb list-tables --endpoint-url http://localhost:8000
  • データの挿入 (PutItem)
% aws dynamodb put-item --table-name MyTable --item '{"id": {"N": "1"}, "name": {"S": "John Doe"}}' --endpoint-url http://localhost:8000
  • データの取得 (GetItem)
% aws dynamodb get-item --table-name MyTable --key '{"id": {"N": "1"}}' --endpoint-url http://localhost:8000
  • データの検索 (Scan)
% aws dynamodb scan --table-name MyTable --endpoint-url http://localhost:8000
ふじしろふじしろ

↑で記載を省いていること

  • aws権限周りの設定

プロジェクト内への導入なので、完全に一からではない。
完全に一からの導入については、GPTの説明がわかりやすかった


  1. Dockerイメージの取得
    まず、Amazon公式提供のDynamoDBのDockerイメージをローカルに取得します。ターミナルを開き、以下のコマンドを実行してください。
    docker pull amazon/dynamodb-local
  2. Dockerコンテナの実行
    次に、Dockerコンテナを実行します。以下のコマンドでは、8000番ポートでDockerコンテナを起動します。
    docker run -p 8000:8000 amazon/dynamodb-local
    これで、Docker上でローカルDynamoDBが起動しました。
  3. AWS CLIのインストール
    DynamoDBをコマンドラインで操作するには、AWS CLI (Command Line Interface) をインストールする必要があります。以下のコマンドでインストールできます。
    Macの場合:
    brew install awscli
    Windowsの場合:
    pip install --user awscli
  4. AWS CLIの設定
    AWS CLIを使用するために、環境を設定する必要があります。以下のコマンドを実行してください。
    aws configure
    これにより、アクセスキー、シークレットキー、リージョン、出力形式を入力するように求められます。ローカルのDynamoDBで操作するため、適当な値を入力してください。
    例:
    AWS Access Key ID [None]: dummy
    AWS Secret Access Key [None]: dummy
    Default region name [None]: us-west-2
    Default output format [None]: json
    これでAWS CLIの設定が完了です。