Terraform无法按索引引用资源

Terraform无法按索引引用资源,terraform,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

我有一个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

您需要使用适当的语法来引用列表中的特定元素。您可以查看文档。请特别注意提及以下内容的章节:

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

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

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表示资源输出是一个列表,而不是一个元素类型。

您需要使用正确的语法来引用列表的特定元素。您可以查看文档。请特别注意提及以下内容的章节:

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

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

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表示资源输出是一个列表,而不是一个元素类型。

我认为值得注意的是,原始问题中显示的语法对于Terraform 0.12及更高版本是有效的(并且是首选的),但不适用于Terraform 0.11。我认为值得注意的是,原始问题中显示的语法适用于Terraform 0.12及更高版本,但不适用于Terraform 0.11。