在堆栈 CREATE 的情况下获取最新的 AMI 并在堆栈更新的情况下保持相同的 AMI

问题描述

我想对现有堆栈 (UPDATE) 和新堆栈 (CREATE) 使用相同的 CloudFormation 模板。 我正在使用公共 SSM 参数存储来获取最新的 AMI:

Parameters:
  LatestAmiId:
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: /aws/service/ami-windows-latest/Windows_Server-2019-English-Full-Base

Resources:
  Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
    ImageId: !Ref LatestAmiId

问题是:当新的 AMI 发布时,我无法更新现有堆栈,因为它会尝试替换 EC2 资源,而且我无法将用于 LatestAmiId 参数的 AMI 传递给我。

我正在寻找一种解决方案,用于在堆栈 UPDATE 的情况下使用相同的 AMI,并在堆栈 CREATE 的情况下获取最新的解决方案。

解决方法

作为解决方法,可以使用两个 ImageId 参数:InstanceImageIdInstanceImageIdLatest 和一个条件 HasInstanceImageId

Parameters:
  InstanceImageId:
    Type : String
    Default: ''
  InstanceImageIdLatest:
    Type : 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: /aws/service/ami-windows-latest/Windows_Server-2019-English-Full-Base
Conditions:
  HasInstanceImageId: !Not [!Equals [!Ref 'InstanceImageId','']]
Resources:
  Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
    ImageId: !If [ HasInstanceImageId,!Ref InstanceImageId,!Ref InstanceImageIdLatest]

在堆栈 CREATE 的情况下,InstanceImageId 参数应为空,Instance 将使用 InstanceImageIdLatest 参数来解析最新的 AMI

在堆栈 UPDATE 的情况下,InstanceImageId 参数应该有一个当前正在使用的 AMI