AMI パブリックパラメータを使ったEC2インスタンス含むCloudFormationスタック更新時に、たまにインスタンスが再作成される件について調べた
データ事業本部の鈴木です。
以前の話ですが、AMIパブリックパラメータを指定したEC2インスタンス含むCloudFormationスタックを更新する際に、たまにインスタンスが再作成されることがありました。
頭の片隅にずっと疑問が残っていたので改めて調べましたが、パブリックAMI IDの勉強になったのでご共有です。
結論としては、/aws/service/ami-amazon-linux-latest
SSMパラメータ値を使って最新の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_64
AMI パブリックパラメータを使っていました。
常にあると課金が発生するためEnableGatewayEndpoints
パラメータでインターフェース型エンドポイントは削除・再作成できるようにしていました。
AMIパブリックパラメータについて
Amazon Linux2023などのAMIは、最新のAMI IDをパブリックなパラメータから取得できます。
先のCloudFormationテンプレートでは、/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64
パラメータから、AWS::SSM::Parameter
リソースでAMI IDを取得していました。
コンソールからは例えば以下のように確認できました。
このパラメータはAmazon Linux 2023 AMI(64 ビット (x86), uefi-preferred)の最新の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)でインスタンスへの不正アクセスを防ぐよう適切に設定した上でパブリックサブネットに立ててしまうのも手かもしれません。
同じような事象が起きて不思議に思っている方の参考になりましたら幸いです。
そのた参考資料
- マネジメントコンソールの AMI 選択画面から確認できない古いバージョンの RHEL AMI から EC2 インスタンスを起動する方法 | DevelopersIO
- describe-images — AWS CLI 2.25.1 Command Reference
- 最新「じゃない」 AMI を AWS CLI で検索するまとめ | DevelopersIO
- [アップデート] カスタム AMI でブートモードに UEFI 優先モードを指定出来るようになりました | DevelopersIO
- Query for the latest Amazon Linux AMI IDs using AWS Systems Manager Parameter Store | AWS Compute Blog