🌸

【1日目】ローカルにDynamoDBをデプロイする

2023/04/03に公開

今年度から平日の業後はなるべく手を動かしてアウトプットをしていきたいと思います。

初日はDynamoDBをローカルにデプロイしてみて、テーブルの作成・値の挿入・取得をやってみます。

まずは、dockerでDynamoDBのコンテナを立ち上げます。
AWSの公式サイトにあるファイルをそのまま使用します。

docker-compose.yml
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

chatGPTに手伝ってもらい、テーブル作成・挿入・取得・削除のMakefileを作ります。

Makefile
TABLE_NAME=messages
ENDPOINT_URL=http://localhost:8000
ID=1
MESSAGE=Hello World!

create-table:
   aws dynamodb create-table \
     --table-name $(TABLE_NAME) \
     --attribute-definitions AttributeName=id,AttributeType=S \
     --key-schema AttributeName=id,KeyType=HASH \
     --billing-mode PAY_PER_REQUEST \
     --endpoint-url $(ENDPOINT_URL)

.PHONY: create-table

delete-table:
   aws dynamodb delete-table \
     --table-name $(TABLE_NAME) \
     --endpoint-url $(ENDPOINT_URL)

.PHONY: delete-table

get-item:
   aws dynamodb get-item \
     --table-name $(TABLE_NAME) \
     --key '{"id": {"S": "$(ID)"}}' \
     --endpoint-url $(ENDPOINT_URL)

.PHONY: get-item

insert-item:
   aws dynamodb put-item \
     --table-name $(TABLE_NAME) \
     --item '{"id": {"S": "$(ID)"}, "message": {"S": "$(MESSAGE)"}}' \
     --endpoint-url $(ENDPOINT_URL)

.PHONY: insert-item

create-table → insert-itemしたあとに、get-itemをしたときの実行結果がこちら

 % make get-item 
aws dynamodb get-item \
          --table-name messages \
          --key '{"id": {"S": "1"}}' \
          --endpoint-url http://localhost:8000
{
    "Item": {
        "message": {
            "S": "Hello World!"
        },
        "id": {
            "S": "1"
        }
    }
}

ひとつ注意点として、create-table時点では、message属性を指定しなくてもいいことです。dynamoDBでは主キーさえあれば属性が異なるレコードも登録できます。
試しに別のレコードを挿入するコマンドを実行してみます。

Makefile
ID=1
NAME=TANE
insert-item-with-name:
	aws dynamodb put-item \
	  --table-name $(TABLE_NAME) \
	  --item '{"id": {"S": "$(ID)"}, "name": {"S": "$(NAME)"}}' \
	  --endpoint-url $(ENDPOINT_URL)

.PHONY: insert-item-with-name

get-itemを実行

% make get-item             
aws dynamodb get-item \
          --table-name messages \
          --key '{"id": {"S": "1"}}' \
          --endpoint-url http://localhost:8000
{
    "Item": {
        "name": {
            "S": "TANE"
        },
        "id": {
            "S": "1"
        }
    }
}

異なる属性を持つレコードが登録できました。
また、ここではIDを変えていないので、最初のinsert-itemで登録したmessageを持つレコードは上書きされてしまっています。

まとめ

今回は、DynamoDBのコンテナをdocker-composeを用いて立ち上げ、Makefileを使用してテーブルの作成・値の挿入・取得・削除を実行しました。また、DynamoDBでは主キーさえあれば属性が異なるレコードも登録できることも確認しました。

こんな感じで継続的にアウトプットできればなと思います。

Discussion