引用Terraform中以变量命名的资源

Mik*_*tum 10 terraform

我正在尝试在Terraform中创建一个模块,可以使用不同的变量输入多次实例化.在模块中,当名称依赖于输入变量时,如何引用资源?我试图通过括号语法("${aws_ecs_task_definition[var.name].arn}")来做,但我猜对了.

(警告:我可能会以完全错误的方式解决这个问题)

这是我的模块(简化)main.tf文件:

variable "name" {}

resource "aws_ecs_service" "${var.name}" {
    name = "${var.name}_service"
    cluster = ""
    task_definition = "${aws_ecs_task_definition[var.name].arn}"
    desired_count = 1
}

resource "aws_ecs_task_definition" "${var.name}" {
    family = "ecs-family-${var.name}"
    container_definitions = "${template_file[var.name].rendered}"
}

resource "template_file" "${var.name}_task" {
    template = "${file("task-definition.json")}"

    vars {
        name = "${var.name}"
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Error loading Terraform: Error downloading modules: module foo: Error loading .terraform/modules/af13a92c4edda294822b341862422ba5/main.tf: Error reading config for aws_ecs_service[${var.name}]: parse error: syntax error
Run Code Online (Sandbox Code Playgroud)

Mik*_*tum 18

我从根本上误解了模块是如何工作的.

Terraform不支持​​资源名称中的插值(参见相关 问题),但在我的情况下这并不重要,因为模块的每个实例的资源都在实例的命名空间中.我担心资源名称冲突,但模块系统已经处理过.

  • 从目前的情况来看,这对于其他存在类似问题的人来说不是一个有用的答案。我建议您要么重做答案,以解释为什么发生错误以及如何纠正错误(尤其着眼于您无法插补资源名称这一事实),要么删除问题/答案组合。 (2认同)
  • 我发现这很有用.特别感谢您指出相关资源 (2认同)

war*_*ens 8

下图显示了正在发生的事情。

terraform 文档没有明确使用“NAME”与基础设施供应商(例如 AWS 或 Google Cloud)创建的实际资源所使用的“名称”值。

此外,它并不总是“name=”,但有时,例如“endpoint=”甚至“resource_group_name=”或其他。

有几种方法可以生成多个“名称”值 - 使用计数、变量等,或者在 tfvar 文件内并运行terraform apply -var-file=foo.tfvars

地形资源