CloudFormation で EC2 のセキュリティグループの変更を実施した際に EC2 の置き換えが発生する場合の対処方法

AWS::EC2::Instance の NetworkInterface プロパティに変更が加えられるとリソースの置き換えが行われるため、そのサブプロパティである GroupSet も変更が行われるとリソースの置換が発生します。
2022.01.26

困っていた内容

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 インスタンスの置き換えは発生しない認識でしたが、実際にスタックを作成してみて勉強になりました。

参照