LoginSignup
12
14

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-06-26

概要

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)

参考

12
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
14