AWS ECS:在 ECR 中强制重新部署新的最新映像
Posted
技术标签:
【中文标题】AWS ECS:在 ECR 中强制重新部署新的最新映像【英文标题】:AWS ECS: Force redeployment on new latest image in ECR 【发布时间】:2020-06-05 02:21:38 【问题描述】:我知道在这个方向上已经有无数的问题,但遗憾的是我还没有找到正确的答案。如果帖子已经存在,请在此处分享链接。
我有几个 gitlab CI/CD 管道。第一个管道使用 Terraform 为基于 Fargate 的 ECS 集群构建完整的基础架构。第二/第三个管道创建前端和后端的夜间构建,并将带有“最新”标签的 Docker 映像推送到(暂存)AWS 账户的 ECR。
我现在想要实现的是重新部署相应的ECS任务,以便使用最新的Docker镜像。我实际上认为有一种方法可以通过 CloudWatch Events 或其他方式做到这一点,但我在这里找不到一个很好的起点。一种解决方法是在 CI / CD 管道中安装 AWS CLI,然后使用“强制新部署”进行服务更新。但这对我来说似乎不是很优雅。这里有更好的方法吗?
条件:
解决方案必须完全自动化(在 AWS 或 gitlab CI/CD 中) 切换到 AWS CodePipeline 不在讨论范围内 最好尽可能接近 AWS 标准。由于可维护性,我想避免执行大量操作的大量 lambda 函数。非常感谢!
【问题讨论】:
【参考方案1】:好的,适合所有对答案感兴趣的人。我是这样解决的: 我在 CICD 管道中执行以下 AWS CLI 命令
aws ecs update-service --cluster <<cluster-name>> --service <<service-name>> --force-new-deployment --region <<region>>
不是我正在寻找的解决方案,但它有效。
【讨论】:
--force-new-deployment
如果标签相同,则不会提取更新的图像
不错的反对票。它现在正在工作。那么,我该怎么说呢? AWS CLI documentation 说:如果您更新的 Docker 映像使用与您的服务的现有任务定义中相同的标签(例如, my_image:latest ),您不需要创建任务定义的新修订版。您可以使用 forceNewDeployment 选项更新服务。部署启动的新任务在启动时从您的存储库中提取当前图像/标签组合。
它可以工作,但是需要注意的是,使用 latest 标签来部署图像是一种反模式。例如:如果新图像有问题,则无法回滚,因为标签相同('最新')
是的,你是对的。这就是为什么它不支持开箱即用的原因。但有时你还是需要它。 :)【参考方案2】:
一般来说,不建议总是推送相同的容器标签,因为在失败的情况下回滚到以前的版本变得非常困难。
一个合适的选择是使用 git 标签。
假设您正在部署版本v0.0.1
您可以创建一个文件 app-version.tf
,其中将包含变量 backend-version = v0.0.1
,您可以在 ecs 服务的任务定义中引用该变量。
使用git describe
可以为容器创建做同样的事情。
因此,您可以为每个 git 标签获得一个新的任务定义,并且只需更改 terraform 配置中的值即可回滚。
【讨论】:
是的,我知道这一点。这个想法是,所有开发分支都可以使用图像标签dev-123
进行部署。这个分支可以处于任何状态。但是一旦它被合并到主控中,它就是一个可交付的增量并通过了所有测试用例等。主控可以但不必是下一个版本。因此它将获得登台系统的最新标签。仅当当前主服务器带有版本标签时,例如。 G。 v.0.2.4 它将被标记为特定版本,并将自动部署到 prod(而不是)stage。我不想为每晚管理一个版本。【参考方案3】:
使用摘要或唯一immutable tags 引用图像是有益的。管道推送镜像后,它可以:
-
获取图片的摘要/唯一标签
创建任务定义的新修订版
使用新任务定义触发 ECS 部署。
正如 sgramo93 所提到的,最大的好处是可以通过部署任务定义的旧版本来回滚您的应用程序。
【讨论】:
以上是关于AWS ECS:在 ECR 中强制重新部署新的最新映像的主要内容,如果未能解决你的问题,请参考以下文章
Github 操作将 docker 部署到 AWS ECS ECR
Docker 容器在使用 AWS ECR 的 AWS ECS 中不起作用