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 中不起作用

CodePipeline:ECR 源 + ECS 部署配置

将新映像推送到 ECR 存储库时如何自动部署到 ECS Fargate

Docker 推送到 AWS ECR 问题

AWS ECS Fargate 从跨账户 ECR 存储库中提取映像