【问题标题】:How to manage automatic deployment to ECS using Terraform Cloud and CircleCI?如何使用 Terraform Cloud 和 CircleCI 管理到 ECS 的自动部署?
【发布时间】:2022-07-17 17:11:29
【问题描述】:

我有一个 ECS 任务,它有 2 个容器,使用 2 个不同的图像,都托管在 ECR 中。这两个图像有 2 个 GitHub 存储库(appapi),我的 IaC 代码有第三个存储库(infra)。我正在使用 Terraform Cloud 管理我的 AWS 基础设施。 ECS 任务定义使用 Cloudposse 的ecs-alb-service-task 定义,容器使用ecs-container-definition 定义。目前我在 Terraform 中定义的任务定义中使用latest 作为图像标签。

当我将更改推送到 GitHub 时,我正在使用 CircleCI 构建 Docker 容器。我用latest 和变量${CIRCLE_SHA1} 标记每个图像。两个存储库还使用aws-ecs orb 的deploy-service-update 作业更新任务定义,将每个容器映像使用的标签设置为SHA1(不是latest)。示例:

          container-image-name-updates: "container=api,tag=${CIRCLE_SHA1}"

当我将代码推送到存储库时,例如api,创建新版本的任务定义,更新服务的版本,并使用新版本重新启动现有任务。到目前为止一切顺利。

问题是,当我使用 Terraform 更新基础架构时,服务的行为与我预期的不同。 ecs-alb-service-task 有一个名为 ignore_changes_task_definition 的布尔值,默认为 true

  • 当我将其保留为 true 时,每当我将更改应用于任务定义时,Terraform Cloud 都会成功创建一个新版本。 (最近的一个例子是更新环境变量。)但是它不会更新服务使用的版本,所以服务继续使用旧版本。即使我停止任务,它也会使用旧版本重新生成。我必须手动进入并使用更新流程,或将更改推送到代码库之一。然后 CircleCI 将创建另一个版本的任务定义并更新服务。

  • 如果我改为将其设置为 false,Terraform Cloud 将撤消更改对 CircleCI 执行的服务。它会将任务定义版本重置为它自己创建的最后一个版本!

所以我有三个问题:

  1. 如何让 Terraform 与 CircleCI 创建的任务定义很好地配合使用,同时如果我通过 Terraform 更改它,还更新服务本身?

  2. 从三个不同的地方更改任务定义是否有问题?

  3. Terraform中图片标签为latest是不是有问题(因为我不知道SHA1是什么)?

非常感谢有关如何正确设置此 CI 流程的指导。我几乎没有在网上找到关于如何将 Terraform Cloud 与 CI 产品一起使用的信息。

【问题讨论】:

  • 我相信有很多关于将 TFCloud 与管道平台集成的信息,我已经与 JP、Circle、Travis、Concourse、GLCI、GH Actions 和 CodeBuild 一起完成了,所以它绝对是可能的。我相信这里的主要困难是 TF+ECS 集成。您可能会发现使用应用程序部署工具而不是基础设施供应商来部署到管道中的 ECS 会更容易。
  • 感谢您的回复!这是我在 SO 上看到的关于 TFC/CircleCI/AWS 的 2 个问题中的 1 个,我发现的唯一其他资源是 this series,它使用 k8s、GCP 和代码/IaC monorepo,所以我没能应用它。如果您知道任何其他资源,我很想听听!大多数示例使用 TF 而不是 TFC。您能解释一下与“基础设施供应商”不同的“应用程序部署工具”是什么意思吗?你的意思是我会停止使用 TFC 来完全管理服务吗? (我应用了安全组、IAM 角色等,所以这似乎不切实际?)
  • TF 可以很好地管理 ECS,但不一定要部署到它。在 k8s 中,人们会为此使用 Helm、运算符、Ansible 等。我不确定 ECS 存在哪些选项,但类似的东西(或者在 Ansible 的情况下可能相同)可能更容易。
  • 我在多个项目中使用 Terraform 进行 ECS 部署没有问题。我不确定为什么有人会说它不适合这项任务。现在,如果您想要蓝绿部署,或带有回滚的滚动部署,您将需要更复杂的部署工具,例如 AWS CodeDeploy,但如果您只是尝试通过更新 ECS 任务定义和更新 ECS 来发布最新的 docker 容器服务使用新的任务定义,然后 Terraform 工作得很好。
  • 我已经成功使用 CircleCI 部署了这两个容器。当 TFC 坚持保留任务定义的过时版本,或者在我进行了创建新任务定义的更改时拒绝更新服务时,我只是遇到了麻烦。我的设置是 TFC 应该与 CircleCI 一起使用的方式吗?

标签: amazon-web-services terraform amazon-ecs circleci


【解决方案1】:

我对这个问题有了更多了解。似乎正确的解决方案是使用 CircleCI 工作流来管理 Terraform Cloud,而不是让这两个服务有效地相互竞争。默认情况下,Terraform Cloud 将期望您将一个 repo 与其链接,并且每次推送时它都会自动计划。但是您可以关闭它并 use the terraform orb 改为通过 CircleCI 运行计划/应用。

您仍然会将ignore_changes_task_definition 设置为true。相反,您将在 terraform/apply 步骤进行更改后向工作流添加另一个步骤。这将是aws-ecs/run-task,它应该使用最新的任务定义重新启动服务,该任务定义(可能)刚刚由上一步创建。 (参见task-definition 参数。)

我认为这对我来说不值得,至少目前不值得。 Terraform Cloud 和 CircleCI 之间的冲突很烦人,但并没有那么严重。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 2019-04-29
    • 2019-05-19
    • 2021-11-14
    • 2021-06-16
    • 1970-01-01
    相关资源
    最近更新 更多