前回はLambda関数からDynamoDBへアクセスする準備まで行いました。
今回はLambda関数からDynamoDBのテーブルの作成を行います。
テーブルの作成
内容
テーブルを作成するプログラムは以下の通りです。
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();
}
}
説明
TableName
テーブル名を指定します。
KeySchema
KeySchema へプライマリキーを指定します。
KeyType: “HASH” はパーテションキー、KeyType: “RANGE” はソートキーとなります。
ソートキーはオプションですが、パーテションキーは必須です。
プライマリキーやソートキーの説明は以下を参考にして下さい。
AttributeDefinitions
AttributeDefinitions にて属性のタイプを指定します。
プライマリキー属性の指定は必須になります。
プライマリキー以外の属性(非キー属性)の指定はできません。
プライマリキーのみ指定できるので、指定可能な属性のタイプは以下の通りです。
“N”:数値
“S”:文字列
“B”:バイナリ
ProvisionedThroughput
キャパシティモードをプロビジョニングモードで作成しています。その為スループットを指定します。
スループットは 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"
}
]
}
}
注意事項
テーブルの作成、更新、削除のようなテーブル操作では、DynamoDBドキュメントクライアントは使用できません。
DynamoDBドキュメントクライアントの説明はここではしません。
以下はドキュメントクライアントの設定例になります。
const AWS = require("aws-sdk");
module.exports = class DynamoDbSetter {
constructor() {
this.dynamodb = new AWS.DynamoDB.DocumentClient();
}
}
上記ではなく、以下のようにDynamoDB SDK を指定してください。
const AWS = require("aws-sdk");
module.exports = class DynamoDbSetter {
constructor() {
this.dynamodb = new AWS.DynamoDB();
}
}
最後に
次回はテーブル構成の確認を行います。