AMI パブリックパラメータを使ったEC2インスタンス含むCloudFormationスタック更新時に、たまにインスタンスが再作成される件について調べた

AMI パブリックパラメータを使ったEC2インスタンス含むCloudFormationスタック更新時に、たまにインスタンスが再作成される件について調べた

/aws/service/ami-amazon-linux-latest AMIパブリックパラメータからは該当する最新のAMI IDが取得されます。
Clock Icon2025.03.24

データ事業本部の鈴木です。

以前の話ですが、AMIパブリックパラメータを指定したEC2インスタンス含むCloudFormationスタックを更新する際に、たまにインスタンスが再作成されることがありました。
頭の片隅にずっと疑問が残っていたので改めて調べましたが、パブリックAMI IDの勉強になったのでご共有です。

結論としては、/aws/service/ami-amazon-linux-latestSSMパラメータ値を使って最新のAMI IDを指定し、インスタンスを作成していたため、新しいAMIがリリースされてパラメータに設定されていたAMI IDが変わったときに、インスタンスが再作成されていたようです。

起きていたこと

Conditions構文を使って、CloudFormationスタックのパラメータを変えるとVPCエンドポイントを作成したり削除したりできるようなEC2インスタンスを含む検証用リソースを用意していたのですが、少し時間を開けてから検証を再開する際にVPCエンドポイントを作成すると、スタック内のEC2インスタンスも新しいものが作成されてしまう、という現象でした。

例えば以下のようなテンプレートです。

# 〜(省略)〜

Conditions:
  EnableGatewayEndpoints:
    !Equals [true, !Ref EnableGatewayEndpoints]

Resources:

  # 〜(省略)〜

  # AMIは最新のAMI IDをパラメータストアから取得する
  Ec2ImageId:
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64

  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: !Ref Ec2InstanceType
      SubnetId: !Ref PrivateSubnet
      ImageId: !Ref Ec2ImageId
      SecurityGroupIds:
        - !Ref EC2SecurityGroup
      IamInstanceProfile: !Ref EC2InstanceProfile
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeSize: 50
            VolumeType: gp3
      EbsOptimized: true
      SourceDestCheck: true
      KeyName: !Ref KeyPair
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-EC2Instance

  # 常にあると課金が発生するため`EnableGatewayEndpoints`パラメータで削除・再作成できるようにしていた
  EndpointSSM:
    Type: AWS::EC2::VPCEndpoint
    Condition: EnableGatewayEndpoints
    Properties:
      PrivateDnsEnabled: true
      SecurityGroupIds:
        - !Ref EndpointSecurityGroup
      ServiceName: !Sub com.amazonaws.${AWS::Region}.ssm
      SubnetIds:
        - !Ref PrivateSubnet
      VpcEndpointType: Interface
      VpcId: !Ref VPC

EC2インスタンスは/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64AMI パブリックパラメータを使っていました。
常にあると課金が発生するためEnableGatewayEndpointsパラメータでインターフェース型エンドポイントは削除・再作成できるようにしていました。

AMIパブリックパラメータについて

Amazon Linux2023などのAMIは、最新のAMI IDをパブリックなパラメータから取得できます。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/parameter-store-public-parameters-ami.html

先のCloudFormationテンプレートでは、/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64パラメータから、AWS::SSM::ParameterリソースでAMI IDを取得していました。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html

コンソールからは例えば以下のように確認できました。

コンソールからのAMIの確認1

コンソールからのAMIの確認2

このパラメータはAmazon Linux 2023 AMI(64 ビット (x86), uefi-preferred)の最新のAMI IDです。

Amazon Linux 2023 AMIのAMI ID

過去のAMI IDも含めると以下のようにAWS CLIから検索できますが、確かに最新のものであることが分かります。

~ $ aws ec2 describe-images --owners amazon \
> --include-deprecated \
> --region ap-northeast-1 \
> --filters Name=name,Values=al2023-ami-2023*  Name=architecture,Values=x86_64 \
> --output text \
> --query 'reverse(sort_by(Images, &Name))[].[Name,ImageId,CreationDate]'
al2023-ami-2023.6.20250303.0-kernel-6.1-x86_64  ami-0599b6e53ca798bb2   2025-03-04T00:53:10.000Z
al2023-ami-2023.6.20250218.2-kernel-6.1-x86_64  ami-072298436ce5cb0c4   2025-02-20T21:31:58.000Z
al2023-ami-2023.6.20250211.0-kernel-6.1-x86_64  ami-02e5504ea463e3f34   2025-02-11T22:03:49.000Z
al2023-ami-2023.6.20250203.1-kernel-6.1-x86_64  ami-0a6fd4c92fc6ed7d5   2025-02-04T00:02:05.000Z
al2023-ami-2023.6.20250128.0-kernel-6.1-x86_64  ami-06c6f3fa7959e5fdd   2025-01-28T17:43:24.000Z
al2023-ami-2023.6.20250123.4-kernel-6.1-x86_64  ami-0b28346b270c7b165   2025-01-24T17:18:01.000Z
al2023-ami-2023.6.20250115.0-kernel-6.1-x86_64  ami-0fb04413c9de69305   2025-01-16T19:31:54.000Z
al2023-ami-2023.6.20250114.0-kernel-6.1-x86_64  ami-0525a3bbe44c34cbf   2025-01-13T21:36:43.000Z
al2023-ami-2023.6.20250107.0-kernel-6.1-x86_64  ami-08f52b2e87cebadd9   2025-01-07T22:48:30.000Z
al2023-ami-2023.6.20241212.0-kernel-6.1-x86_64  ami-0ab02459752898a60   2024-12-12T08:31:35.000Z

最後に

AMIパブリックパラメータを指定したEC2インスタンス含むCloudFormationスタックを更新する際に、たまにインスタンスが再作成されることがあったため、原因を調査しました。

今回はAMI IDにAMIパブリックパラメータを指定していて、かつ頻繁にCloudFormationスタックを変更するときの事象ですが、そういった場合にはVPCエンドポイントのスタックは別に分けておいた方が素直かもしれません。

また、こういった操作をする場合は基本的に検証用のインスタンスと思うので、以下のブログで紹介されているように、セキュリティグループやネットワークアクセスコントロールリスト(NACL)でインスタンスへの不正アクセスを防ぐよう適切に設定した上でパブリックサブネットに立ててしまうのも手かもしれません。

https://dev.classmethod.jp/articles/reduce-unnecessary-costs-for-nat-gateway/

同じような事象が起きて不思議に思っている方の参考になりましたら幸いです。

そのた参考資料

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.