Help us understand the problem. What is going on with this article?

【dynamodb】ローカル環境のデータをGUIで確認するまで

More than 1 year has passed since last update.

概要

dynamodbをローカル環境で扱っている際にGUIでデータ確認がしたかったので、調べてみたところdynamodb-adminというものがあった。今回はdynamodb-adminを扱うことのできるinstructure/dynamo-local-adminというDockerイメージがあったのでこれを利用する。
ここで使うソースコードはGitHubにアップしているのでご自由にどうぞ。

本題

dynamo-local-adminの起動

docker-composeを利用して起動する。ymlファイルと実行コマンドは以下の通り。

docker-compose.yml
version: "3"
services:
    dynamo-admin:
        image: instructure/dynamo-local-admin
        ports:
            - "8008:8000"
起動のコマンド
docker-compose up -d --build

起動後にhttp://localhost:8008にアクセスすると早速利用することができる。

スクリーンショット 2018-06-20 7.03.36.png

テーブル作成してGUIで確認する

実際にプログラムからテーブルを作成してみる。私はプログラムからテーブル作成を行うことに苦労をしたのでこの部分は同じく苦労している方へのメッセージになると嬉しい。どこに苦労したかというと、boto3のインスタンスを作成する際にendpoint_url=http://localhost:8008に設定しているにも関わらず、テーブル作成を実行してもGUIには全く反映されなかった(CLI上ではテーブルが作られていることを確認した、CLIでのテーブル確認のコードも下に掲載する)。調べてみるといくつかの記事でインスタンスの作成時にregion_nameを指定している記事があったので試しにus-east-1を設定してみたところ、以前作成したテーブルがCUIからも確認できなくなってしまった。全く初期化されてしまった。
しかしながら、このことから同じendpoint_url=http://localhost:8008でもregion_nameごとに空間を持っていることに気づき、ひょっとするとregion_nameを正しく設定することで、GUIがみているであろう空間にアクセスすることができテーブルの確認ができるのではないだろうかと考えた。
ただ、どの空間がわからないためinstructure/dynamo-local-adminコンテナに入ってみてregion_nameを調べてみたところhttp://localhost:8000が設定されていた。そのため、コンテナを操作する側ではregion_namehttp://localhost:8008をしていすればいいのでは、と考えた(8008->8000にフォワーディングされているため8008を指定)。
実際、http://localhost:8008の設定ではうまく行かずhttp://localhost:8000を指定したらGUIから確認ができるようになった。
このことから、region_nameの指定はアドレスとかフォワーディングされるとかそういうものではなく、どういう名前空間でやっていくかという話なだけなんだ、とわかった。まぁ確かにendpoint_urlを指定している時点で操作したいコンピュータを指定しているわけなので、region_nameではそのコンピュータのどの空間を利用するかという話になるためフォワーディングされたりしないのも当然だと納得した。ということは、もしかするとinstructure/dynamo-local-adminコンテナ側でもコンテナを操作する側でもregion_name=hogehogeみたいなヘンテコな文字列をregion_nameに入れても接続できるかも、と試していないが思った。

以下にテーブルを作成するプログラムを記載する。

create_movies.py
import boto3

client = boto3.client('dynamodb', endpoint_url='http://localhost:8008', region_name='localhost:8000')

table = client.create_table(
    TableName='Movies',
    KeySchema=[
        {
            'AttributeName': 'id',
            'KeyType': 'HASH'  #Partition key
        },
        {
            'AttributeName': 'title',
            'KeyType': 'RANGE'  #Sort key
        }
    ],
    AttributeDefinitions=[
        {
            'AttributeName': 'id',
            'AttributeType': 'N'
        },
        {
            'AttributeName': 'title',
            'AttributeType': 'S'
        },

    ],
    ProvisionedThroughput={
        'ReadCapacityUnits': 10,
        'WriteCapacityUnits': 10
    }
)

テーブル作成のプログラムを動かすと以下のようになりテーブルが作成されていることが確認できた。

スクリーンショット 2018-06-20 7.04.34.png

また、ここまでくるとあとは簡単で、データのinputは以下でできる。

movies_put.py
import boto3

dynamodb = boto3.resource('dynamodb', region_name='localhost:8000', endpoint_url="http://localhost:8008")

table = dynamodb.Table('Movies')

response = table.put_item(
  Item={
      'id': 1,
      'title': "hello",
  }
)

その他

テーブル一覧は以下で確認できる。

show_all.py
import boto3

client = boto3.client('dynamodb', endpoint_url='http://localhost:8008', region_name='localhost:8000')
response = client.list_tables()
print(response)

参考

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.Python.01.html

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away