概要
dynamodbをローカル環境で扱っている際にGUIでデータ確認がしたかったので、調べてみたところdynamodb-admin
というものがあった。今回はdynamodb-admin
を扱うことのできるinstructure/dynamo-local-admin
というDockerイメージがあったのでこれを利用する。
ここで使うソースコードはGitHubにアップしているのでご自由にどうぞ。
本題
dynamo-local-adminの起動
docker-composeを利用して起動する。ymlファイルと実行コマンドは以下の通り。
version: "3"
services:
dynamo-admin:
image: instructure/dynamo-local-admin
ports:
- "8008:8000"
docker-compose up -d --build
起動後にhttp://localhost:8008
にアクセスすると早速利用することができる。
テーブル作成して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
に入れても接続できるかも、と試していないが思った。
以下にテーブルを作成するプログラムを記載する。
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
}
)
テーブル作成のプログラムを動かすと以下のようになりテーブルが作成されていることが確認できた。
また、ここまでくるとあとは簡単で、データのinputは以下でできる。
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",
}
)
その他
テーブル一覧は以下で確認できる。
import boto3
client = boto3.client('dynamodb', endpoint_url='http://localhost:8008', region_name='localhost:8000')
response = client.list_tables()
print(response)
参考