movee(モビー) オノデラのブログ

(株)movee代表。週末は自社サービスを作っています。

DynamoDBについてまとめ

いわゆるkey,value型のマネージドデータストアサービス。NoSQLデータベース。 データが3つのAZに分散されており、耐久性が高い。またデータ上限がない。 cacheやsessionの保存などに利用される。

AWSコンパネでポチポチしてテーブルを作れるが今回はcloud shellでコマンドで作る。

  • Artistをパーティションキー、SongTitleをソートキーとして設定
  • Artist、SongTitleの複合プライマリキーとして設定

プライマリキー。プライマリキーは 1 つの属性 (パーティションキー) または 2 つの属性で構成できます (パーティションキーとソートキー)。属性名、データタイプ、各属性のロール(パーティションキーでは HASH、ソートキーでは RANGE)を指定する必要があります。詳細については、「プライマリキー」を参照してください。

DynamoDB テーブルの基本的なオペレーション - Amazon DynamoDB

$aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1

{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "Artist",
                "AttributeType": "S"
            },
            {
                "AttributeName": "SongTitle",
                "AttributeType": "S"
            }
        ],
        "TableName": "Music",
        "KeySchema": [
            {
                "AttributeName": "Artist",
                "KeyType": "HASH"
            },
            {
                "AttributeName": "SongTitle",
                "KeyType": "RANGE"
            }
        ],
        "TableStatus": "CREATING",
        "CreationDateTime": "2022-12-22T02:30:13.273000+00:00",
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 1,
            "WriteCapacityUnits": 1
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:ap-northeast-1:568161714426:table/Music",
        "TableId": "bd293a64-ff57-4f57-975d-883779c383a5"
    }
}

scan(データ一覧)する

テーブルを作成しただけなのでもちろん何も入っていない

$aws dynamodb scan --table-name Music
{
    "Items": [],
    "Count": 0,
    "ScannedCount": 0,
    "ConsumedCapacity": null
}

put-item(データ格納)する

$ aws dynamodb put-item --table-name Music --item '{ "Artist": {"S": "SMAP"}, "SongTitle": {"S": "ライオンハート"}, "AlbumTitle": {"S": "10周年アルバム"} }'
$ aws dynamodb put-item --table-name Music --item '{ "Artist": {"S": "SMAP"}, "SongTitle": {"S": "オレンジ"}, "AlbumTitle": {"S": "10周年アルバム"} }'
$ aws dynamodb put-item --table-name Music --item '{ "Artist": {"S": "GReeeeN"}, "SongTitle": {"S": "オレンジ"}, "AlbumTitle": {"S": "GReeeeNベストアルバム"} }'
$aws dynamodb scan --table-name Music

{
    "Items": [
        {
            "AlbumTitle": {
                "S": "10周年アルバム"
            },
            "Artist": {
                "S": "SMAP"
            },
            "SongTitle": {
                "S": "オレンジ"
            }
        },
        {
            "AlbumTitle": {
                "S": "10周年アルバム"
            },
            "Artist": {
                "S": "SMAP"
            },
            "SongTitle": {
                "S": "ライオンハート"
            }
        },
        {
            "AlbumTitle": {
                "S": "GReeeeNベストアルバム"
            },
            "Artist": {
                "S": "GReeeeN"
            },
            "SongTitle": {
                "S": "オレンジ"
            }
        }
    ],
    "Count": 3,
    "ScannedCount": 3,
    "ConsumedCapacity": null
}

この状態で以下のような重複データを入れようとするとエラーメッセージはないが、重複してるのでデータは入らない。 $ aws dynamodb put-item --table-name Music --item '{ "Artist": {"S": "SMAP"}, "SongTitle": {"S": "ライオンハート"}, "AlbumTitle": {"S": "10周年アルバム"} }'

query(データ取得)する

get-itemで取得する方法もある

aws dynamodb query --table-name Music --key-condition-expression 'Artist = :Artist' --expression-attribute-values '{ ":Artist": { "S": "SMAP" }}'
{
    "Items": [
        {
            "AlbumTitle": {
                "S": "10周年アルバム"
            },
            "Artist": {
                "S": "SMAP"
            },
            "SongTitle": {
                "S": "オレンジ"
            }
        },
        {
            "AlbumTitle": {
                "S": "10周年アルバム"
            },
            "Artist": {
                "S": "SMAP"
            },
            "SongTitle": {
                "S": "ライオンハート"
            }
        }
    ],
    "Count": 2,
    "ScannedCount": 2,
    "ConsumedCapacity": null
}

なお、以下のようにソートキーを条件に取得しようとすると怒られる。 パーティーションキー、またはパーティーションキーとソートキーを条件にすればいけるんじゃないかなと思う。試してないけど。 $ aws dynamodb query --table-name Music --key-condition-expression 'SongTitle = :songtitle' --expression-attribute-values '{ ":songtitle": { "S": "オレンジ" }}'