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

如何通过Terraform基于YAML批量创建Synapse的Managed Private Endpoint

问题描述

需要用Terraform为Synapse工作区到存储账户创建托管专用端点(MPE),需读取给定的YAML配置文件——每个Synapse工作区对应多个存储账户,且存在多Synapse实例场景。已知Terraform资源块结构,但不清楚如何遍历YAML中的存储账户批量创建MPE;虽可通过data块获取存储账户信息,但同时循环资源块与data块的实现较复杂,寻求更简洁的可行方案。

给定YAML配置

resource_endpoints:
  - source_name: synapse_workspace_1
    source_subscription_id: sub-fedcba9876543210
    source_resource_group: rg-sourceGroup2
    source_type: synapse
    resources:
      - destination_type: Blob Storage
        destination_name: sa2675asj7234asf
        destination_subscription_id: sub-fedcba9876543210
        destination_resource_group: rg-destinationGroup3
      - destination_type: Blob Storage
        destination_name: saasdjkf23q876h23sd
        destination_subscription_id: sub-abcdef1234567890
        destination_resource_group: rg-destinationGroup2
        
  - source_name: synapse_workspace_1
    source_subscription_id: sub-fedcba9876543210
    source_resource_group: rg-sourceGroup2
    source_type: synapse
    resources:
      - destination_type: Blob Storage
        destination_name: sa2675asj7234asf
        destination_subscription_id: sub-fedcba9876543210
        destination_resource_group: rg-destinationGroup3
      - destination_type: Blob Storage
        destination_name: saasdjkf23q876h23sd
        destination_subscription_id: sub-abcdef1234567890
        destination_resource_group: rg-destinationGroup2

当前Terraform资源块框架

resource "azurerm_synapse_managed_private_endpoint" "synapse_private_endpoint" {
  for_each = {for idx, sws in local.synworkspace => ??? }
  name                = "mpe-some-randomstring"
  synapse_workspace_id = each.value.synapse_workspace_id
  target_resource_id  = each.value.target_resource_id
  subresource_name    = each.value.subresource_name
}

解决方案

步骤1:读取并扁平化YAML数据

先通过yamldecode读取YAML文件,再将嵌套的Synapse-存储账户配对结构展开为扁平列表,便于后续遍历:

locals {
  # 读取YAML配置文件
  endpoint_config = yamldecode(file("${path.module}/endpoint_config.yaml"))
  
  # 扁平化数据:将每个Synapse与对应存储账户的配对单独拆分
  synapse_storage_pairs = flatten([
    for synapse in local.endpoint_config.resource_endpoints : [
      for storage in synapse.resources : {
        synapse_name              = synapse.source_name
        synapse_subscription_id   = synapse.source_subscription_id
        synapse_resource_group    = synapse.source_resource_group
        storage_name              = storage.destination_name
        storage_subscription_id   = storage.destination_subscription_id
        storage_resource_group    = storage.destination_resource_group
        # 生成唯一标识键,用于for_each(避免重复资源)
        key = "${synapse.source_name}-${synapse.source_resource_group}-${storage.destination_name}-${storage.destination_resource_group}"
      }
    ]
  ])
}

步骤2:直接构造资源ID(简化方案)

利用Azure资源ID的固定格式,直接构造Synapse工作区和存储账户Blob服务的ID,无需依赖data块查询,加快执行速度:

locals {
  # ... 保留之前的endpoint_config和synapse_storage_pairs
  
  # 扩展配对数据,添加完整资源ID
  synapse_storage_details = [
    for pair in local.synapse_storage_pairs : merge(pair, {
      synapse_workspace_id = "/subscriptions/${pair.synapse_subscription_id}/resourceGroups/${pair.synapse_resource_group}/providers/Microsoft.Synapse/workspaces/${pair.synapse_name}"
      storage_blob_id      = "/subscriptions/${pair.storage_subscription_id}/resourceGroups/${pair.storage_resource_group}/providers/Microsoft.Storage/storageAccounts/${pair.storage_name}/blobServices/default"
    })
  ]
  
  # 转换为map格式,适配for_each要求
  synapse_storage_map = {
    for pair in local.synapse_storage_details : pair.key => pair
  }
}

步骤3:遍历创建MPE资源

基于扁平化后的map,直接遍历生成所有托管专用端点:

resource "azurerm_synapse_managed_private_endpoint" "synapse_private_endpoint" {
  for_each = local.synapse_storage_map

  name                 = "mpe-${each.value.synapse_name}-${each.value.storage_name}"
  synapse_workspace_id = each.value.synapse_workspace_id
  target_resource_id   = each.value.storage_blob_id
  subresource_name     = "blob" # Blob Storage固定子资源名称
}

可选:用data块验证资源存在(严谨性优化)

如果需要确保Synapse和存储账户已存在,可配合data块遍历查询:

# 读取Synapse工作区信息
data "azurerm_synapse_workspace" "synapse" {
  for_each = {
    for synapse in local.endpoint_config.resource_endpoints : "${synapse.source_name}-${synapse.source_resource_group}" => {
      name                = synapse.source_name
      resource_group_name = synapse.source_resource_group
    }
  }

  name                = each.value.name
  resource_group_name = each.value.resource_group_name
}

# 读取存储账户Blob服务信息
data "azurerm_storage_account_blob_service" "storage_blob" {
  for_each = {
    for pair in local.synapse_storage_pairs : pair.key => {
      storage_account_id = "/subscriptions/${pair.storage_subscription_id}/resourceGroups/${pair.storage_resource_group}/providers/Microsoft.Storage/storageAccounts/${pair.storage_name}"
    }
  }

  storage_account_id = each.value.storage_account_id
}

# 创建MPE资源
resource "azurerm_synapse_managed_private_endpoint" "synapse_private_endpoint" {
  for_each = local.synapse_storage_map

  name                 = "mpe-${each.value.synapse_name}-${each.value.storage_name}"
  synapse_workspace_id = data.azurerm_synapse_workspace.synapse["${each.value.synapse_name}-${each.value.synapse_resource_group}"].id
  target_resource_id   = data.azurerm_storage_account_blob_service.storage_blob[each.key].id
  subresource_name     = "blob"
}

关键说明

  • 扁平化数据是核心:将嵌套结构拆分为一对一的配对,让for_each可以直接遍历生成资源。
  • 唯一键的生成:确保每个配对有唯一标识,避免Terraform因重复键报错。
  • 直接构造ID的优势:减少数据源查询开销,适合确定资源已存在的场景;如需验证资源存在,再使用data块方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 21:14:55