Terraform:在另一个资源中引用 for_each 中创建的资源
Terraform: Referencing resources created in for_each in another resource
当我只有一个托管区域时,我很容易创建该区域,然后通过按名称引用托管区域来在委托帐户中为该区域创建 NS 记录。
- 编辑 为了避免混淆,这是我想要实现的,但是对于多个托管区域,域的所有者是管理帐户:https://dev.to/arswaw/create-a-subdomain-in-amazon-route53-in-2-minutes-3hf0
现在我需要创建多个托管区域并将名称服务器记录传递回父帐户,我不确定是否可以(或者如果可以的话)引用多个资源。阅读本文可能没有多大意义,所以下面的代码是我所掌握的。
我现在有一个 for_each
循环,它将遍历字符串列表并为每个字符串创建一个托管区域,然后我想在另一个帐户中创建相应的 NS 记录,注意我正在使用一个单独的提供商 provider = aws.management_account
连接到主账户,这对单个托管区域工作正常。
我不知道如何引用托管区域,是否有一些语法或者我的方法有误?
resource "aws_route53_zone" "public_hosted_zone" {
for_each = local.aws_zones
name = "${each.value}.${var.domain}"
}
resource "aws_route53_record" "ns_records" {
for_each = local.aws_zones
provider = aws.management_account
allow_overwrite = true
name = "${each.value}.${var.domain}"
ttl = 30
type = "NS"
zone_id = data.aws_ssm_parameter.public_hosted_zone_id.value
records = [
aws_route53_zone.public_hosted_zone.name_servers[0], # Here is my old code which works for a single hosted zone but I cannot work out how to reference multiples created above
aws_route53_zone.public_hosted_zone.name_servers[1],
aws_route53_zone.public_hosted_zone.name_servers[2],
aws_route53_zone.public_hosted_zone.name_servers[3]
]
}
由于您的 local.aws_zones
设置为 ["dev", "test", "qa"],您的 aws_route53_zone.public_hosted_zone
将是一个包含键“dev”、“test”、“qa”的映射".
因此,要在您的 aws_route53_record
中使用它,您可以尝试:
resource "aws_route53_record" "ns_records" {
for_each = local.aws_zones
# other attributes
records = aws_route53_zone.public_hosted_zone[each.key].name_servers
}
在这种情况下,您的意图似乎是说“local.aws_zones
中每个条目有一个区域,然后每个区域有一个 NS 记录集”。
在这种情况下,一种简明的写法是使用一个资源作为下一个资源的 for_each
,如下所示:
resource "aws_route53_zone" "public_hosted_zone" {
for_each = local.aws_zones
name = "${each.value}.${var.domain}"
}
resource "aws_route53_record" "ns_records" {
provider = aws.management_account
for_each = aws_route53_zone.public_hosted_zone
allow_overwrite = true
name = each.value.name
ttl = 30
type = "NS"
zone_id = data.aws_ssm_parameter.public_hosted_zone_id.value
records = each.value.name_servers
}
通过在 resource "aws_route53_zone" "public_hosted_zone"
中使用 for_each
,您可以使 aws_route53_zone.public_hosted_zone
成为从区域键到区域对象的映射,它本身与 for_each
的期望兼容,因此您可以将该地图下游传递给另一个资源。
这种方式的一个重要优点是resource "aws_route53_record" "ns_records"
块中的each.value
直接是对应的区域对象,所以我们可以写each.value.name
得到派生的name
参数,而不必再次复制该表达式,我们可以编写 each.value.name_servers
来为每个区域获取导出的名称服务器集。这样就避免了编写更复杂的表达式来按 each.key
查找区域,因为 Terraform 已经完成了必要的查找以填充 each.value
.
当我只有一个托管区域时,我很容易创建该区域,然后通过按名称引用托管区域来在委托帐户中为该区域创建 NS 记录。
- 编辑 为了避免混淆,这是我想要实现的,但是对于多个托管区域,域的所有者是管理帐户:https://dev.to/arswaw/create-a-subdomain-in-amazon-route53-in-2-minutes-3hf0
现在我需要创建多个托管区域并将名称服务器记录传递回父帐户,我不确定是否可以(或者如果可以的话)引用多个资源。阅读本文可能没有多大意义,所以下面的代码是我所掌握的。
我现在有一个 for_each
循环,它将遍历字符串列表并为每个字符串创建一个托管区域,然后我想在另一个帐户中创建相应的 NS 记录,注意我正在使用一个单独的提供商 provider = aws.management_account
连接到主账户,这对单个托管区域工作正常。
我不知道如何引用托管区域,是否有一些语法或者我的方法有误?
resource "aws_route53_zone" "public_hosted_zone" {
for_each = local.aws_zones
name = "${each.value}.${var.domain}"
}
resource "aws_route53_record" "ns_records" {
for_each = local.aws_zones
provider = aws.management_account
allow_overwrite = true
name = "${each.value}.${var.domain}"
ttl = 30
type = "NS"
zone_id = data.aws_ssm_parameter.public_hosted_zone_id.value
records = [
aws_route53_zone.public_hosted_zone.name_servers[0], # Here is my old code which works for a single hosted zone but I cannot work out how to reference multiples created above
aws_route53_zone.public_hosted_zone.name_servers[1],
aws_route53_zone.public_hosted_zone.name_servers[2],
aws_route53_zone.public_hosted_zone.name_servers[3]
]
}
由于您的 local.aws_zones
设置为 ["dev", "test", "qa"],您的 aws_route53_zone.public_hosted_zone
将是一个包含键“dev”、“test”、“qa”的映射".
因此,要在您的 aws_route53_record
中使用它,您可以尝试:
resource "aws_route53_record" "ns_records" {
for_each = local.aws_zones
# other attributes
records = aws_route53_zone.public_hosted_zone[each.key].name_servers
}
在这种情况下,您的意图似乎是说“local.aws_zones
中每个条目有一个区域,然后每个区域有一个 NS 记录集”。
在这种情况下,一种简明的写法是使用一个资源作为下一个资源的 for_each
,如下所示:
resource "aws_route53_zone" "public_hosted_zone" {
for_each = local.aws_zones
name = "${each.value}.${var.domain}"
}
resource "aws_route53_record" "ns_records" {
provider = aws.management_account
for_each = aws_route53_zone.public_hosted_zone
allow_overwrite = true
name = each.value.name
ttl = 30
type = "NS"
zone_id = data.aws_ssm_parameter.public_hosted_zone_id.value
records = each.value.name_servers
}
通过在 resource "aws_route53_zone" "public_hosted_zone"
中使用 for_each
,您可以使 aws_route53_zone.public_hosted_zone
成为从区域键到区域对象的映射,它本身与 for_each
的期望兼容,因此您可以将该地图下游传递给另一个资源。
这种方式的一个重要优点是resource "aws_route53_record" "ns_records"
块中的each.value
直接是对应的区域对象,所以我们可以写each.value.name
得到派生的name
参数,而不必再次复制该表达式,我们可以编写 each.value.name_servers
来为每个区域获取导出的名称服务器集。这样就避免了编写更复杂的表达式来按 each.key
查找区域,因为 Terraform 已经完成了必要的查找以填充 each.value
.