この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
困っていた内容
CloudFormation で以下のテンプレートを使用して EC2 インスタンスを作成しました。
AWSTemplateFormatVersion: "2010-09-09"
Resources:
Test20220121Server:
Type: AWS::EC2::Instance
Properties:
ImageId: "ami-066333d9c572b0680"
InstanceType: t2.micro
NetworkInterfaces:
- DeviceIndex: "0"
SubnetId: subnet-21a*****
GroupSet:
- sg-6a9*****
- sg-075**************
その後、NetworkInterfaces プロパティ内の GroupSet にセキュリティグループを追加/削除してスタックのアップデートを実施したところ、 EC2 インスタンスの置き換え(新規インスタンスが作成され、既存インスタンスが削除される)が発生してしまいました。
EC2 インスタンスの置き換えを発生させずにセキュリティグループを追加/削除する方法はありますか。
どう対応すればいいの?
対応方法は2通りあります。
① セキュリティグループの追加/削除を行わずに、既存のセキュリティグループのルールを変更して対応する
運用的に問題がなく、変更が必要となるルールの数が少なければ、こちらの対応が楽かと思います。
② AWS::EC2::NetworkInterface と AWS::EC2::Instance を組み合わせてリソース作成をおこなう
AWS::EC2::NetworkInterface の GroupSet プロパティは変更を加えてもリソースの置換が発生しません。
GroupSet
The security group IDs associated with this network interface.
(省略)
Update requires: No interruption
そのため、以下のように AWS::EC2::NetworkInterface と AWS::EC2::Instance で分けてテンプレートを構成すると、後にセキュリティグループの変更が必要になった際に EC2 インスタンスの置き換えを避けることができます。
AWSTemplateFormatVersion: "2010-09-09"
Resources:
TestNetWorkInterface:
Type: AWS::EC2::NetworkInterface
Properties:
SubnetId: subnet-21a*****
GroupSet:
- sg-6a9*****
- sg-075**************
Test20220121Server:
Type: AWS::EC2::Instance
Properties:
ImageId: "ami-066333d9c572b0680"
InstanceType: t2.micro
NetworkInterfaces:
- DeviceIndex: '0'
NetworkInterfaceId:
!Ref TestNetWorkInterface
なぜ EC2 インスタンスの置き換えが発生するの?
AWS::EC2::Instance の NetworkInterface プロパティ を変更すると、リソースの置換が発生します。
NetworkInterfaces
The network interfaces to associate with the instance.
(省略)
Update requires: Replacement
それにより、AWS::EC2::Instance の NetworkInterface プロパティのサブプロパティである GroupSet を変更した場合も NetworkInterface プロパティの変更と見なされ、リソースの置換が発生します。
おわりに
AWS::EC2::Instance NetworkInterface のドキュメント では、GroupSet の更新は「No interruption」との記載があるため、EC2 インスタンスの置き換えは発生しない認識でしたが、実際にスタックを作成してみて勉強になりました。