【DynamoDB Local】DynamoDBをローカルで使用する方法

プログラミング

はじめに

この記事ではローカルで完結する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 にアクセスすると、データが挿入されていることが確認できます。

タイトルとURLをコピーしました