AWS ECS:在 ECR 中强制重新部署新的最新图像
AWS ECS: Force redeployment on new latest image in ECR
我知道在这个方向上已经有无数的问题,但遗憾的是我还没有找到正确的答案。如果 post 已经存在,请在这里分享 link。
我有几个 gitlab CI / CD 管道。第一条管道使用 Terraform 为基于 Fargate 的 ECS 集群构建完整的基础设施。第二个/第三个管道创建前端和后端的夜间构建,并将带有标签 "latest" 的 Docker 图像推送到(暂存)AWS 帐户的 ECR 中。
我现在想实现的是重新部署对应的ECS任务,使用最新的Docker镜像。我实际上认为有一种方法可以通过 CloudWatch Events 或其他任何方式来执行此操作,但我在这里找不到一个很好的起点。解决方法是在 CI / CD 管道中安装 AWS CLI,然后使用 "force new deployment" 进行服务更新。但这对我来说似乎不太优雅。这里有没有更好的方法?
条件:
- 解决方案必须完全自动化(AWS 或 gitlab CI / CD)
- 切换到 AWS CodePipeline 不在讨论范围内
- 最好尽可能接近 AWS 标准。由于其可维护性,我想避免执行大量操作的大量 lambda 函数。
非常感谢!
作为一般性评论,不建议始终推送相同的容器标记,因为在出现故障时回滚到以前的版本会变得非常困难。
一个合适的选择是使用 git 标签。
假设您正在部署版本 v0.0.1
您可以创建一个文件 app-version.tf
,其中将包含您可以在 ecs 服务的任务定义中引用的变量 backend-version = v0.0.1
。
使用 git describe
.
可以为容器创建做同样的事情
因此,您会为每个 git 标记获得一个新的任务定义,并且只需更改 terraform 配置中的值即可回滚。
使用摘要或唯一 immutable tags 来引用图像是有益的。管道推送图像后,它可以:
- 获取图片的 digest/unique 标签
- 创建任务定义的新修订
- 使用新任务定义触发 ECS 部署。
正如 sgramo93 所提到的,最大的好处是可以通过部署任务定义的旧版本来回滚您的应用程序。
好的,给所有对答案感兴趣的人。我是这样解决的:
我在 CICD 管道中执行以下 AWS CLI 命令
aws ecs update-service --cluster <<cluster-name>> --service <<service-name>> --force-new-deployment --region <<region>>
不是我正在寻找的解决方案,但它有效。
我知道在这个方向上已经有无数的问题,但遗憾的是我还没有找到正确的答案。如果 post 已经存在,请在这里分享 link。
我有几个 gitlab CI / CD 管道。第一条管道使用 Terraform 为基于 Fargate 的 ECS 集群构建完整的基础设施。第二个/第三个管道创建前端和后端的夜间构建,并将带有标签 "latest" 的 Docker 图像推送到(暂存)AWS 帐户的 ECR 中。
我现在想实现的是重新部署对应的ECS任务,使用最新的Docker镜像。我实际上认为有一种方法可以通过 CloudWatch Events 或其他任何方式来执行此操作,但我在这里找不到一个很好的起点。解决方法是在 CI / CD 管道中安装 AWS CLI,然后使用 "force new deployment" 进行服务更新。但这对我来说似乎不太优雅。这里有没有更好的方法?
条件:
- 解决方案必须完全自动化(AWS 或 gitlab CI / CD)
- 切换到 AWS CodePipeline 不在讨论范围内
- 最好尽可能接近 AWS 标准。由于其可维护性,我想避免执行大量操作的大量 lambda 函数。
非常感谢!
作为一般性评论,不建议始终推送相同的容器标记,因为在出现故障时回滚到以前的版本会变得非常困难。
一个合适的选择是使用 git 标签。
假设您正在部署版本 v0.0.1
您可以创建一个文件 app-version.tf
,其中将包含您可以在 ecs 服务的任务定义中引用的变量 backend-version = v0.0.1
。
使用 git describe
.
因此,您会为每个 git 标记获得一个新的任务定义,并且只需更改 terraform 配置中的值即可回滚。
使用摘要或唯一 immutable tags 来引用图像是有益的。管道推送图像后,它可以:
- 获取图片的 digest/unique 标签
- 创建任务定义的新修订
- 使用新任务定义触发 ECS 部署。
正如 sgramo93 所提到的,最大的好处是可以通过部署任务定义的旧版本来回滚您的应用程序。
好的,给所有对答案感兴趣的人。我是这样解决的: 我在 CICD 管道中执行以下 AWS CLI 命令
aws ecs update-service --cluster <<cluster-name>> --service <<service-name>> --force-new-deployment --region <<region>>
不是我正在寻找的解决方案,但它有效。