【问题标题】:Referring to resources named with variables in Terraform在 Terraform 中引用以变量命名的资源
【发布时间】:2016-12-01 20:40:32
【问题描述】:

我正在尝试在 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}"
    }
}

我收到以下错误:

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

【问题讨论】:

    标签: terraform


    【解决方案1】:

    我从根本上误解了模块的工作原理。

    Terraform 不支持资源名称中的插值(请参阅relevantissues),但在我的情况下这并不重要,因为模块的每个实例的资源都在实例的命名空间中。我担心资源名称冲突,但模块系统已经处理了。

    【讨论】:

    • 另外,显然你不能插入资源名称。 (还没有?)
    • 就目前而言,对于其他有类似问题的人来说,这不是一个有用的答案。我建议您修改答案以解释错误发生的原因以及如何修复它(特别关注您无法插入资源名称的事实)或删除问题/答案组合。
    • @ydaetskcoR,好电话。我已经更新了我的答案以澄清,但如果它对其他人没有用,我也可以删除这个问题/答案组合。
    • 我发现这很有用。特别感谢您指出相关资源
    • 这个问答对我也有帮助。我正在尝试做同样的事情并意识到它无法完成。
    【解决方案2】:

    下图显示了发生了什么。

    terraform 文档没有明确说明它们对 "NAME" 的使用与用于基础设施供应商创建的实际资源的 "name" 值(例如、AWS 或谷歌云)。

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

    还有几种方法可以生成多个 "name" 值——使用计数、变量等,或者在 tfvar 文件中并运行 terraform apply -var-file= foo.tfvars

    【讨论】:

      猜你喜欢
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2022-06-22
      • 2018-08-01
      • 2022-01-21
      • 2019-10-05
      相关资源
      最近更新 更多