AWS

【DynamoDB】AWS Lambda を使用した DynamoDB テーブル操作

前回はLambda関数からDynamoDBへアクセスする準備を行いました。

今回はLambda関数からDynamoDBのテーブルの作成、テーブル構成の確認、テーブル変更、テーブル一覧の取得を行います。
前回作成した DynamoDbOperator クラスの exec メソッドに処理を記載することとします。

テーブルの作成

内容

テーブルを作成するプログラムは以下の通りです。

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

module.exports = class DynamoDbOperator extends DynamoDbSetter{

    async exec(event) {
       
        // 実行内容
        let params = {
            TableName : "Musics",
            KeySchema: [       
                { AttributeName: "artist", KeyType: "HASH"},  //Partition key
                { AttributeName: "title", KeyType: "RANGE" }  //Sort key
            ],
            AttributeDefinitions: [       
                { AttributeName: "artist", AttributeType: "S" },
                { AttributeName: "title", AttributeType: "S" }
            ],
            ProvisionedThroughput: {       
                ReadCapacityUnits: 10, 
                WriteCapacityUnits: 10
            }
        };
  
        // 実行
        return await this.dynamodb.createTable(params).promise();
        
    }
}

説明

プライマリキー

テーブルを作成するにはプライマリキーを指定します。
KeySchema へプライマリキーを指定します。
KeyType: “HASH” はパーテションキー、KeyType: “RANGE” はソートキーとなります。
ソートキーはオプションですが、パーテションキーは必須です。
プライマリキーやソートキーの説明は以下を参考にして下さい。

属性のタイプ

属性のタイプを指定します。
AttributeDefinitions にて属性を指定します。
AttributeType “N” は数値、”S” は文字列、”B” はバイナリになります。
プライマリキーは上記3つの型(スカラー型)のみ指定できることに注意して下さい。
セカンダリインデックスで指定するプライマリキーについても同様です。

キャパシティモード

キャパシティモードをプロビジョニングモードで作成しています。その為スループットを指定します。
スループットは ProvisionedThroughput へ指定します。
キャパシティモードのプロビジョニングモードについては以下を参照して下さい。

実行結果

{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "artist",
                "AttributeType": "S"
            },
            {
                "AttributeName": "title",
                "AttributeType": "S"
            }
        ],
        "TableName": "Musics",
        "KeySchema": [
            {
                "AttributeName": "artist",
                "KeyType": "HASH"
            },
            {
                "AttributeName": "title",
                "KeyType": "RANGE"
            }
        ],
        "TableStatus": "CREATING",
        "CreationDateTime": "2021-08-27T08:07:00.984Z",
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 10,
            "WriteCapacityUnits": 10
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:ap-northeast-1:XXXXXXXXX:table/Musics",
        "TableId": "43b2bf37-3a41-473d-8c60-b553a1e6334f"
    }
}

“TableStatus” が “CREATING” なので、DynamoDBはテーブルのパーティションを割り当てている状態です。
“ACTIVE” に変わるとテーブルへ書き込み、読み込みが行えます。
パーティションの割り当てについては以下を参照して下さい。

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

内容

ローカルセカンダリインデックスはテーブル作成時に作成できます。
ローカルセカンダリインデックスは、ベーステーブルのパーテションキーは同じで、ソートキーに別の属性を使用します。
ベーステーブルとは違うソートキーを使用してテーブルを検索する際に使用します。
詳細は以下を参照して下さい。

作成するプログラムは以下の通りです。

const DynamoDbSetter = require("./DynamoDbSetter");
 
module.exports = class DynamoDbOperator extends DynamoDbSetter{
 
    async exec(event) {
 
        // 実行内容
        let params = {
            TableName : "weapon",
            KeySchema: [       
                { AttributeName: "name", KeyType: "HASH"},  //Partition key
                { AttributeName: "id", KeyType: "RANGE"}  //Range key
            ],
            AttributeDefinitions: [       
                { AttributeName: "name", AttributeType: "S" },
                { AttributeName: "id", AttributeType: "N" },  //Range key
                { AttributeName: "kind", AttributeType: "N" },
            ],
            ProvisionedThroughput: {       
                ReadCapacityUnits: 10, 
                WriteCapacityUnits: 10
            },
            LocalSecondaryIndexes: [
                {
                    IndexName: "weapon_kind_LSI", 
                    KeySchema: [
                        { AttributeName: "name", KeyType: "HASH"},  //Partition key
                        { AttributeName: "kind", KeyType: "RANGE"}  //Range key
                    ],
                    Projection: {
                        ProjectionType: "ALL",
                    },
                },
            ],
        };
    
        // 実行
        return await this.dynamodb.createTable(params).promise();
 
    }
}

セカンダリインデックスのパーテションキーに指定できるデータタイプはスカラー型のみであることに注意して下さい。

説明

ベーステーブルの説明

武器の一覧を保持するテーブルを作成しました。
プライマリキーは以下の通りです。

パーテションキー:name
ソートキー:id

ローカルセカンダリインデックスの説明

ローカルセカンダリインデックスのプライマリキーは以下の通りです。

パーテションキー:name
ソートキー:kind

ベーステーブルの定義

9行目から22行目がベーステーブルの定義になります。
通常のテーブル作成と変わりありませんが、予めローカルセカンダリインデックスのソートキーをベーステーブルに定義する必要があります。
具体的には14行目のAttributeDefinitionsにローカルセカンダリインデックスのソートキーである kind を指定しています。

ローカルセカンダリインデックスの定義

23行目のLocalSecondaryIndexes以下がローカルセカンダリインデックスの定義内容になります。
今回はProjectionTypeには “ALL” を指定しました。”ALL” を指定すると、ベーステーブルの全ての属性がローカルセカンダリインデックスで使用可能になります。
必要な属性のみ指定したい場合は、”INCLUDE” を指定し、必要な属性を指定します。

DynamoDbの実行メソッド

ローカルセカンダリインデックスはベーステーブルの作成と同時に作成する為、createTableメソッドを実行します。

実行結果

{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "id",
                "AttributeType": "N"
            },
            {
                "AttributeName": "kind",
                "AttributeType": "N"
            },
            {
                "AttributeName": "name",
                "AttributeType": "S"
            }
        ],
        "TableName": "weapon",
        "KeySchema": [
            {
                "AttributeName": "name",
                "KeyType": "HASH"
            },
            {
                "AttributeName": "id",
                "KeyType": "RANGE"
            }
        ],
        "TableStatus": "CREATING",
        "CreationDateTime": "2021-10-20T10:43:13.259Z",
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 10,
            "WriteCapacityUnits": 10
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:ap-northeast-1:081461195071:table/weapon",
        "TableId": "21b7ecf4-f2fc-422e-a06c-2f38db3d6b2a",
        "LocalSecondaryIndexes": [
            {
                "IndexName": "weapon_kind_LSI",
                "KeySchema": [
                    {
                        "AttributeName": "name",
                        "KeyType": "HASH"
                    },
                    {
                        "AttributeName": "kind",
                        "KeyType": "RANGE"
                    }
                ],
                "Projection": {
                    "ProjectionType": "ALL"
                },
                "IndexSizeBytes": 0,
                "ItemCount": 0,
                "IndexArn": "arn:aws:dynamodb:ap-northeast-1:081461195071:table/weapon/index/weapon_kind_LSI"
            }
        ]
    }
}

テーブル構成の確認

先ほど作成したテーブルの構成を確認できます。
describeTable を実行します。

内容

const DynamoDbSetter = require("./DynamoDbSetter");
 
module.exports = class DynamoDbOperator extends DynamoDbSetter{
 
    async exec(event) {
 
        // 実行内容
        let params = {
            TableName : "Musics",
        };
    
        // 実行
        return await this.dynamodb.describeTable(params).promise();
 
    }
}

実行結果

{
    "Table": {
        "AttributeDefinitions": [
            {
                "AttributeName": "artist",
                "AttributeType": "S"
            },
            {
                "AttributeName": "title",
                "AttributeType": "S"
            }
        ],
        "TableName": "Musics",
        "KeySchema": [
            {
                "AttributeName": "artist",
                "KeyType": "HASH"
            },
            {
                "AttributeName": "title",
                "KeyType": "RANGE"
            }
        ],
        "TableStatus": "ACTIVE",
        "CreationDateTime": "2021-08-27T08:07:00.984Z",
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 10,
            "WriteCapacityUnits": 10
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:ap-northeast-1:XXXXXXXXXX:table/Musics",
        "TableId": "43b2bf37-3a41-473d-8c60-b553a1e6334f"
    }
}

テーブル更新

テーブルの更新には updateTable を実行します。
テーブル更新が行える操作は以下の通りです。

・スループットの変更
・キャパシティモードの変更
・DynamoDB Streams 有効/無効 の変更
・セカンダリインデックスの操作

今回はスループットの変更を行います。

内容

const DynamoDbSetter = require("./DynamoDbSetter");
 
module.exports = class DynamoDbOperator extends DynamoDbSetter{
 
    async exec(event) {
 
        // 実行内容
        let params = {
            TableName : "Musics",
            ProvisionedThroughput: {       
                ReadCapacityUnits: 5, 
                WriteCapacityUnits: 5
            }
        };
    
        // 実行
        return await this.dynamodb.updateTable(params).promise();
 
    }
}

実行結果

{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "artist",
                "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:03.845Z",
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 10,
            "WriteCapacityUnits": 10
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:ap-northeast-1:XXXXXXXXX:table/Musics",
        "TableId": "43b2bf37-3a41-473d-8c60-b553a1e6334f"
    }
}

更新前の情報が返却されるようです。更新前のスループットが返却されました。

テーブル一覧の取得

テーブル一覧の取得は listTables を実行します。

内容

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

module.exports = class DynamoDbOperator extends DynamoDbSetter{

    async exec(event) {
    
        // 実行
        return await this.dynamodb.listTables().promise();

    }
}

実行結果

{
    "TableNames": [
        "Musics"
    ]
}

最後に

次回はテーブルへ項目を追加します。

© DeNnie.Lab All Rights Reserved.