簡體   English   中英

如何遍歷 terraform 中的 map 變量

[英]How can I iterate through a map variable in terraform

我正在嘗試遍歷變量類型 map,但我不確定如何

這是我到目前為止所擁有的

在我的 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"
  }
}

我希望能夠使用不同的帳戶名創建多個資源

如果您使用 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 over count的主要優點是 Terraform 將通過地圖中的鍵識別實例,因此您將獲得aws_route53_record.proxy_dns["account1"]類的實例而不是aws_route53_record.proxy_dns[0] ,因此您可以添加並在未來從地圖中刪除元素,Terraform 知道哪個特定實例屬於每個元素。

當使用for_each時,資源類型參數中的each.keyeach.value替換count.index 它們分別評估當前地圖元素的鍵和值。

您可以使用 map、鍵 function、索引 function 和計數的組合。 這個 terraform 創建了 3 個具有各種規則的 acl。

  • acl 的名稱由鍵決定。
  • acl 的數量由鍵的數量決定。
  • 每條規則的索引(優先級)由索引function決定
  • 每個規則的名稱來自 map 中的 CONTAINS_WORD 或 CONTAINS 屬性

=>

variable "acls" {
  type = map(any)
  default = {

    "acl1" = {
      "CONTAINS_WORD" = ["api","aaa", "bbb", "ccc"]
      "CONTAINS" = ["xxx","yyy"]
    }

    "acl2" = {
      "CONTAINS_WORD" = [ "url1,"url2","url3"]
      "CONTAINS" = ["url4"]
    }

    "acl3" = {
      "CONTAINS_WORD" = ["xxx"]
      "CONTAINS" = []
    } 
  }
}

resource "aws_wafv2_web_acl" "acl" {
  name  = keys(var.acls)[count.index]
  scope = "REGIONAL"
  count = length(keys(var.acls))

  default_action {
    block {}
  }

  dynamic "rule" {

    for_each = toset(var.acls[keys(var.acls)[count.index]].CONTAINS_WORD)

    content {
      name     =  rule.key
      priority = index(var.acls[keys(var.acls)[count.index]].CONTAINS_WORD, rule.key)

      action {
        allow {}
      }

      statement {
        
        #https://docs.aws.amazon.com/waf/latest/APIReference/API_ByteMatchStatement.html
        byte_match_statement  {

          positional_constraint = "CONTAINS_WORD"
          search_string         = lower(rule.key)

          field_to_match {
            uri_path {}
          }

          text_transformation {
            priority = 0
            type     = "LOWERCASE"
          }
        }
      } 

      visibility_config {
        cloudwatch_metrics_enabled = true
        metric_name                = "waf-${keys(var.acls)[count.index]}-${rule.key}"
        sampled_requests_enabled   = true
      }
    }
  }

  dynamic "rule" {

    for_each = toset(var.acls[keys(var.acls)[count.index]].CONTAINS)

    content {
      name     = replace(rule.key, ".", "_")
      priority = index(var.acls[keys(var.acls)[count.index]].CONTAINS, rule.key) + length(var.acls[keys(var.acls)[count.index]].CONTAINS_WORD)

      action {
        allow {}
      }

      statement {
        
        #https://docs.aws.amazon.com/waf/latest/APIReference/API_ByteMatchStatement.html
        byte_match_statement  {

          positional_constraint = "CONTAINS"
          search_string         = lower(rule.key)

          field_to_match {
            uri_path {}
          }

          text_transformation {
            priority = 0
            type     = "LOWERCASE"
          }
        }
      } 

      visibility_config {
        cloudwatch_metrics_enabled = true
        metric_name                = "waf-${keys(var.acls)[count.index]}-${replace(rule.key, ".", "_")}"
        sampled_requests_enabled   = true
      }
    }
  }


  visibility_config {
    cloudwatch_metrics_enabled = true
    metric_name                = "waf-${keys(var.acls)[count.index]}"
    sampled_requests_enabled   = true
  }
}

使變量成為列表而不是地圖。 映射用於將名稱引用到值。 列表更適合通過計數方法進行迭代。

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}"]
}

我正在嘗試遍歷變量類型映射,但我不確定如何

這是我到目前為止所擁有的

在我的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"
}
}

我希望能夠使用不同的帳戶名創建多個資源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM