Terraform无法按索引引用资源
我有一个aws的例子被这样挑战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
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。