AWS Cloudformation カスタム名つきリソースの置換
Page content
AWS Cloudformationで、カスタム名を持つリソース(を含むスタック)を置換(replace)しようとすると、エラーが発生する。
Cloudformation cannot update a stach when custom-named resource requires replacing.
Rename {リソース名} and update the stack again
リソース名を変えて立て直せと言われます。
Elasticsearch Serviceの場合
Elasticsearchのバージョンを上げようとすると怒られる。
MyElasticsearchDomain:
Type: AWS::Elasticsearch::Domain
Properties:
DomainName: MyDomainName
InstanceType: r4.large.elasticsearch
# ElasticsearchVersion: 6.2
ElasticsearchVersion: 6.5
カスタム名を変えると成功しますが、当然建て替えになるので、中のデータは消えます。
MyElasticsearchDomain:
Type: AWS::Elasticsearch::Domain
Properties:
# DomainName: MyDomainName
DomainName: MyDomainName2
InstanceType: r4.large.elasticsearch
# ElasticsearchVersion: 6.2
ElasticsearchVersion: 6.5
ちなみに、InstanceTypeとかは置換が発生しないので、後からでも変えられます。
MyElasticsearchDomain:
Type: AWS::Elasticsearch::Domain
Properties:
DomainName: MyDomainName
# InstanceType: r4.large.elasticsearch
InstanceType: r5.2xlarge.elasticsearch
ElasticsearchVersion: 6.2
DynamoDBの場合
レンジキーを後から追加しようとすると怒られる。
MyDynamodbTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: MyTableName
AttributeDefinitions:
- AttributeName: MyHash
AttributeType: S
- AttributeName: MyRange
AttributeType: S
KeySchema:
- AttributeName: MyHash
KeyType: HASH
- AttributeName: MyRange # NEW!
KeyType: RANGE # NEW!
Table名を変えれば成功しますが、もちろんこれも置換。なんでデータは消えます。
MyDynamodbTable:
Type: AWS::DynamoDB::Table
Properties:
# TableName: MyTableName
TableName: MyTableName2
AttributeDefinitions:
- AttributeName: MyHash
AttributeType: S
- AttributeName: MyRange
AttributeType: S
KeySchema:
- AttributeName: MyHash
KeyType: HASH
- AttributeName: MyRange # NEW!
KeyType: RANGE # NEW!
結論
- 必須でないなら、置換が発生する変更は控える
- 特に、活性環境でデータを保持したま
- 必須の場合、データのバックアップ、PITR等を活用してデータを移し替える
- 案1. 先にバックアップを取得し、カスタム名を替えて置換してからレストアする
- 案2. カスタム名を替えたリソースをtemplateに併記し、一時的に二台ある状態に。データを移し替えてから旧リソースを削除
- 活性環境で行う場合はこちら
- コードでリソースを指す際には、名称を直接指定しない
- 本件のようにリソース名が変わった場合、コード変更が必須になる
- CloudformationのExport等を利用して参照する
ちなみに、Cloudformationを用いて置換や作成/削除を行う場合、基本的に新しいリソースを作ってから古いリソースを削除します。