刚刚尝试使用新的Terraform AWS_ROUTE53_RESOLVER_ENDPOINT。它将子网ID作为块类型列表。不幸的是,似乎没有办法从上一步的输出变量读取的子网列表中填充此内容。
基本上,我在上一步中使用了子网资源计数创建了一组子网。我试图使用这些并设置AWS_ROUTE53_RESOLVER_ENDPOINT中的每个子网:
resource "null_resource" "management_subnet_list" {
count = "${length(var.subnet_ids)}"
triggers {
subnet_id = "${element(data.terraform_remote_state.app_network.management_subnet_ids, count.index)}"
}
}
resource "aws_route53_resolver_endpoint" "dns_endpoint" {
name = "${var.environment_name}-${var.network_env}-dns"
direction = "OUTBOUND"
security_group_ids = ["${var.security_groups}"]
ip_address = "${null_resource.management_subnet_list.*.triggers}"
}
上述运行时,会导致错误: ip_address: should be a list
如果我修改代码如下:
ip_address = ["${null_resource.management_subnet_list.*.triggers}"]
我得到错误: ip_address: attribute supports 2 item as a minimum, config has 1 declared
我似乎无法从子网列表中动态创建资源列表的其他任何方法。
任何帮助将不胜感激。
根据AWS_ROUTE53_RESOLVER_ENDPOINT的资源参考,ip_address
块中的subnet_id
是一个单字符串值。
要指定多个子网,您需要具有多个ip_address
块。
由于您说您正在使用计数参数创建子网,因此您可以使用索引分别参考:aws_subnet.main[0].id
,aws_subnet.main[1].id
等,每个索引中的每个索引,每个索引都在其自己的ip_address
块中。(或对于Terraform 0.11,我认为是"${aws_subnet.main.0.id}"
。)
但是,更好的方法是使用Terraform 0.12
中可用的动态块动态块允许您在顶级块中创建可重复的嵌套块。(资源,数据,提供商和提供者块当前支持动态块)。
aws_route53_resolver_endpoint
资源中的动态ip_address
块看起来像:
dynamic "ip_address" {
for_each = aws_subnet.main[*].id
iterator = subnet
content {
subnet_id = subnet.value
}
}
这将导致在aws_subnet.main
资源中创建的每个子网的单独的ip_address
嵌套块。
for_each
参数是迭代的复杂值。它接受接受任何收集或结构值,通常是每个所需嵌套块的列表或映射。
有关动态嵌套块表达式的完整信息,请参见:https://www.terraform.io/docs/language/language/expressions/dynamic-blocks.html