Terraform正在更新众多ECS服务/任务之一

Terraform正在更新众多ECS服务/任务之一,terraform,amazon-ecs,terraform-provider-aws,aws-fargate,Terraform,Amazon Ecs,Terraform Provider Aws,Aws Fargate,星期五快乐!希望有人能帮我解决这个问题,或者指出我思维中的缺陷 $terraform--版本 地形v0.12.7 +provider.aws v2.25.0 +provider.template v2.1.2 前言 这是我第一次使用Terraform。我们有一个现有的AWS ECS/Fargate环境正在启动和运行,这是一个“测试”环境。我们最近(例如,在设置测试环境后)开始将Terraform用于IaC目的 当前配置 该环境只有一个ECS集群,我们使用FARGATE,但我不确定这对这个问题是

星期五快乐!希望有人能帮我解决这个问题,或者指出我思维中的缺陷

$terraform--版本
地形v0.12.7
+provider.aws v2.25.0
+provider.template v2.1.2
前言 这是我第一次使用Terraform。我们有一个现有的AWS ECS/Fargate环境正在启动和运行,这是一个“测试”环境。我们最近(例如,在设置测试环境后)开始将Terraform用于IaC目的

当前配置 该环境只有一个ECS集群,我们使用FARGATE,但我不确定这对这个问题是否重要。集群有多个服务,每个服务都有一个与之关联的任务(docker映像),因此它们可以单独扩展。每个docker映像都有自己的回购协议

我想做什么 所以我希望通过Terraform能够创造、更新和破坏环境。然而,创建/销毁似乎相当直截了当;我遇到了更新的障碍

正如我所说的,每个任务都有自己的repo,当针对repo发出拉请求时,我们的CI平台(CircleCI,如果有必要)构建新的docker映像,标记它并推送它。然后,我们使用一个API调用来触发Terraform Repo的构建,传递已更新的服务/任务的名称

问题 我们面临的问题是,在浏览服务(如下所述)时,我不知道如何让Terraform忽略未更新的服务,或者如何在aws_ecs_任务_定义中提供正确的容器_定义,特别是当前图像标记(我们不使用)。因此,我试图弄清楚如何获取最新的容器信息(标签),或者只是告诉Terraform跳过未修改的任务

地形文字 这是我尝试过的一个精简版本,它位于一个名为ecs.tf的模块中,var.ecs_svc_name是服务名称的列表。我已经删除了一些元素,因为我认为它们与这个问题无关,拥有它们会使问题变得非常严重

警告 由于我要问的问题,我没有运行如下所示的Terraform“script”,因此我的语法可能有问题。对不起,如果是这样的话,希望这能告诉你我在做什么

ecs.tf

data.tf

我没有发布JSON文档,如果您需要,我可以提供它


谢谢

有必要在任务定义修订版的容器定义中传递更新的图像属性

您可以
数据源
服务使用的当前任务修订版的容器定义,并将其传递给地形。您可以按照下面的代码操作

data "template_file" "example" {
  template = "${file("${path.module}/example.json")}"

  vars {
    image = "${data.aws_ecs_container_definition.example.image}"
  }
}

resource "aws_ecs_task_definition" "example" {
  family                = "${var.project_name}-${var.environment_name}-example"
  container_definitions = "${data.template_file.example.rendered}"
  cpu                   = 192
  memory                = 512
}

data "aws_ecs_container_definition" "example" {
  task_definition = "${var.project_name}-${var.environment_name}-example"
  container_name  = "example"
}

有必要在任务定义修订版的容器定义中传递更新的图像属性

您可以
数据源
服务使用的当前任务修订版的容器定义,并将其传递给地形。您可以按照下面的代码操作

data "template_file" "example" {
  template = "${file("${path.module}/example.json")}"

  vars {
    image = "${data.aws_ecs_container_definition.example.image}"
  }
}

resource "aws_ecs_task_definition" "example" {
  family                = "${var.project_name}-${var.environment_name}-example"
  container_definitions = "${data.template_file.example.rendered}"
  cpu                   = 192
  memory                = 512
}

data "aws_ecs_container_definition" "example" {
  task_definition = "${var.project_name}-${var.environment_name}-example"
  container_name  = "example"
}
data "template_file" "example" {
  template = "${file("${path.module}/example.json")}"

  vars {
    image = "${data.aws_ecs_container_definition.example.image}"
  }
}

resource "aws_ecs_task_definition" "example" {
  family                = "${var.project_name}-${var.environment_name}-example"
  container_definitions = "${data.template_file.example.rendered}"
  cpu                   = 192
  memory                = 512
}

data "aws_ecs_container_definition" "example" {
  task_definition = "${var.project_name}-${var.environment_name}-example"
  container_name  = "example"
}