问题描述
我想对现有堆栈 (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
参数:InstanceImageId
、InstanceImageIdLatest
和一个条件 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
。