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/