🌐

DynamoDBのLocal環境を整える。理解する。

2024/07/23に公開

ゴールの絵

  • LocalでDynamoDBを動かす環境を整えます。GUI環境も合わせて作ります。
  • Localで動かしてみます。GUI、CLI、Pythonの3種類で。

docker-compose.yaml

docker-compose.yaml
services:
  # DynamoDB Local is a client-side database that supports the complete DynamoDB API, but doesn't manipulate any tables or data in DynamoDB itself.
  dynamodb:
    image: amazon/dynamodb-local
    ports:
      - "8000:8000"
    volumes:
      - ./dynamodb:/data
    command: "-jar DynamoDBLocal.jar -sharedDb -dbPath /data"
  # DynamoDB Admin is a web-based UI for DynamoDB Local.
  dynamodb-admin:
    image: aaronshaf/dynamodb-admin
    ports:
      - "8001:8001"
    environment:
      - DYNAMO_ENDPOINT=http://dynamodb:8000
    depends_on:
      - dynamodb

docker-compose up -d

docker-compose up -d

DynamoDB AdminでDynamoDB Localを画面操作

http://localhost:8001にアクセスしてみましょう。

テーブルを作ってみます。キー情報入力でsubmit

テーブルが現れました。テーブル削除もボタン1つでできるようになっています。

テーブルを開いてみます。

Create itemをすると、データが表示されました。更新、検索ともに簡単です。

AWS CLIでDynamoDB LocalをCLI操作

--endpoint-url http://localhost:8000をつけるだけです。それ以外は普通のCLI操作と変わりません。

create table
aws dynamodb create-table --endpoint-url http://localhost:8000 \
--table-name 'cli-table' \
--attribute-definitions '[{"AttributeName":"id","AttributeType": "S"}]' \
--key-schema '[{"AttributeName":"id","KeyType": "HASH"}]' \
--billing-mode=PAY_PER_REQUEST

put item
aws dynamodb put-item --endpoint-url http://localhost:8000 \
--table-name 'cli-table' \
--item '{"id": {"S": "1"}, "name": {"S": "icck"}}'
get item
aws dynamodb get-item --endpoint-url http://localhost:8000 \
--table-name 'cli-table' \
--key '{"id": {"S": "1"}}'

{
    "Item": {
        "name": {
            "S": "icck"
        },
        "id": {
            "S": "1"
        }
    }
}

PythonでDynamoDB Localを操作

endpoint_url="http://localhost:8000"を付与することでLocalとなることはCLI変わりません。
ちなみに、
endpoint_url=Noneを渡すとAWS上のリソースを参照します。
つまり、ローカルの切替はこの引数で考えればよいということです。

import boto3

dynamodb = boto3.client("dynamodb", endpoint_url="http://localhost:8000")

if __name__ == "__main__":

    item = dynamodb.get_item(
        TableName="cli-table",
        Key={"id": {"S": "1"}},
    )
    print(item["Item"])
{'name': {'S': 'icck'}, 'id': {'S': '1'}}

さいごに

DynamoDBをローカルで動かすポイントは以下2点だけです。ご参考になると幸いです。

  • dockerを使う
  • endpointを引数に使う(AWS起動時はNoneを設定する)

Discussion