首页 > 解决方案 > Terraform 无法通过索引引用资源

问题描述

我有一个这样的 aws 实例

resource "aws_instance" "an_instance" {
  count                       = "${var.instance_count}"
......
}

效果很好,但是当我添加这个片段时

resource "aws_ebs_volume" "on_host_1_1" {
  availability_zone = "${aws_instance.an_instance[1].availability_zone}"
  snapshot_id       = "snap-abcdca8ee59112345f"
  tags              = "${local.all_tags}"
}

我收到以下错误:

Error reading config for aws_ebs_volume[on_host_1_1]: parse error at 1:31: expected "}" but found "."

有什么想法有什么问题吗?

Terraform v0.11.14
+ provider.aws v2.25.0

标签: terraform

解决方案


您需要使用正确的语法来引用列表的特定元素。您可以在此处查看文档。特别注意提到的部分:

要引用资源的特定实例,您可以使用resource.foo.*.id[#]where#是实例的索引号。

因此,具有正确语法的资源将是:

resource "aws_ebs_volume" "on_host_1_1" {
  availability_zone = "${aws_instance.an_instance.*.availability_zone[1]}"
  snapshot_id       = "snap-abcdca8ee59112345f"
  tags              = "${local.all_tags}"
}

这会给你你想要的行为。之所以可行,是因为 splat 运算符*正确地向 Terraform 表明资源输出是一个列表,而不是单个元素类型。


推荐阅读