Terraform Route53解析器设置



刚刚尝试使用新的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].idaws_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

最新更新