AWS

【DynamoDB】AWS SDK を使用したグローバルセカンダリインデックスの作成

前回はテーブルから単一項目を取得しました。

今回はグローバルセカンダリインデックスを作成します。
グローバルセカンダリインデックスについては以下を参照して下さい。

ベーステーブルの作成

説明

グローバルセカンダリインデックスはベーステーブルから作成されるので、まずはベーステーブルを作成します。
なお、ベーステーブルの作成と同時にグローバルセカンダリインデックスを作成できますが、今回はベーステーブルを作成した後にグローバルセカンダリインデックスを作成します。

テーブルの作成の説明については以下を参考にして下さい。

テーブル作成プログラム

const DynamoDbSetter = require("./DynamoDbSetter");

module.exports = class DynamoDbOperator extends DynamoDbSetter{

    async exec(event) {

        // 実行内容
        let params = {
            TableName : "Musics",
            KeySchema: [
                { AttributeName: "title", KeyType: "HASH" },  //Partition key
                { AttributeName: "artist", KeyType: "RANGE"}  //Sort key
            ],
            AttributeDefinitions: [
                { AttributeName: "title", AttributeType: "S" },
                { AttributeName: "artist", AttributeType: "S" }
            ],
            ProvisionedThroughput: {       
                ReadCapacityUnits: 10, 
                WriteCapacityUnits: 10
            }
        };

        // 実行
        return await this.dynamodb.createTable(params).promise();

    }
}

グローバルセカンダリインデックスの作成

実行

“genre” 属性についてグローバルセカンダリインデックスを作成します。
テーブル作成の時は、createTable を実行することになりますが、今回はベーステーブルに対しての変更になるので、updateTable を実行することになります。

const DynamoDbSetter = require("./DynamoDbSetter");

module.exports = class DynamoDbOperator extends DynamoDbSetter{

    async exec(event) {

        // 実行内容
        let params = {
            TableName : "Musics",
            AttributeDefinitions: [
                { AttributeName: "genre", AttributeType: "S" }
            ],
            GlobalSecondaryIndexUpdates: [
                {
                    Create: {
                        IndexName: "genreIndex", 
                        KeySchema: [
                            { AttributeName: "genre", KeyType: "HASH"},  //Partition key
                        ],
                        Projection: {
                            ProjectionType: "INCLUDE",
                            NonKeyAttributes: ["year"]
                        },
                        ProvisionedThroughput: {
                            ReadCapacityUnits: 10, 
                            WriteCapacityUnits: 10
                        }
                    }
                },
            ],
        };
    
        // 実行
        return await this.dynamodb.updateTable(params).promise();

    }
}

実行内容の説明

AttributeDefinitions

グローバルセカンダリインデックスのプライマリキーのデータタイプを定義します。

KeySchema

グローバルセカンダリインデックスのパーティションキーを定義します。オプションでソートキーを定義します。

Projection

射影する属性を指定します。
Projection の ProjectionType の指定はいくつか種類があります。今回は “INCLUDE” を指定しました。
こうすると、プライマリキー以外の属性が射影できます。今回は属性名 “year” を射影します。
なお、ベーステーブルのプライマリキー属性は自動的にグローバルセカンダリインデックスへ射影されます。
Projection、射影については以下を参照して下さい。

ProvisionedThroughput

ベーステーブルのスループットとは別になりグローバルセカンダリインデックス毎に独立しています。

結果

{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "artist",
                "AttributeType": "S"
            },
            {
                "AttributeName": "genre",
                "AttributeType": "S"
            },
            {
                "AttributeName": "title",
                "AttributeType": "S"
            }
        ],
        "TableName": "Musics",
        "KeySchema": [
            {
                "AttributeName": "artist",
                "KeyType": "HASH"
            },
            {
                "AttributeName": "title",
                "KeyType": "RANGE"
            }
        ],
        "TableStatus": "UPDATING",
        "CreationDateTime": "2021-08-27T08:07:00.984Z",
        "ProvisionedThroughput": {
            "LastDecreaseDateTime": "2021-08-27T08:19:04.873Z",
            "NumberOfDecreasesToday": 1,
            "ReadCapacityUnits": 5,
            "WriteCapacityUnits": 5
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:ap-northeast-1:081461195071:table/Musics",
        "TableId": "43b2bf37-3a41-473d-8c60-b553a1e6334f",
        "GlobalSecondaryIndexes": [
            {
                "IndexName": "genreIndex",
                "KeySchema": [
                    {
                        "AttributeName": "genre",
                        "KeyType": "HASH"
                    }
                ],
                "Projection": {
                    "ProjectionType": "INCLUDE",
                    "NonKeyAttributes": [
                        "year"
                    ]
                },
                "IndexStatus": "CREATING",
                "Backfilling": false,
                "ProvisionedThroughput": {
                    "NumberOfDecreasesToday": 0,
                    "ReadCapacityUnits": 10,
                    "WriteCapacityUnits": 10
                },
                "IndexSizeBytes": 0,
                "ItemCount": 0,
                "IndexArn": "arn:aws:dynamodb:ap-northeast-1:081461195071:table/Musics/index/genreIndex"
            }
        ]
    }
}

最後に

次回は複数の項目を取得します。

© DeNnie.Lab All Rights Reserved.