🙆

CloudFormationでEC2のインスタンスタイプをスタック更新時の不安

2024/02/25に公開

CloudFormationで構築したEC2インスタンスのインスタンスタイプを変更しようとした際に
少し考えたことがあったのでメモ。

背景

既存のEC2スタックを更新して、インスタンスタイプを変更しようとした

cfn-ec2-instancetype01

インスタンスタイプをスペックアップしていざ更新しようとした。

cfn-ec2-instancetype02

チェンジセットのReplacementがConditionalになっている。
通常、ただのインスタンスタイプ更新であればFalseになると思っていたが、置換されてしまうのかどうかが不安になった。

cfn-ec2-instancetype03

結論:インスタンスは基本置き換わらない

Replacementに関して、ドキュメントをあさってみると。以下のようなことが書いてあった

キー名が変わらない場合は、InstanceType プロパティに対する変更がもっとも大きな更新動作 (Conditionally) になります。したがって、Replacement フィールドは Conditionally です。CloudFormation によってインスタンスが置き換えられる条件を確認するには、InstanceType プロパティの更新動作をご参照ください。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-changesets-samples.html

キー名(Logical ID)が変わる場合は必ずReplacementが発生するが、そうでない場合はInstanceTypeプロパティの挙動次第で
インスタンスが置き換わるかどうかが決まるということらしい。
リンクをさらに深ぼると、InstanceTypeリソースについては、以下のような説明がある。

When you change your EBS-backed instance type, instance restart or replacement behavior depends on the instance type compatibility between the old and new types. An instance with an instance store volume as the root volume is always replaced. For more information, see Change the instance type in the Amazon EC2 User Guide.


EBSでバックアップされたインスタンス・タイプを変更した場合、インスタンスの再起動または置換の動作は、新旧のインスタンス・タイプの互換性に依存します。ルートボリュームとしてインスタンスストアボリュームを持つインスタンスは、常に置き換えられます。詳細については、『Amazon EC2ユーザーガイド』の「インスタンスタイプの変更」を参照してください。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-instance.html#cfn-ec2-instance-instancetype

ルートボリュームをインスタンスストアボリュームとして利用していなければ、置換されることはないということらしい。
今時のインスタンスタイプは、全部デフォルトでEBSボリュームで作成されるはずなので、まず気にする必要はないのかなと思う。

そもそもインスタンスストアとは?

EC2のルートボリュームの生成方法には、EBS-backedInstance store-Backedの2タイプがある。

EBS-backedを使用するインスタンスは、EBSボリュームという外部ストレージを使ってルートボリュームを作成し、インスタンス起動時にそのEBSボリュームに自動アタッチしてくれる。
外部ストレージに保管しているので、インスタンスが停止してもデータはそのまま残る。

cfn-ec2-instancetype04
AWS公式ドキュメントより拝借

Instance store-Backedを使用するインスタンスは、インスタンス上にルートボリュームを作成し保管する方法。
インスタンス上に保存されるので、インスタンスが止まれば、ルートボリューム上のデータも削除される。

cfn-ec2-instancetype05
公式ドキュメントより拝借

Instance store-Backedインスタンスを使用できるインスタンスタイプは限られている

インスタンスストアボリュームをルートボリュームとしてサポートするインスタンスタイプは C3、D2、G2、I2、M3、および R3 のみです。

詳細は以下ドキュメント参照

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/RootDeviceStorage.html

今はEBS上でルートボリュームを作成するのがデフォルト動作で、インスタンスストアボリュームを使うメリットはないと思う。
基本気にせずにインスタンスタイプを変更しても問題はなさそう。

まとめ

Replacement: Conditionalの際は、Conditionalとなっているプロパティを調べる

Discussion