Terraform 地形资源\u aws\u vpc\u端点Dns列表为空
我正在使用terraform 0.12并尝试将vpc端点设置到另一个vpc。当我尝试设置alias route 53记录时,我总是收到一条错误消息,指示dns_条目为空列表。我错过了一些明显的东西。如果我随后重新执行apply,它将填充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
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,但在端点资源中直接传递子网的解决方案是最干净的方法。