serverless frameworkでDynamoDBのテーブルのキースキーマ変更と注意点

serverless frameworkでDynamoDBのキースキーマを変更する場合の注意点があったのでメモ。

DynamoDBのHASHやRANGEに指定しているスキーマを変更してデプロイすると際はテーブル名を変更しろとエラーがでるのですが、言われた通りにテーブル名を変更すると前のテーブルが削除されて新しいテーブルが作成されます。

以下の様に一度変更してから戻せばキースキーマを変更できるのですが変更するとデータが消えてしまいます。

resources:
  Resources:
    RankingItemTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: items
        AttributeDefinitions:
          - AttributeName: postId
            AttributeType: S
          - AttributeName: date
            AttributeType: S
        KeySchema:
          - AttributeName: postId
            KeyType: HASH
          - AttributeName: date
            KeyType: RANGE

↓ この時点でもとのテーブルがなくなるのでデータが消える

resources:
  Resources:
    RankingItemTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: items_
        AttributeDefinitions:
          - AttributeName: postId
            AttributeType: N
          - AttributeName: date
            AttributeType: S
        KeySchema:
          - AttributeName: postId
            KeyType: HASH
          - AttributeName: date
            KeyType: RANGE

resources:
  Resources:
    RankingItemTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: items
        AttributeDefinitions:
          - AttributeName: postId
            AttributeType: N
          - AttributeName: date
            AttributeType: S
        KeySchema:
          - AttributeName: postId
            KeyType: HASH
          - AttributeName: date
            KeyType: RANGE

なにかでミスってテーブル名が変更されちゃったりしたときもデータが消えてしまうので定期バックアップは必須です。 (serverless frameworkはCloudFormation使っているのでCloudFormationでも同じことが起こるはず)

データを残したままキースキーマを変更したい場合は↓のようにDynamoDBストリームを使って新しいテーブルに移行する必要がありそうです。

https://www.abhayachauhan.com/2018/01/dynamodb-changing-table-schema/