Amazon cloudformation 如何在不更新ECS服务任务定义的情况下更新CloudFormation堆栈

Amazon cloudformation 如何在不更新ECS服务任务定义的情况下更新CloudFormation堆栈,amazon-cloudformation,amazon-ecs,Amazon Cloudformation,Amazon Ecs,我有一个CloudFormation堆栈,它支持我们应用程序的整个环境(包括VPC、子网、安全组、角色、lambda函数、负载平衡器、S3存储桶和CloudFront分发版) 除此之外,它还创建了一个ECS集群,其中包含一个具有初始任务定义的ECS服务: 资源: #…剪断。。。 集群: 类型:AWS::ECS::集群 特性: 俱乐部名称:!子“群集-${Environment}” APITASK定义: 类型:AWS::ECS::TaskDefinition 德彭森: -APIExecutionR

我有一个CloudFormation堆栈,它支持我们应用程序的整个环境(包括VPC、子网、安全组、角色、lambda函数、负载平衡器、S3存储桶和CloudFront分发版)

除此之外,它还创建了一个ECS集群,其中包含一个具有初始任务定义的ECS服务:

资源:
#…剪断。。。
集群:
类型:AWS::ECS::集群
特性:
俱乐部名称:!子“群集-${Environment}”
APITASK定义:
类型:AWS::ECS::TaskDefinition
德彭森:
-APIExecutionRole
特性:
家庭:!子“api-${Environment}”
中央处理器:512
内存:1024
刽子手学习:!Ref APIExecutionRole
网络模式:awsvpc
要求符合性:
-法尔盖特
集装箱定义:
#…剪断。。。
APIService:
类型:AWS::ECS::服务
德彭森:
-LoadBalancerListenerApiHttps
-TargetGroupApi
特性:
服务名称:!子'service-${Environment}-api'
集群:!参考簇
任务定义:!参考APITaskDefinition
发射类型:远门
部署配置:
最低健康系数:100
最高消费率:200
期望计数:1
EnableECSManagedTags:true
传播标签:服务
#…剪断。。。
上面的模板将服务的任务定义设置为初始/占位符任务,但一旦创建了环境,我们就将应用程序的新版本部署到ECS(使用AWS CLI),这包括创建新的任务定义和更新ECS服务以使用新的任务定义

但是,当我对CloudFormation堆栈进行与ECS无关的更改(例如更改CloudFront分发版的一个属性)并创建更改集时,它总是会重置ECS服务以使用模板中定义的初始任务定义


在执行堆栈更新时,我是否可以告诉CloudFormation不要更新ECS服务?我已尝试使用堆栈策略阻止对服务的更新,但这只会导致整个更新操作失败。

将最新部署的映像引用存储在SSM参数存储中,并在成功部署后使用CLI部署过程更新此SSM参数

然后将SSM参数作为CloudFormation中的参数引用,例如

Parameters:
  ContainerDefaultImage:
    Type: AWS::SSM::Parameter::Value<String>
    Description: The name of the parameter containing the image definition file to be used.
    Default: /some/param/name
参数:
ContainerDefaultImage:
类型:AWS::SSM::参数::值
描述:包含要使用的图像定义文件的参数的名称。
默认值:/some/param/name
CloudFormation将解析模板部署上的SSM参数值


我使用这种技术允许在不同的环境中使用不同的容器版本,同时仍然使用相同的模板。我的容器是在不同的管道中构建和部署的,不同的环境有不同的版本用于测试、UAT等。

在更新之前,您能执行漂移检测吗?也许
!Ref APITaskDefinition
指向服务当前运行的不同任务定义版本?@Marcin是的。CloudFormation模板任务定义指向用于设置新环境的初始/占位符任务定义,但每次我们更新API时,服务本身都会得到一个新的任务定义。因此,您必须更新CFN tempate以反映更改,或者将ECS服务与主模板完全解耦。您可以将其保存在一个单独的模板中,以便在更新CF时不会对其进行更新。@Marcin Ok,所以基本上我无法对现有堆栈执行我试图执行的操作?我不知道有什么技术可以以另一种方式执行此操作。一般来说,您不应该在CFN之外更新您的ECS。因为您独立地更新服务,所以您有一个偏差。让我知道进展如何。如果能成功,我可以提供一个总结性的答案。