Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
引用Terraform中使用变量命名的资源_Terraform - Fatal编程技术网

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

引用Terraform中使用变量命名的资源,terraform,Terraform,我试图在Terraform中创建一个模块,可以使用不同的变量输入多次实例化。在模块中,当资源的名称依赖于输入变量时,如何引用资源?我试图通过括号语法(“${aws\u ecs\u task\u definition[var.name].arn}”)来实现这一点,但我只是猜测而已 (警告:我可能会用完全错误的方式处理这个问题) 这是我的模块(简化)main.tf文件: variable "name" {} resource "aws_ecs_service" "${var.name}" {

我试图在Terraform中创建一个模块,可以使用不同的变量输入多次实例化。在模块中,当资源的名称依赖于输入变量时,如何引用资源?我试图通过括号语法(
“${aws\u ecs\u task\u 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不支持在资源名称中插入(请参阅),但在我的例子中这并不重要,因为模块的每个实例的资源都位于实例的名称空间中。我担心资源名称冲突,但模块系统已经处理了这一问题。

下图显示了发生的情况

terraform文档没有明确使用基础设施供应商(如AWS或谷歌云)创建的实际资源所使用的“名称”

此外,它并不总是“name=,但有时,比如说,“endpoint=,甚至是“resource\u group\u name=或其他什么

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


此外,显然您不能插入资源名称。(然而?)就目前的情况来看,这对其他任何有类似问题的人来说都不是一个有用的答案。我建议您要么重新编写答案,解释错误发生的原因以及如何修复它(特别关注您不能插入资源名称的事实)或者删除问题/答案组合。@ydaetskcoR,打得好。我已经更新了我的答案以澄清问题,但如果这个问题/答案组合对其他人没有用处,我也可以删除它。我发现这很有用。特别感谢您指向相关资源。这个问题和答案也帮助了我。我正在尝试做同样的事情,并重新考虑这是不可能的。