Terraform 是否公开 ECS 启动类型中使用的 EC2 实例的实例 ID?

Does Terraform expose the instance ID for an EC2 instance used in an ECS launch type?

我正在使用 EC2 启动类型将应用程序部署到 ECS 集群。我在这里取得了一些成功,并且在集群前面建立了一个负载均衡器,并且该实例可以很好地接收和响应流量。

对于一个单独的任务,我也在考虑能够单独处理实例,如果我有实例 ID,Terraform 允许我这样做,但我没有看到实例 ID 是其中之一aws_launch_configuration.

的数据输出

有没有办法提取 ECS 集群中使用的 EC2 实例的实例 ID?

您可以使用 aws_instance data source

在其中,您可以指定一些过滤器来检索任何 EC2 实例。

例如,假设您的启动配置(顺便说一句,您应该使用启动模板,它基本上是具有更多功能的“启动配置 v2”)为您的 ECS 容器实例分配了一些标签,其中之一是Name:ECSClusterX。了解这一点后,您可以通过以下方式检索所述 EC2 实例:

data "aws_instance" "ecs-instance" {
  filter {
    name   = "tag:Name"
    values = ["ECSClusterX"]
  }
}

然后您可以检索找到的实例的 ID,方法是:aws_instance.ecs-instance.id

就是这样,你已经准备好了!

如果您正在寻找在特定实例中启动任务,一个好的做法是使用属性。

在您的集群中,移至 ECS 实例 选项卡,然后 select 一个实例。如图所示打开 Actions 菜单并转到 View/Edit Attributes:

添加您的属性:

最后一步是在 Terraform 中配置任务定义。

resource "aws_ecs_task_definition" "component1" {
    ...
    placement_constraints {
      type = "memberOf"
      expression =  "attribute:deploy_type == standard"
    }
    ...
}

现在任务只会在匹配属性的实例中执行。

我使用 lambda 函数始终保持至少一个实例包含我需要的每个属性块。但是您可以使用不同的启动模板和不同的属性将实例集成到集群中。