我正在 ECS 中设置新服务并多次更新我的任务定义。当我这样做时,我需要编辑相应的服务并将版本更新到最新。
有没有办法在更新时使用其对应任务定义的最新版本自动更新 AWS 服务?
我正在 ECS 中设置新服务并多次更新我的任务定义。当我这样做时,我需要编辑相应的服务并将版本更新到最新。
有没有办法在更新时使用其对应任务定义的最新版本自动更新 AWS 服务?
答案是肯定的,但这是一个复杂的过程。我知道的最好方法是使用 CodePipeline 进行构建自动化,并让您的构建步骤生成一个新文件taskdef.json
和一个新appspec.yml
文件作为输出工件。
然后这些是部署步骤的输入。假设您已经设置了 CodeDeploy 应用程序,并且部署组链接到负载均衡器,那么您可以让 CodeDeploy 更新您的服务以使用新的任务定义。
然而,完成这项工作的关键是让生成新的代码appspec.yml
找到任务定义的当前修订号并将其加 1。
在不增加修订的情况下,即使它会创建新的修订,它也只会保留在任务 def 的旧版本上。
我已经使用 SDK 完成了这项工作,但我想您可以使用一些巧妙的 CLI 脚本和jq
. 例如,要查找最新版本的 taskdef:
aws ecs list-task-definitions --family-prefix <taskdef-family> --query 'taskDefinitionArns[-1]'
从那里增加修订号并构建appspec.yml
包含 taskdef 的“下一个”修订的新版本并不远。
强制 ECS 服务重新评估任务定义并拉取新的容器镜像。利用
aws ecs update-service --cluster cluster_name --service service_name --force-new-deployment
我想你在这里有几个选择。第一个是,根据您更新任务定义的方式(手动?通过管道?),您可以force-new-deployment
在任务更新调用之后对服务调用进行排队。
如果这是不可能的(出于某种原因),但您需要自动执行此操作,您可能需要查看利用 Event Bridge 来创建规则来拦截您正在进行的更新任务定义 api 调用,然后调用 Lambda代表您执行“强制新部署”。