使用 AWS CLI 更新 ECS 服务,避免 CFN 偏移

Update ECS service with AWS CLI avoiding CFN drift

提问人:LurenzZ 提问时间:11/16/2023 最后编辑:Mark BLurenzZ 更新时间:11/23/2023 访问量:33

问:

目前,我使用 resolve:ssm 通过 CFN 部署了 ECS 服务的第一个版本,以添加对容器映像标签和任务定义 ARN 的动态引用。然后,我在 Gitlab-ci 管道中使用 AWS cli 更新服务,这样我就可以避免大部分漂移问题,但不是全部。完全避免漂移的最佳方法是什么?我是否可以更新 SSM 上的参数(在本例中为 image 标签)并在 Gitlab 的作业中调用“aws sam deploy”?

我正在使用动态引用,因为我想避免在 gitlab 的作业中更新 CFN 模板,然后提交它

谢谢:)

amazon-web-services gitlab-ci aws-cloudformation amazon-ecs

评论


答:

0赞 sytech 11/17/2023 #1

您可以在 CFN 模板和工作流中结合使用静态值,以防止在应用导致服务更新的 cloudformation 更新时出现问题。

在 cloud-formation 模板中,图像标签仅定义为静态名称,就像环境名称一样,例如 //。这一点永远不会改变。devstagingproduction

通过 CICD 工作流程,构建新图像并使用唯一标签进行标记。该唯一标记用于更新服务。然后,在更新成功后,我们立即将 CFN 模板中使用的相同静态标签(例如 //)添加到 ECR 中的新映像中。devstagingproduction

因此,分步:

  1. 使用唯一标签构建镜像标签,推送到 ECR
  2. 使用新的映像标记创建新的任务定义并更新服务
  3. 等待业务稳定成功
  4. 将静态标记(CFN 模板中使用的标记)推送到刚刚成功部署的同一新映像

这具有以下重要影响:

  • 由于模板使用静态标记值,因此 CFN 永远不会认为它需要更新服务,因为标记更改。您的 CFN 变更集中永远不会有标签更改。
  • 通过确保 ECR 中 CFN 中使用的标记遵循服务上应用的当前映像,每当后续 CFN 更新发生因任何其他原因导致服务更新时,它将使用已在使用的相同映像。

如果您在部署工作流中更新参数,则这与 SSM 参数方法类似。

从技术上讲,仍然存在漂移(即:资源在当前已知 CFN 状态之外发生了变化),但是通过工作流可以缓解由该漂移引起的问题。

另一个完全避免偏移的选项是始终使用 CFN 更新服务,并且永远不要在 CFN 之外更新服务。