🌐
DynamoDBのLocal環境を整える。理解する。
ゴールの絵
- 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