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

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

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

```yaml:docker-compose.yml
version: "3"
services:
    dynamo-admin:
        image: instructure/dynamo-local-admin
        ports:
            - "8008:8000"
```

```:起動のコマンド
docker-compose up -d --build
```
起動後に`http://localhost:8008`にアクセスすると早速利用することができる。

<img width="1196" alt="スクリーンショット 2018-06-20 7.03.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/127811/829070c3-481f-73b9-37db-ef9407d70958.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_name`は`http://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`に入れても接続できるかも、と試していないが思った。

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

```python: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
    }
)

```

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

<img width="1197" alt="スクリーンショット 2018-06-20 7.04.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/127811/6898b13a-0e0a-0468-24ed-71e6518f6724.png">

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

```python: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",
  }
)
```

# その他
テーブル一覧は以下で確認できる。

```python: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