AWS CloudFormation の Amazon Elastic Block Store (Amazon EBS) ボリュームを更新したいです。しかし、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを置き換えることは避けたいです。
解決策
インスタンスの置換を防ぐには、CloudFormation で EBS ボリュームを更新する際に、AWS::EC2::Volume リソースタイプを使用することをおすすめします。
インスタンスの置換は、リソースタイプ AWS::EC2::Instance および AWS::EC2::Template の BlockDeviceMappings プロパティでボリュームを指定する際に発生します。このシナリオでは、retain DeletionPolicy 属性を追加する必要があります。
重要: gp2 から gp3 へのボリューム変更などで、手動でボリュームを変更する場合は、インスタンスにアタッチされているボリュームも変更する必要があります。インスタンスの状態が Optimizing または Modifying ではないことを確認します。ボリュームを gp3 に変更する前に、ボリューム変更の要件に準拠していることを確認してください。
BlockDeviceMappings プロパティで指定したボリュームを変更する際に、インスタンスの置換を防ぐには、次の手順を実行します。
ターゲットの AWS::EC2::Instance テンプレートリソースに retain DeletionPolicy 属性を追加する
次の手順を実行します。
-
ボリュームのスナップショットを取り、重要なワークロードのバックアップを作成します。
-
更新するボリュームのあるインスタンスの CloudFormation スタックで DeletionPolicy を Retain に設定します。例
AWSTemplateFormatVersion: '2010-09-09'
Resources:
Myinstance:
Type: AWS::EC2::Instance
DeletionPolicy: Retain
Properties:
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
VolumeType: gp2
VolumeSize: 10
DeleteOnTermination: true
EbsOptimized: false
ImageId: ami-064ff912f78e3e561
InstanceInitiatedShutdownBehavior: stop
InstanceType: t2.micro
Monitoring: false
-
スタックを更新します。
CloudFormation スタックからリソースを削除し、変更を実装する
次の手順を実行します。
- テンプレートからインスタンスを削除して CloudFormation スタックからインスタンスを削除します。ただし、基盤リソースは削除しません。次に、EC2 インスタンスを手動で変更します。
注: テンプレートにリソースが 1 つしかない場合は、別のインスタンスなどのスタンドインリソースを作成する必要があります。EC2 インスタンスをテンプレートにインポートし直した後は、テンプレートからリソースを削除できます。
- EBS ボリューム属性を変更します。
リソースを CloudFormation スタックに再度インポートする
次の手順を実行します。
-
CloudFormation コンソールを開きます。
-
ナビゲーションペインで [スタック] を選択します。
-
[スタックアクション] を選択し、[リソースをスタックにインポート] を選択します。
-
更新した CloudFormation テンプレートを入力します。例
AWSTemplateFormatVersion: '2010-09-09'
Resources:
Myinstance:
Type: AWS::EC2::Instance
DeletionPolicy: Retain
Properties:
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
VolumeType: gp3
VolumeSize: 100
DeleteOnTermination: true
EbsOptimized: false
ImageId: ami-064ff912f78e3e561
InstanceInitiatedShutdownBehavior: stop
InstanceType: t2.micro
Monitoring: false
注: リソースをインポートするには、CloudFormation テンプレートでは既存の構成を使用してリソースを記述する必要があります。
-
[識別子] にインスタンス ID を入力します。
-
[リソースをインポート] を選択します。
CloudFormation のステータスが IMPORT_COMPLETE に更新されると、インスタンスはスタックに所属しています。
次のエラーメッセージが表示される場合があります。There was an error creating this change set.As part of the import operation, you cannot modify or add [Outputs].この問題を解決するには、最新の CloudFormation テンプレートの Outputs セクションが、スタックが使用するテンプレートと一致していることを確認します。一致していない場合は、最新の CloudFormation テンプレートを更新し、スタックが使用するテンプレートの Outputs セクションの値と一致させます。その後、スタックを再度更新します。