ber*_*olo 27 foreach amazon-web-services amazon-route53 terraform
当我有一个托管区域时,我可以轻松创建该区域,然后通过按名称引用托管区域,在委托账户中为该区域创建 NS 记录。
现在我需要创建多个托管区域并将名称服务器记录传递回父帐户,我不确定是否可以(或者如何)引用多个资源。阅读本文可能没有多大意义,因此下面的代码是我所掌握的。
我现在有一个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]
]
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*cin 25
由于您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
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您的意图似乎是说“每个条目有一个区域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
}
Run Code Online (Sandbox Code Playgroud)
通过使用for_eachinside,resource "aws_route53_zone" "public_hosted_zone"您可以aws_route53_zone.public_hosted_zone生成从区域键到区域对象的映射,该映射本身与预期兼容for_each,因此您可以将该映射下游传递到另一个资源。
这种方法的一个重要优点是,each.value块中resource "aws_route53_record" "ns_records"直接包含相应的区域对象,因此我们可以编写each.value.name以从区域获取派生name参数,而无需再次复制该表达式,并且我们可以编写each.value.name_servers以获取导出的名称服务器集对于每个区域。这样就可以避免编写更复杂的表达式来查找区域each.key,因为 Terraform 已经完成了填充所需的查找each.value。
| 归档时间: |
|
| 查看次数: |
19582 次 |
| 最近记录: |