【问题标题】:Creating multiple Alias records in Terraform with for_each使用 for_each 在 Terraform 中创建多个别名记录
【发布时间】:2020-07-28 15:25:22
【问题描述】:

我正在尝试使用 for_each 在 terraform 中创建多个别名 DNS 记录。指定别名的名称和区域 ID 时出现错误。我的问题是如何从定义为一组字符串的变量中读取?下面是我定义的代码块和变量:

    resource "aws_route53_record" "alias_records" {
      for_each = var.alias_names
      zone_id  = aws_route53_zone.zone.zone_id
      name     = each.key
      type     = "A"
    
      alias {
        name                   = var.alias_dns_names[each.key]
        zone_id                = var.alias_zone_ids[each.key]
        evaluate_target_health = false
      }
    }

    variable "alias_names" {
      type = set(string)
    }
    variable "alias_dns_names" {
      type = set(string)
    }
    variable "alias_zone_ids" {
      type = set(string)
    }
    Error: Invalid index

      on alias.tf line 8, in resource "aws_route53_record" "alias_records":
       8:     name                   = var.alias_dns_names[each.key]
    
    This value does not have any indices.
    
    
    Error: Invalid index
    
      on alias.tf line 9, in resource "aws_route53_record" "alias_records":
       9:     zone_id                = var.alias_zone_ids[each.key]
    
    This value does not have any indices.
    alias_names = [
      "alias1",
      "alias2",
      "alias3"
    }

    alias_dns_names = [
      "alias_dns_1",
      "alias_dns_2",
      "alias_dns_3"
    }

    alias_zone_ids = [
      "alias_zone_1",
      "alias_zone_2",
      "alias_zone_3"
    }

【问题讨论】:

  • 在这种情况下您的变量输入是什么样的?
  • 我在 .tfvars 文件中有我的输入。我将更新输入。
  • 因此您正在遍历一个列表并尝试访问另外两个列表中的值。看起来你想要一个Map

标签: amazon-web-services dns terraform alias


【解决方案1】:

set 数据结构没有顺序,并且它的元素除了它们的值之外没有任何标识符,因此 set 类型不适合您的用例。

由于您似乎在这里描述了同一底层对象的三个不同方面,我认为从您的模块中公开它的最方便的方法是作为对象映射,如下所示:

variable "aliases" {
  type = map(object({
    zone_id  = string
    dns_name = string
  }))
}

然后您可以单独使用此变量来捕获每个别名记录所需的所有三个值:

  aliases = {
    alias1 = {
      zone_id  = "alias_zone_1"
      dns_name = "alias_dns_1"
    }
    alias2 = {
      zone_id  = "alias_zone_2"
      dns_name = "alias_dns_2"
    }
    alias3 = {
      zone_id  = "alias_zone_3"
      dns_name = "alias_dns_3"
    }
  }

任何数据类型的映射都可以直接与资源for_each 一起使用,each.key 表示映射键,each.value 表示值。所以你可以像这样改变你的资源块:

resource "aws_route53_record" "alias_records" {
  for_each = var.aliases
  zone_id  = aws_route53_zone.zone.zone_id
  name     = each.key
  type     = "A"

  alias {
    zone_id                = each.value.zone_id
    name                   = each.value.dns_name
    evaluate_target_health = false
  }
}

由于映射的元素是对象,您可以从each.value 访问它们以获取与原始映射中每个键对应的zone_iddns_name 值。

【讨论】:

  • 谢谢@MartinAtinks。这很有帮助。快速提问,如果地图中的一个键有多个值,我将如何指定它。我正在尝试使用两个值设置一个 route53 记录,并且指定“给定值对变量“示例”无效:元素“示例”:属性“示例”:需要字符串。属性具有正确的数据类型字符串,但由于某种原因它输出错误。
  • 我想我需要看一个更完整的例子来回答这个问题。如果您发布有关它的新问题并包含完整示例和错误消息(就像您在此处所做的那样),那么我会留意并尝试回答。
  • 我尝试了一些东西并发布了一个新问题,如果你可以看看。再次感谢您的帮助。
猜你喜欢
  • 2020-06-28
  • 2021-10-21
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 2020-12-09
相关资源
最近更新 更多