【问题标题】:Iterating through a map of objects with multiple values using for_each使用 for_each 遍历具有多个值的对象映射
【发布时间】:2020-07-30 23:27:32
【问题描述】:

我有多个使用 Terraform 创建的 DNS 记录。我的一条记录有两个需要读取的值。我在让 Terraform 能够遍历我的变量以使其成功读取时遇到问题。下面是我的代码。即使我有正确的数据类型,我也会收到一个没有任何意义的错误。我在循环这些资源的方式上存在一些错误,而且我在弄清楚哪里出错时遇到了一些麻烦。任何建议将不胜感激。

variables.tf
    variable "mx" {
      type = map(object({
        ttl     = string
        records = set(string)
      }))
    }
variables.tfvars
  mx = {
       "mx_record1" = {
         ttl = "3600"
         records = [
           "mx_record1_value"
         ]
       }
       "mx_record2" = {
         ttl = "3600"
         records = [
           "mx_record2_value"
           "mx_record2_value2"
         ]
       }
mx.tf
  locals {
       mx_records = flatten([
         for mx_key, mx in var.mx : [
           for record in mx.records : {
             record = record
             mx     = mx_key
           }
         ]
       ])
     }
 
 resource "aws_route53_record" "mx_records" {
   for_each = { for mx in local.mx_records : mx.record => mx }
   zone_id  = aws_route53_zone.zone.zone_id
   name     = each.key
   type     = "MX"
   ttl      = each.value.ttl
 
   records = [
     each.value.record
   ]
 }

遇到以下错误

    Error:
    
        Error: Unsupported attribute
    
      on mx.tf line 17, in resource "aws_route53_record" "mx_records":
      17:   ttl      = each.value.ttl
        |----------------
        | each.value is object with 2 attributes
    
    This object does not have an attribute named "ttl".

更新:


    locals {
  mx_records = flatten([
    for mx_key, mx in var.mx : [
      for record in mx.records : {
        record = record
        mx     = mx_key
        ttl    = mx.ttl
      }
    ]
  ])
}

resource "aws_route53_record" "mx_records" {
  for_each = { for mx in local.mx_records : mx.record => mx }
  zone_id  = aws_route53_zone.zone.zone_id
  name     = each.key
  type     = "MX"
  ttl      = each.value.ttl

  records = [
    each.value.record
  ]
}

错误


    Error: [ERR]: Error building changeset: InvalidChangeBatch: [FATAL problem: UnsupportedCharacter (Value contains unsupported characters) encountered with ' ']
        status code: 400, request id: a27e6a47-c10f-42ce-be94-10aaa9c276f8

  on mx.tf line 13, in resource "aws_route53_record" "mx_records":
  13: resource "aws_route53_record" "mx_records" {

【问题讨论】:

    标签: amazon-web-services foreach dns terraform amazon-route53


    【解决方案1】:

    我认为你的mx_records 应该是:

    locals {
        mx_records = flatten([
          for mx_key, mx in var.mx :
            [for record in mx.records: {
              record = record
              mx     = mx_key
              ttl    = mx.ttl
            }]
          ])
    }
    

    这将产生以下结构:

    mx_records = [
      {
        "mx" = "mx_record1"
        "record" = "mx_record1_value"
        "ttl" = "3600"
      },
      {
        "mx" = "mx_record2"
        "record" = "mx_record2_value"
        "ttl" = "3600"
      },
      {
        "mx" = "mx_record2"
        "record" = "mx_record2_value2"
        "ttl" = "3600"
      },
    ]
    
    

    【讨论】:

    • 嗨@Marcin。感谢您的反馈,几个问题:在我的局部变量中添加 'record = record' 意味着我也应该在我声明“mx”变量的 variables.tf 中添加它?这对我来说有点棘手。在我的局部变量中添加“记录 = 记录”会给我一个奇怪的错误(我会将错误添加到主要问题中)。我的输出给了我一个逻辑错误,它正在获取记录的值并将其用作键,即使我指定记录的名称应该是映射变量的键。任何其他建议都会有所帮助
    • @DaveMichaels 我不确定你的意思。您报告的错误消息是关于 ttl 丢失。 record = record 在您发布的原始代码中。我对其进行了修改,以便包含ttl,它应该解决发布的原始错误消息。如果record 问题是新问题,您可以提出新问题,并附上“奇怪的错误”消息、代码示例和解释。
    • 我很抱歉。看着这个新错误并与我的代码进行比较,我有点困惑。我发布了添加 ttl 后遇到的错误
    • @DaveMichaels 错误可能是因为您的variables.tfvars 有错误。 “mx_record2_value”和“mx_record2_value2”之间没有逗号。
    • @DaveMichaels 错误是关于某处 encountered with ' ' 的一些奇怪字符。也许您需要检查您的真实 mx 记录文件。虚拟值mx_record2_value2 对于验证您的实际记录是否具有正确的格式不是很有帮助。 Here 是关于 R53 记录和这样的错误。
    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多