【问题标题】:How can I iterate through a map variable in terraform如何遍历 terraform 中的地图变量
【发布时间】:2021-05-25 20:34:36
【问题描述】:

我正在尝试遍历变量类型映射,但我不确定如何

这是我目前所拥有的

在我的 main.tf 中:

resource "aws_route_53_record" "proxy_dns" {
  count = "${length(var.account_name)}"
  zone_id = "${infrastructure.zone_id}"
  name = "proxy-${element(split(",", var.account_name), count.index)}-dns
  type = CNAME
  ttl = 60
  records = ["{records.dns_name}"]
}

在我的 variables.tf 中

variable "account_name" {
  type = "map"
  default = {
    "account1" = "accountA"
    "account2" = "accountB"
  }
}

我希望能够使用不同的帐户名称创建多个资源

【问题讨论】:

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


    【解决方案1】:

    如果您使用的是 Terraform 0.12.6 或更高版本,则可以使用 for_each 而不是 count 为地图中的每个元素生成一个实例:

    resource "aws_route53_record" "proxy_dns" {
      for_each = var.account_name
    
      zone_id = infrastructure.zone_id
      name    = "proxy-${each.value}-dns"
      # ... etc ...
    }
    

    for_each 优于 count 的主要优点是 Terraform 将通过地图中的键识别实例,因此您将获得类似 aws_route53_record.proxy_dns["account1"] 而不是 aws_route53_record.proxy_dns[0] 的实例,因此您可以添加和将来使用 Terraform 从地图中删除元素,知道每个元素属于哪个特定实例。

    当使用for_each 时,资源类型参数中的each.keyeach.value 替换count.index。它们分别计算当前地图元素的键和值。

    【讨论】:

    • 我可以使用 for_each 排除一个元素吗?
    • 使用for_each 本身无法做到这一点,但您可以生成一张新地图,其中一些项目使用for expression 过滤掉。这与我在这里回答的问题不同,因此我无法在此处的评论中详细介绍,但如果您尝试一下并有其他问题,我建议您在 Stack Overflow 中提出一个新问题来讨论它。跨度>
    【解决方案2】:

    使变量成为列表而不是映射。映射用于将名称引用到值。列表更适合通过计数方法进行迭代。

    variable "account_name" {
      type = "list"
      default = {"accountA","accountB"}
    }
    
    resource "aws_route_53_record" "proxy_dns" {
        count = "${length(var.account_name)}"
        zone_id = "${infrastructure.zone_id}"
        name = "proxy-${element(var.account_name, count.index)}-dns
        type = CNAME
        ttl = 60
        records = ["{records.dns_name}"]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-23
      • 2019-08-24
      • 1970-01-01
      • 2018-07-05
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多