如何管理使用Terraform Cloud和CircleCI自动部署到ECS ?



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

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

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

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

问题是,当我用Terraform更新基础设施时,服务的行为不像我期望的那样。ecs-alb-service-task有一个布尔值ignore_changes_task_definition,默认为true

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

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

我有三个问题:

  1. 我怎么能得到Terraform玩好与CircleCI创建的任务定义,同时也更新服务本身,如果我曾经通过Terraform改变它?

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

  3. 这是一个问题,图像标签是latest在Terraform(因为我不知道SHA1是什么)?

如果能给我一些关于如何正确设置这个CI流的指导,我将非常感谢。我在网上几乎找不到关于如何将Terraform Cloud与CI产品一起使用的信息。

我对这个问题有了更多的了解。似乎正确的解决方案是使用CircleCI工作流来管理Terraform Cloud,而不是让两个服务有效地相互竞争。默认情况下,Terraform Cloud会期望你链接一个回购与它,它会自动计划每次你推。但你可以关闭它,并使用地形球体,而不是通过CircleCI来运行plan/apply。

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

我已经决定这对我来说不值得努力,至少在这个时候不值得。Terraform Cloud和CircleCI之间的冲突很烦人,但并没有那么严重。

最新更新