はじめに
この記事ではローカルで完結するDynamoDBの開発環境を docker-compose を用いて開発します。
また、boto3を用いて、pythonにてDynamoDBを操作する方法も述べます。
この記事に記載されているソースコードは以下のGitHubで入手することができます。
GitHub - Joichiro433/Blog-dynamodb-local
Contribute to Joichiro433/Blog-dynamodb-local development by creating an account on GitHub.
DynamoDB Localの環境構築
docker-composeを使って、ローカルで動かせる DynamoDB Local の環境を作成しましょう。
ここでは、Amazonが公開している下記のdocker imageを用います。
https://hub.docker.com/r/amazon/dynamodb-local
また、DynamoDBの内容を確認するGUIとして、dynamodb-admin も導入します。下記をdocker imageを用います。
https://hub.docker.com/r/aaronshaf/dynamodb-admin
docker-compose.yml
使用する docker-compose.yml ファイルは下記の通りです。
version: '3'
services:
dynamodb-local:
image: amazon/dynamodb-local:latest
container_name: dynamodb_local
user: root
command: -jar DynamoDBLocal.jar -sharedDb -dbPath /data # 永続化するデータのファイルパス
volumes:
- ./dynamodb_data:/data # データの永続化
ports:
- 8000:8000
dynamodb-admin:
image: aaronshaf/dynamodb-admin:latest
container_name: dynamodb-admin
environment:
- DYNAMO_ENDPOINT=dynamodb-local:8000
ports:
- 8001:8001
depends_on:
- dynamodb-local
dockerコンテナの起動
docker-composeコマンドを実行して、コンテナを起動します。
$ docker-compose up -d
Creating network "sample_db_default" with the default driver
Creating dynamodb_local ... done
Creating dynamodb-admin ... done
起動後、http://localhost:8001 にアクセスすると、docker-adminが立ち上がっていることが確認できます。
boto3を用いた、pythonによるDynamoDBの操作
boto3を用いて、DynamoDBにテーブル作成と、データを挿入します。boto3は pip でインストール可能です。
pip install boto3
テーブル作成と、データ挿入のpythonコードは下記となります。
import boto3
def create_table(dynamodb=None):
table = dynamodb.create_table(
TableName='Movies',
KeySchema=[
{
'AttributeName': 'year',
'KeyType': 'HASH' # Partition key
},
{
'AttributeName': 'title',
'KeyType': 'RANGE' # Sort key
}
],
AttributeDefinitions=[
{
'AttributeName': 'year',
'AttributeType': 'N'
},
{
'AttributeName': 'title',
'AttributeType': 'S'
},
],
ProvisionedThroughput={
'ReadCapacityUnits': 10,
'WriteCapacityUnits': 10
}
)
return table
def insert_data(table):
movies = [
{
"year": 2013,
"title": "Rush",
"info": {"directors": ["Ron Howard"], "release_date": "2013-09-02T00:00:00Z"}
},
{
"year": 2013,
"title": "Prisoners",
"info": {"directors": ["Denis Villeneuve"], "release_date": "2013-08-30T00:00:00Z"}
}
]
with table.batch_writer() as batch:
for movie in movies:
batch.put_item(Item=movie)
print(f'Adding movie: {movie["year"]}, {movie["title"]}')
if __name__ == '__main__':
dynamodb = boto3.resource(
service_name='dynamodb',
endpoint_url='http://localhost:8000',
aws_access_key_id='',
aws_secret_access_key='',
region_name='')
movie_table = create_table(dynamodb)
print(f'Table status: {movie_table.table_status}')
insert_data(movie_table)
プログラムを実行した後、http://localhost:8001 にアクセスすると、データが挿入されていることが確認できます。