Udemyブラックフライデーセール開催中(11/29まで)教材が1,300円~

DynamoDBの設定変更 GSI名変更時のエラー Cannot perform more than one GSI creation or deletion in a single update

DynamoDBの設定変更-GSI名変更時のエラアイキャッチ

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_NAMENEW_USER_NAMEに変更します。

36行目だけ変更しています。

#===============================================================================
# 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のリネームができました。

マネジメントコンソールでスタック更新が成功することを確認する
マネジメントコンソールでGSIの更新ができていることを確認できる

PR
当ブログはWordPressテーマSWELLを使用しています。非常に使いやすく、簡単にプロのようなデザインを使えるのでお勧めです!!

SWELL – シンプル美と機能性両立を両立させた、圧巻のWordPressテーマ

ランキング

ランキングに参加しています。クリックして応援いただけると嬉しいです。
にほんブログ村 IT技術ブログ クラウドコンピューティングへ
にほんブログ村
AWSランキング
AWSランキング

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次