CloudFormationでDynamoDBを作成しようとすると“Number of attributes in KeySchema does not exactly match number of attributes defined in AttributeDefinitions”といったエラーが発生することがあります。原因と対処法について記述します。
原因 yamlにキー以外の属性を定義できない(しなくてもよい)
DynamoDBを作成するyamlにはキーではない属性を定義できません。DynamoDBでは通常の属性(カラム)はテーブル作成時に定義する必要がありません。
なお、インデックスのキーとなっている属性についてはAttributeDefinitionsに定義する必要があります。このことについては対処法で詳しく記述してみます。
対処法 yamlのAttributeDefinitionsからキー以外の属性を取り除く
yamlファイルのAttributeDefinitionsからキー以外の属性を除きます。
例えば以下yamlであれば27行目~28行目のAttribute1はキーではないにもかかわらずAttributeDefinitionsに記載されています。これを削除すればエラーは解消されます。
#AWS CloudFormation スタックを作成のリージョンで作成されます。対象リージョンでスタックを展開してください。
#===============================================================================
# CloudFormation Template
#===============================================================================
AWSTemplateFormatVersion: 2010-09-09
Description: DynamoDB Template
#===============================================================================
# Resources
#===============================================================================
Resources:
#============================================================
#テーブル作成
#============================================================
tableName:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: "TableName"
AttributeDefinitions:
- AttributeName: KeyId
AttributeType: S
- AttributeName: SortId
AttributeType: S
- AttributeName: GsiKey
AttributeType: S
- AttributeName: Attribute1
AttributeType: S
KeySchema:
- AttributeName: KeyId
KeyType: HASH
- AttributeName: SortId
KeyType: RANGE
ProvisionedThroughput:
ReadCapacityUnits: '1'
WriteCapacityUnits: '1'
PointInTimeRecoverySpecification:
PointInTimeRecoveryEnabled: false
#============================================================
#インデックス(GSI)の作成
#============================================================
GlobalSecondaryIndexes:
- IndexName: Gsi1
KeySchema:
- AttributeName: GsiKey
KeyType: HASH
Projection:
NonKeyAttributes:
- Attribute1
- Attribute2
ProjectionType: INCLUDE
ProvisionedThroughput:
ReadCapacityUnits: '1'
WriteCapacityUnits: '1'
補足しますが、AttributeDefinitionsで定義されている他の属性については以下の通りキーとなっています。
属性 | 説明 |
---|---|
KeyId | 31行目でテーブルのキーに指定されている |
SortId | 33行目でテーブルのソートキー(RANGE)に指定されている |
GsiKey | 46行目でインデックス(GSI)のキーに指定されている |
Attribute1 | 50行目でインデックス(GSI)の射影属性に指定されているが、キーではない |
以下のyamlの通りAttributeDefinitionsからAttribute1を削除したらエラーは解消しました。
#AWS CloudFormation スタックを作成のリージョンで作成されます。対象リージョンでスタックを展開してください。
#===============================================================================
# CloudFormation Template
#===============================================================================
AWSTemplateFormatVersion: 2010-09-09
Description: DynamoDB Template
#===============================================================================
# Resources
#===============================================================================
Resources:
#============================================================
#テーブル作成
#============================================================
tableName:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: "TableName"
AttributeDefinitions:
- AttributeName: KeyId
AttributeType: S
- AttributeName: SortId
AttributeType: S
- AttributeName: GsiKey
AttributeType: S
KeySchema:
- AttributeName: KeyId
KeyType: HASH
- AttributeName: SortId
KeyType: RANGE
ProvisionedThroughput:
ReadCapacityUnits: '1'
WriteCapacityUnits: '1'
PointInTimeRecoverySpecification:
PointInTimeRecoveryEnabled: false
#============================================================
#インデックス(GSI)の作成
#============================================================
GlobalSecondaryIndexes:
- IndexName: Gsi1
KeySchema:
- AttributeName: GsiKey
KeyType: HASH
Projection:
NonKeyAttributes:
- Attribute1
- Attribute2
ProjectionType: INCLUDE
ProvisionedThroughput:
ReadCapacityUnits: '1'
WriteCapacityUnits: '1'
PR
当ブログはWordPressテーマSWELLを使用しています。非常に使いやすく、簡単にプロのようなデザインを使えるのでお勧めです!!
SWELL – シンプル美と機能性両立を両立させた、圧巻のWordPressテーマ
システムエンジニア
AWSを中心としたクラウド案件に携わっています。
IoTシステムのバックエンド開発、Datadogを用いた監視開発など経験があります。
IT資格マニアでいろいろ取得しています。
AWS認定:SAP, DOP, SAA, DVA, SOA, CLF
Azure認定:AZ-104, AZ-300
ITIL Foundation
Oracle Master Bronze (DBA)
Oracle Master Silver (SQL)
Oracle Java Silver SE
■略歴
理系の大学院を卒業
IT企業に就職
AWSのシステム導入のプロジェクトを担当