You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求解析Azure Terraform代码中的For循环逻辑

Terraform多区域Log Analytics工作区部署的For循环拆解

咱们一步步拆解这段代码里的for循环逻辑,从变量到资源定义逐个说明:

1. 变量基础:var.workspaces的结构

先看variables.tf里的定义,这是整个循环的数据源:

variable "workspaces" {
  type = map(object({
    location          = string
    retention_in_days = number
  }))
  default = {
    workspace1 = {
      location          = "australiasoutheast"
      retention_in_days = 30
    }
    workspace2 = {
      location          = "australiaeast"
      retention_in_days = 30
    }
  }
}

这是一个map类型变量,每个key是工作区的名称(比如workspace1),对应的value是一个包含location(区域)和retention_in_days(数据保留天数)的对象。默认配置里有2个工作区,分别在澳洲东南和澳洲东部区域。

2. locals里的for表达式:生成资源组配置

locals.tf里的for循环是用来提取资源组需要的配置:

locals {
  resource_groups = {
    for k, v in var.workspaces : k => {
      location = v.location
    }
  }
}
  • for k, v in var.workspaces:遍历var.workspaces这个map,k是每个工作区的名称(比如workspace1),v是对应的value对象(包含location和retention)
  • k => { location = v.location }:生成一个新的map,键还是原来的工作区名称k,值只保留原对象里的location字段(因为资源组只需要区域信息,不需要保留天数)

最终生成的local.resource_groups结构是:

{
  workspace1 = { location = "australiasoutheast" },
  workspace2 = { location = "australiaeast" }
}

3. 资源组的for_each:批量创建专属资源组

main.tf里的资源组资源用了for_each:

resource "azurerm_resource_group" "workspaces" {
  for_each = local.resource_groups

  name     = each.key
  location = each.value.location
}
  • for_each = local.resource_groups:告诉Terraform,要根据local.resource_groups这个map里的每个键值对,创建一个独立的资源组
  • each.key:对应当前遍历到的map键(也就是workspace1、workspace2),所以资源组的名称和工作区名称一致
  • each.value.location:对应当前map值里的location字段,所以每个资源组会创建在对应工作区指定的区域

最终会生成2个资源组:workspace1(澳洲东南)、workspace2(澳洲东部)。

4. Log Analytics工作区的for_each:批量创建工作区并关联资源组

最后是Log Analytics工作区的资源定义:

resource "azurerm_log_analytics_workspace" "workspaces" {
  for_each = var.workspaces

  name                = each.key
  location            = each.value.location
  resource_group_name = azurerm_resource_group.workspaces[each.key].name
  sku                 = "PerGB2018"
  retention_in_days   = each.value.retention_in_days
}
  • for_each = var.workspaces:直接基于原始变量的map来创建工作区,每个键值对对应一个工作区
  • each.key:作为工作区的名称,和资源组名称保持一致
  • each.value.location:工作区的区域,和对应资源组的区域一致
  • resource_group_name = azurerm_resource_group.workspaces[each.key].name:这里是关键关联逻辑——因为资源组的for_each用的是和工作区同名的键,所以可以通过each.key直接找到对应的资源组,把工作区放到专属的资源组里
  • each.value.retention_in_days:从原始变量里取保留天数配置

这样每个工作区都会被部署到同名的、对应区域的资源组里,实现“不同区域专属资源组+工作区”的批量创建。


内容的提问来源于stack exchange,提问作者Cyborganizer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:35:28