我需要将yaml片段中的值输入到1. Route53区域中,其中我需要apex_nme作为区域名称,2.将作为Route53记录添加到特定区域的记录。我不知道该怎么做。任何帮助都是非常感谢的。
resource "aws_route53_zone" "this" {
for_each = {
for apex in var.source_domains : apex => {
name = apex.name
}
}
}
resource "aws_route53_record" "this" {
for_each = {
for records in var.source_domains : records => {
zone_id = aws_route53_zone.this[each.key].zone_id
name = subdomains.records
type = "A"
records = ["192.168.0.1"]
}
}
}source_domains:
- apax_name: elastic2ls.com
records:
- elastic2ls.com
- www.elastic2ls.com
- apax_name: elastic2ls.ch
records:
- elastic2ls.ch
- www.elastic2ls.ch
- image.elastic2ls.ch
- m.elastic2ls.ch
- static.elastic2ls.ch发布于 2021-09-22 16:34:59
您的问题似乎是关于YAML解析的,但我怀疑您实际上是在询问如何为aws_route53_record.this编写aws_route53_record.this表达式,以便在所有域创建所有记录。
为了完整起见,我将注意到,您可以通过让调用模块用如下表达式定义该变量来从该YAML中填充var.source_domains:
module "example" {
source = "../modules/example"
source_domains = yamldecode(file("${path.module}/example.yaml")).source_domains
# ...
}那么,在模块内部,我首先声明具有适当类型约束的模块,以明确我们期望的数据结构,如下所示:
variable "source_domains" {
type = set(object({
apax_name = string
records = set(string)
}))
}在这里,我将顶级结构和嵌套记录定义为set类型,因为我们使用它们的方式意味着排序并不重要,我们期望它们都是唯一的。
有了所有这些,我们就可以开始写出资源定义了。让我们从区域开始,这是比较简单的情况,因为var.source_domains已经满足了每个资源实例都有一个元素的主要要求:
resource "aws_route53_zone" "example" {
for_each = {
for d in var.source_domains : d.apax_name => d
}
name = each.value.apax_name
}使用您共享的示例YAML输入,此块将声明此资源的两个实例:
aws_route53_zone.example["elastic2ls.com"]aws_route53_zone.example["elastic2ls.ch"]aws_route53_record声明有点棘手,因为我们需要将输入数据结构投影到一个新结构中,在这个结构中,每个记录都有一个元素要声明,而不是每个区域有一个元素。for_each是函数的常用用法,我们可以调整文档中的网络和子网示例来处理区域和记录:
locals {
zone_records = flatten([
for d in var.source_domains : [
for r in d.records : {
zone_name = d.apax_name
zone_id = aws_route53_zone.example[d.apax_name].id
record = r
}
]
])
}这个局部值正在构造一个对象列表,其中每个对象表示一个区域和记录的有效配对。这意味着元素的数量与我们需要声明的aws_route53_record实例的数量相匹配,因此我们可以在for_each中使用这个数据结构。
resource "aws_route53_record" "example" {
for_each = {
for zr in local.zone_records : zr.record => zr
}
zone_id = each.value.zone_id
name = each.value.record
# ...
}这个示例与典型的flatten/for_each模式略有不同,因为所有记录名称都已经嵌入了区域名称,因此我们不需要通常的表达式来生成包含多个部分的复合唯一键,比如文档示例中的"${subnet.network_key}.${subnet.subnet_key}"。在这种情况下,仅记录名称就足以使所有对之间都有唯一的键。
然后,再次根据您的YAML示例声明以下实例:
aws_route53_record.example["elastic2ls.com"]aws_route53_record.example["www.elastic2ls.com"]aws_route53_record.example["elastic2ls.ch"]aws_route53_record.example["www.elastic2ls.ch"]aws_route53_record.example["image.elastic2ls.ch"]aws_route53_record.example["m.elastic2ls.ch"]aws_route53_record.example["static.elastic2ls.ch"]https://stackoverflow.com/questions/69287279
复制相似问题