Terraform 地形资源\u aws\u vpc\u端点Dns列表为空

Terraform 地形资源\u aws\u vpc\u端点Dns列表为空,terraform,amazon-vpc,terraform-provider-aws,Terraform,Amazon Vpc,Terraform Provider Aws,我正在使用terraform 0.12并尝试将vpc端点设置到另一个vpc。当我尝试设置alias route 53记录时,我总是收到一条错误消息,指示dns_条目为空列表。我错过了一些明显的东西。如果我随后重新执行apply,它将填充DNS条目而不会出现问题 resource "aws_vpc_endpoint" "endpoint" { vpc_id = "${local.vpc_id}" service_name = "${var.service_e

我正在使用terraform 0.12并尝试将vpc端点设置到另一个vpc。当我尝试设置alias route 53记录时,我总是收到一条错误消息,指示dns_条目为空列表。我错过了一些明显的东西。如果我随后重新执行apply,它将填充DNS条目而不会出现问题

resource "aws_vpc_endpoint" "endpoint" {
  vpc_id            = "${local.vpc_id}"
  service_name      = "${var.service_endpoint}"
  vpc_endpoint_type = "Interface"
  security_group_ids = [
    "${aws_security_group.privatelink.id}",
  ]
}

resource "aws_vpc_endpoint_subnet_association" "tk-subnet-assc" {
  count           = (var.endpoint_subnet_count)
  vpc_endpoint_id = "${aws_vpc_endpoint.endpoint.id}"
  subnet_id       = "${local.vpc_private_subnets[count.index]}"
}

resource "aws_route53_zone" "hz" {
  name          = "${var.privatelink_dns_zone}"
  force_destroy = true
  vpc {
    vpc_id = "${local.vpc_id}"
  }
}

resource "aws_route53_record" "tk" {
  zone_id = "${aws_route53_zone.hz.zone_id}"
  name    = "${var.privatelink_dns_name}.${var.privatelink_dns_zone}"
  type    = "CNAME"
  ttl     = "300"
  records = ["${lookup(aws_vpc_endpoint.endpoint.dns_entry[0], "dns_name")}"]
}
错误:索引无效

 on main.tf line 55, in resource "aws_route53_record" "tk":
  55:   records = ["${lookup(aws_vpc_endpoint.endpoint.dns_entry[0], "dns_name")}"]
    |----------------
    | aws_vpc_endpoint.endpoint.dns_entry is empty list of object

The given key does not identify an element in this collection value.

在仔细查看AWS terraform提供程序后,我发现了这一点。当通过API完成读取时,它会在创建端点后立即完成,因为我选择在端点之后创建子网关联,因此端点读取不包括这些关联,并且永远不会被重新读取。要解决此问题,请将子网ID直接添加到端点。示例如下:

resource "aws_vpc_endpoint" "endpoint" {
  vpc_id            = "${local.vpc_id}"
  service_name      = "${var.service_endpoint}"
  vpc_endpoint_type = "Interface"
  security_group_ids = [
    "${aws_security_group.privatelink.id}",
  ]
  subnet_ids = ["${local.vpc_private_subnets[0]}", "${local.vpc_private_subnets[1]}"]
}

resource "aws_route53_zone" "hz" {
  name          = "${var.privatelink_dns_zone}"
  force_destroy = true
  vpc {
    vpc_id = "${local.vpc_id}"
  }
}

resource "aws_route53_record" "tk" {
  zone_id = "${aws_route53_zone.hz.zone_id}"
  name    = "${var.privatelink_dns_name}.${var.privatelink_dns_zone}"
  type    = "CNAME"
  ttl     = "300"
  records = ["${lookup(aws_vpc_endpoint.endpoint.dns_entry[0], "dns_name")}"]
}

在仔细查看AWS terraform提供程序后,我发现了这一点。当通过API完成读取时,它会在创建端点后立即完成,因为我选择在端点之后创建子网关联,因此端点读取不包括这些关联,并且永远不会被重新读取。要解决此问题,请将子网ID直接添加到端点。示例如下:

resource "aws_vpc_endpoint" "endpoint" {
  vpc_id            = "${local.vpc_id}"
  service_name      = "${var.service_endpoint}"
  vpc_endpoint_type = "Interface"
  security_group_ids = [
    "${aws_security_group.privatelink.id}",
  ]
  subnet_ids = ["${local.vpc_private_subnets[0]}", "${local.vpc_private_subnets[1]}"]
}

resource "aws_route53_zone" "hz" {
  name          = "${var.privatelink_dns_zone}"
  force_destroy = true
  vpc {
    vpc_id = "${local.vpc_id}"
  }
}

resource "aws_route53_record" "tk" {
  zone_id = "${aws_route53_zone.hz.zone_id}"
  name    = "${var.privatelink_dns_name}.${var.privatelink_dns_zone}"
  type    = "CNAME"
  ttl     = "300"
  records = ["${lookup(aws_vpc_endpoint.endpoint.dns_entry[0], "dns_name")}"]
}

您能编辑您的问题以包含错误吗?@ydaetskcoR Yes意味着包含错误。如果您的示例更完整一点,那么回答这个问题会更容易。在你的问题中,什么算是一个很好的例子值得一读。你的第一个
apply
aws\u vpc\u endpoint.endpoint.id
也是空的吗?@ydaetskcoR这是完整的例子,这就设置好了。你能编辑你的问题以包含错误吗?@ydaetskcoR Yes的意思是包含错误。如果你的例子更完整一点,回答这个问题会更容易。在你的问题中,什么算是一个很好的例子值得一读。你的第一个
apply
aws\u vpc\u endpoint.endpoint.id
也是空的吗?@ydaetskcoR这是完整的例子,检查Terraform日志,但我怀疑这里发生的事情是Terraform推断出端点和子网关联以及端点和路由53记录之间的依赖关系(因为它们都引用端点),而不是子网关联和路由53记录之间的依赖关系(因为两者都不引用另一个)。因此,Terraform可能在创建子网关联之前创建了route 53记录。解决此问题的另一种方法是在route 53记录中显式使用
dependens\u on
,以确保它是在子网关联之后创建的。@Nathan,我确实使用了该路由,并且它在没有dependens的情况下正确创建,请参阅我上面关于何时完成资源读取的回答。我明白您的意思,因此在您进行关联后,Terraform中终结点的状态不会使用子网dns详细信息进行更新。可能另一种方法是为终结点声明一个数据资源,并使用该资源填充路径53记录的记录rd,但在端点资源中直接传递子网的解决方案是最干净的方法。请检查Terraform日志,但我怀疑这里发生的情况是Terraform推断端点和子网关联以及端点和route 53记录之间的依赖关系(因为它们都引用端点)但不在子网关联和route 53记录之间(因为两者都不引用另一个)。因此,Terraform可能在创建子网关联之前创建了route 53记录。解决此问题的另一种方法是在route 53记录中显式使用
dependens\u on
,以确保它是在子网关联之后创建的。@Nathan,我确实使用了该路由,并且它在没有dependens的情况下正确创建,请参阅我上面关于何时完成资源读取的回答。我明白您的意思,因此在您进行关联后,Terraform中终结点的状态不会使用子网dns详细信息进行更新。可能另一种方法是为终结点声明一个数据资源,并使用该资源填充路径53记录的记录rd,但在端点资源中直接传递子网的解决方案是最干净的方法。