请求解析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
相关产品推荐
相关产品推荐

