CloudFormationで作成したDynamoDBのGSI(グローバルセカンダリインデックス)の名前を変更しようとするとCannot perform more than one GSI creation or deletion in a single updateというエラーが発生します。GSI名をCloudFormationで変更したい際の対処法を記載します。
結論 どのように対処したか
CloudFormationでGSI名を変更しようとするとエラーになります。なので、一旦GSIを消して再度名前を変更したGSIを作成することで対処しました。
発生した事象 スタック更新失敗(UPDATE_FAILED)
以下のようなyamlで作成したテーブルとGSIの名前を変更します。
以下はBeforeです。
#===============================================================================
# CloudFormation Template
#===============================================================================
AWSTemplateFormatVersion: 2010-09-09
Description: DynamoDB Template
#===============================================================================
# Resources
#===============================================================================
Resources:
#============================================================
#USERテーブル作成
#============================================================
tableUser:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: "USER"
AttributeDefinitions:
- AttributeName: ID
AttributeType: S
- AttributeName: NAME
AttributeType: S
KeySchema:
- AttributeName: ID
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: '1'
WriteCapacityUnits: '1'
PointInTimeRecoverySpecification:
PointInTimeRecoveryEnabled: false
#============================================================
#インデックス(GSI)の作成
#============================================================
GlobalSecondaryIndexes:
- IndexName: USER_NAME
KeySchema:
- AttributeName: NAME
KeyType: HASH
Projection:
NonKeyAttributes:
- JOB
- OPTION
ProjectionType: INCLUDE
ProvisionedThroughput:
ReadCapacityUnits: '1'
WriteCapacityUnits: '1'
こちらのインデックス、USER_NAMEをNEW_USER_NAMEに変更します。
#===============================================================================
# CloudFormation Template
#===============================================================================
AWSTemplateFormatVersion: 2010-09-09
Description: DynamoDB Template
#===============================================================================
# Resources
#===============================================================================
Resources:
#============================================================
#USERテーブル作成
#============================================================
tableUser:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: "USER"
AttributeDefinitions:
- AttributeName: ID
AttributeType: S
- AttributeName: NAME
AttributeType: S
KeySchema:
- AttributeName: ID
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: '1'
WriteCapacityUnits: '1'
PointInTimeRecoverySpecification:
PointInTimeRecoveryEnabled: false
#============================================================
#インデックス(GSI)の作成
#============================================================
GlobalSecondaryIndexes:
- IndexName: NEW_USER_NAME
KeySchema:
- AttributeName: NAME
KeyType: HASH
Projection:
NonKeyAttributes:
- JOB
- OPTION
ProjectionType: INCLUDE
ProvisionedThroughput:
ReadCapacityUnits: '1'
WriteCapacityUnits: '1'
スタックの更新を行うと以下のようなエラーが発生します。
対処法 yamlから一度GSIを削除してリネーム後のGSIで更新
どうしてもCloudFormationでGSIのリネームを行いたかったので試行錯誤した結果、GSI削除→再作成でできることを確認しました。
STEP1 GSI削除
yamlテンプレートからGSIを削除します。
#===============================================================================
# CloudFormation Template
#===============================================================================
AWSTemplateFormatVersion: 2010-09-09
Description: DynamoDB Template
#===============================================================================
# Resources
#===============================================================================
Resources:
#============================================================
#USERテーブル作成
#============================================================
tableUser:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: "USER"
AttributeDefinitions:
- AttributeName: ID
AttributeType: S
KeySchema:
- AttributeName: ID
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: '1'
WriteCapacityUnits: '1'
PointInTimeRecoverySpecification:
PointInTimeRecoveryEnabled: false
これでCloudFormationのスタックを更新します、するとGSIが削除されます。
GSI削除に伴い、NAMEはテーブルの属性から除外しています。除外していない場合(キーではない属性をyamlで定義している場合)はResource handler returned message: “Number of attributes in KeySchema does not exactly match number of attributes defined in AttributeDefinitionsのエラーが発生します。
STEP2 リネームしたGSIを作成
リネームしたGSIをyamlに記述します。
#===============================================================================
# CloudFormation Template
#===============================================================================
AWSTemplateFormatVersion: 2010-09-09
Description: DynamoDB Template
#===============================================================================
# Resources
#===============================================================================
Resources:
#============================================================
#USERテーブル作成
#============================================================
tableUser:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: "USER"
AttributeDefinitions:
- AttributeName: ID
AttributeType: S
- AttributeName: NAME
AttributeType: S
KeySchema:
- AttributeName: ID
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: '1'
WriteCapacityUnits: '1'
PointInTimeRecoverySpecification:
PointInTimeRecoveryEnabled: false
#============================================================
#インデックス(GSI)の作成
#============================================================
GlobalSecondaryIndexes:
- IndexName: NEW_USER_NAME
KeySchema:
- AttributeName: NAME
KeyType: HASH
Projection:
NonKeyAttributes:
- JOB
- OPTION
ProjectionType: INCLUDE
ProvisionedThroughput:
ReadCapacityUnits: '1'
WriteCapacityUnits: '1'
すると更新が成功してGSIができました。結果的にGSIのリネームができました。
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のシステム導入のプロジェクトを担当