AWS ECS任务定义更新

3

我正在ECS中设置新服务,并已多次更新任务定义。这样做时,我需要编辑相应的服务并将版本更新到最新版。

是否有一种方式可以在更新时自动使用最新的任务定义更新AWS服务?

3个回答

1
答案是肯定的,但这是一个复杂的过程。我知道的最好方法是使用CodePipeline进行构建自动化,并让您的构建步骤生成一个新的taskdef.json和一个新的appspec.yml文件作为输出工件。
然后,这些将成为部署步骤的输入。假设您已经设置了一个CodeDeploy应用程序,其中包含链接到负载均衡器的部署组,那么您可以使用CodeDeploy更新您的服务以使用新的任务定义。
然而,使其正常工作的关键在于使生成新的appspec.yml代码找到当前任务定义的修订号并将其加1。
如果不增加修订版本,则它将仍然停留在旧版本的任务定义上,即使它会创建新的修订版本。
我使用SDK完成了这个过程,但我想您可以使用一些狡猾的CLI脚本和jq来完成。例如,要查找taskdef的最新版本:
aws ecs list-task-definitions --family-prefix <taskdef-family> --query 'taskDefinitionArns[-1]'

离这里增加修订号并构建新的appspec.yml以包含任务定义的“下一个”修订版本并不太远。


1

要强制ECS服务重新评估任务定义并拉取新的容器镜像,请使用

aws ecs update-service --cluster cluster_name --service service_name --force-new-deployment


谢谢,但我仍然需要手动执行这个命令行。我实际上正在考虑自动化它。 - Shams Larbi
如果您要手动更新服务以使用__最新任务定义版本__,则需要添加任务定义系列名称: aws ecs update-service --cluster cluster-name --service service-name --task-definition task-definition-family-name --force-new-deployment - hmartos

1
我认为你有几个选择。第一个选择是,根据你如何更新任务定义(手动?通过管道?),你可以在任务更新调用后为服务排队force-new-deployment调用。
如果这不可行(由于某些原因),但你仍需要自动化此过程,则可能需要考虑利用事件桥,在那里你将创建一个规则来拦截你正在进行的更新任务定义API调用,然后调用一个Lambda代表你执行“强制新部署”。

我想要更改容器环境中的 { "name": "DB_USE_SSL", "value": "true" },有任何使用 AWS CLI 的想法吗? - Ashish Karpe
变量是任务和任务定义的属性(而不是服务的属性)。我认为你已经通过“我已经多次更新了我的任务定义”这部分涵盖了这一部分。当你运行 aws ecs register-task-definition 命令时,基本上需要将这些变量添加到任务定义中。 - mreferre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接