Open3

dynamo dbの使い方

daikidaiki
  • テーブルを確認する
    • aws dynamodb list-tables
  • DynamoDBのデータタイプ
    • S, N, B, SS, NS, BS, M, L, NULL, BOOL
  • テーブルの作成
    • aws dynamodb create-table --table-name bbb --attribute-definitions AttributeName=Name,AttributeType=S --key-schema AttributeName=Name,KeyType=HASH --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
  • テーブルの定義を確認
    • aws dynamodb describe-table --table-name bbb
  • テーブルの削除
    • aws dynamodb delete-table --table-name bbb

参考

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.LowLevelAPI.html

daikidaiki
  • KeySchemaで使うHASHとRANGEは何が違うのか
  • NoSql Workbenchからデータを見る時にscanとqueryがあってどちらも絞り込めるが何が違うのか
  • MySqlやPostgreSqlとの違いは、テーブル構造の扱い
    • partition keyが1つあれば、他のデータ構造には制約が必要なさそう
    • 正規化されていないデータの扱いにはdynamoDBが向いていそう
  • 後々の分析を考えると、正規化されているデータは結局必要になるとしたら、DynamoDBなら解決できるというケースにはそんなに遭遇しないのかもしれない
  • websocketのawsのtutorialではdynamoDBにconnectionIdを保存しているけど、cloudformationからredisやmysqlなどより簡単に設定できるから?
    • 速度面などでメリットがある?
daikidaiki

データ形式を記述するにはCLIやマネジメントコンソールではなく、pythonなどからの方が保存して後から見直したり、再現性の観点からは良さそう

# テーブル作る
import boto3

dyn_resource = boto3.resource("dynamodb")
table_name = "TryDaxTable"
params = {
    "TableName": table_name,
    "KeySchema": [
        {"AttributeName": "partition_key", "KeyType": "HASH"},
        {"AttributeName": "sort_key", "KeyType": "RANGE"},
    ],
    "AttributeDefinitions": [
        {"AttributeName": "partition_key", "AttributeType": "N"},
        {"AttributeName": "sort_key", "AttributeType": "N"},
    ],
    "ProvisionedThroughput": {"ReadCapacityUnits": 10, "WriteCapacityUnits": 10},
}
table = dyn_resource.create_table(**params)
print(f"Creating {table_name}...")
table.wait_until_exists()
# Insert
import boto3

dyn_resource = boto3.resource("dynamodb")
table = dyn_resource.Table("TryDaxTable")
some_data = "X" * item_size

partition_key = 1
sort_key = 1
table.put_item(
    Item={
        "partition_key": partition_key,
        "sort_key": sort_key,
    }
)
# テーブルの削除
import boto3

dyn_resource = boto3.resource("dynamodb")
table = dyn_resource.Table("TryDaxTable")
print(f"Deleting {table.name}...")
table.wait_until_not_exists()
  • テーブルの削除だけstuckした
  • WriteCapacityUnitが関係しているかもしれない
  • NoSQL Workbenchから手動で削除