AWS ことはじめ その3 (DynamoDB Part 1)

なんでDynamoDBを使いたいのか

IoTっぽい時系列データを蓄積したい的な話。データの件数が数億~数百億のオーダーになる可能性があり、どれくらい現実的なのかを調べたいため。無料枠でできる範囲で試してみる。 いい感じに検証できる環境があればいいんだけど、数週間かかりそうでSIerのつらみを感じている。

ためたいデータ

蓄積したいデータは、ある機器が生成するもので、機器自体の数は1万〜100万くらいのオーダーと思われる。

個々のデータは、幾つか種類がある。

  • たまに発生するデータ。アラート情報的なやつ。機器1台・1時間あたり、10回くらい?
  • 継続して発生するデータ。メトリクス的なやつ。データ自体は1秒単位だが、1分、3分とかの単位でまとまった状態で機器が発信する。

用途

集計・分析を行うことは(今のところ)想定しておらず、機器ごとに最新データや過去の特定日時のデータを見たい、というもの。基本的には一本釣りに近い形だが、ある程度の範囲でのデータ検索が発生する可能性があり、おもにそこのレスポンスを知りたい。

データ自体は何らかの形で永年で保存しておきたいが、検索を行う期間は限定できる。直近1年間のデータのみ検索可能、とか。

DynamoDBのざっくりまとめ

DynamoDBはAWSのマネージド型Key-Value Stroe。NoSQLに分類される。

  • Primary Keyを指定する以外は、スキーマレス。
    • Primary Keyには、HASHキーとRANGEキー(SORTキー)を指定する。RANGEキーの方は任意。
      • HASHキーで物理的な格納場所が決まり、RANGEキーでソートして格納されるイメージ。
    • JSON形式で表現したデータを入れたり出したりできる
    • NoSQLなのであまり複雑な検索はできない。基本的にはPrimary Keyで一本釣りするイメージ。
      • Secondary Indexを作ることで、ある程度検索に使えるキーを増やすこともできる。
  • 料金に効いてくるのは、①データ量、②スループットの2つ。事前にスループットを指定しないといけないのが肝。
    • スループットは、キャパシティユニット(CU; Capacity Unit)という単位。読み取り(RCU)と書き込み(WCU)の2つで管理する。
    • 1RCU = 1秒間に1KBまでの読み込みを行える。結果整合性のみでよい(=多少最新の更新が漏れてもよい)場合、倍になる。
    • 1WCU = 1秒間に1KBまでを書き込みできる。

CLIでのDynamoDB作成

以下3種類を作成する。

  1. たまに発生するデータを格納しておくテーブル
  2. 1秒間隔で発生するデータを格納しておくテーブル。1つの項目(レコード)に1分、3分などのデータをまとめて持っておく
  3. 1秒間隔で発生するデータを格納しておくテーブル。1秒単位に項目(レコード)を持っておく

公式のドキュメントを見ながら実行。そろそろ手でコマンド打つのが辛くなってくる。 https://docs.aws.amazon.com/cli/latest/reference/dynamodb/create-table.html

❯ aws dynamodb create-table \
    --table-name sparse-data \
    --attribute-definitions AttributeName=sid,AttributeType=S AttributeName=unixtime,AttributeType=N \
    --key-schema AttributeName=sid,KeyType=HASH AttributeName=unixtime,KeyType=RANGE \
    --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "sid",
                "AttributeType": "S"
            },
            {
                "AttributeName": "unixtime",
                "AttributeType": "N"
            }
        ],
        "TableName": "sparse-data",
        "KeySchema": [
            {
                "AttributeName": "sid",
                "KeyType": "HASH"
            },
            {
                "AttributeName": "unixtime",
                "KeyType": "RANGE"
            }
        ],
        "TableStatus": "CREATING",
        "CreationDateTime": 1526805606.531,
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 5,
            "WriteCapacityUnits": 5
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:ap-northeast-1:***masked***:table/sparse-data",
        "TableId": "***masked***"
    }
}

❯ aws dynamodb create-table \
    --table-name continuous-data-aggr \
    --attribute-definitions AttributeName=sid,AttributeType=S AttributeName=unixtime,AttributeType=N \
    --key-schema AttributeName=sid,KeyType=HASH AttributeName=unixtime,KeyType=RANGE \
    --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "sid",
                "AttributeType": "S"
            },
            {
                "AttributeName": "unixtime",
                "AttributeType": "N"
            }
        ],
        "TableName": "continuous-data-aggr",
        "KeySchema": [
            {
                "AttributeName": "sid",
                "KeyType": "HASH"
            },
            {
                "AttributeName": "unixtime",
                "KeyType": "RANGE"
            }
        ],
        "TableStatus": "CREATING",
        "CreationDateTime": 1526805540.236,
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 5,
            "WriteCapacityUnits": 5
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:ap-northeast-1:***masked***:table/continuous-data-aggr",
        "TableId": "***masked***"
    }
}


aws dynamodb create-table \
    --table-name continuous-data \
    --attribute-definitions AttributeName=sid,AttributeType=S AttributeName=unixtime,AttributeType=N \
    --key-schema AttributeName=sid,KeyType=HASH AttributeName=unixtime,KeyType=RANGE \
    --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "sid",
                "AttributeType": "S"
            },
            {
                "AttributeName": "unixtime",
                "AttributeType": "N"
            }
        ],
        "TableName": "continuous-data",
        "KeySchema": [
            {
                "AttributeName": "sid",
                "KeyType": "HASH"
            },
            {
                "AttributeName": "unixtime",
                "KeyType": "RANGE"
            }
        ],
        "TableStatus": "CREATING",
        "CreationDateTime": 1526804024.601,
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 5,
            "WriteCapacityUnits": 5
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:ap-northeast-1:***masked***:table/continuous-data",
        "TableId": "***masked***"
    }
}

❯ aws dynamodb list-tables
{
    "TableNames": [
        "continuous-data",
        "continuous-data-aggr",
        "sparse-data"
    ]
}

次回は、①データの投入、②バッチ投入、③データの読み込みの時間計測