gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:24:06 27 4
gpt4 key购买 nike

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

除了这些之外,它还创建一个包含 ECS 服务和初始任务定义的 ECS 集群:

Resources:
# ...snip...
Cluster:
Type: AWS::ECS::Cluster
Properties:
ClusterName: !Sub 'cluster-${Environment}'
APITaskDefinition:
Type: AWS::ECS::TaskDefinition
DependsOn:
- APIExecutionRole
Properties:
Family: !Sub 'api-${Environment}'
Cpu: 512
Memory: 1024
ExecutionRoleArn: !Ref APIExecutionRole
NetworkMode: awsvpc
RequiresCompatibilities:
- FARGATE
ContainerDefinitions:
# ...snip...
APIService:
Type: AWS::ECS::Service
DependsOn:
- LoadBalancerListenerApiHttps
- TargetGroupApi
Properties:
ServiceName: !Sub 'service-${Environment}-api'
Cluster: !Ref Cluster
TaskDefinition: !Ref APITaskDefinition
LaunchType: FARGATE
DeploymentConfiguration:
MinimumHealthyPercent: 100
MaximumPercent: 200
DesiredCount: 1
EnableECSManagedTags: true
PropagateTags: SERVICE
# ...snip...

上述模板将服务的任务定义设置为初始/占位符任务,但是创建环境后,我们将应用程序的新版本部署到 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

CloudFormation 将解析模板部署上的 SSM 参数值。

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

关于aws-cloudformation - 如何在不更新 ECS 服务任务定义的情况下更新 CloudFormation 堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62686842/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com