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

如何通过Terraform将多个OpenAPI文档导入现有Azure APIM API?

在Terraform中合并多个OpenAPI文件并导入到Azure APIM通用API

核心结论

Terraform的azurerm_api_management_api本身不支持直接追加多个OpenAPI文件,但可以通过Terraform内置的JSON处理函数合并多个Swagger内容,再导入到目标API中,无需依赖外部工具。

解决方案步骤

1. 读取多个Swagger文件内容

使用local_file数据源读取本地的Swagger JSON文件(如果是远程文件,可替换为http数据源):

data "local_file" "swagger1" {
  filename = "${path.module}/swagger1.json"
}

data "local_file" "swagger2" {
  filename = "${path.module}/swagger2.json"
}

2. 合并Swagger JSON内容

通过jsondecode将文件内容转为JSON对象,再用merge函数合并关键节点(重点是paths,可选合并components等其他节点):

locals {
  # 解析两个Swagger文件为JSON对象
  swagger1_obj = jsondecode(data.local_file.swagger1.content)
  swagger2_obj = jsondecode(data.local_file.swagger2.content)

  # 合并核心内容:保留主Swagger的基础配置,合并paths和components
  merged_swagger = merge(
    # 保留第一个Swagger的基础信息(如info、servers等)
    local.swagger1_obj,
    # 合并两个Swagger的paths,后者会覆盖同名路径
    { paths = merge(local.swagger1_obj.paths, local.swagger2_obj.paths) },
    # 可选:合并components(如schemas、securitySchemes),避免重复定义
    {
      components = merge(
        local.swagger1_obj.components != null ? local.swagger1_obj.components : {},
        local.swagger2_obj.components != null ? local.swagger2_obj.components : {}
      )
    }
  )
}

3. 将合并后的内容导入到APIM API

修改原有的azurerm_api_management_api资源,将合并后的JSON字符串传入import块:

resource "azurerm_api_management_api" "test_api" {
  provider            = azurerm.test
  name                = "test"
  api_management_name = var.apim_name
  resource_group_name = var.common_rg
  display_name        = "test"
  description         = "test APIM"
  path                = "test"
  revision            = "1"
  protocols           = ["https"]

  subscription_key_parameter_names {
    header = "Ocp-Apim-Subscription-Key"
    query  = "subscription-key"
  }

  import {
    content_format = "openapi+json"
    content_value  = jsonencode(local.merged_swagger)
  }
}

关键注意事项

  • 路径冲突处理:如果两个Swagger存在同名路径,合并时后者会覆盖前者,需确保路径唯一或调整合并顺序。
  • 扩展合并逻辑:如果需要合并其他节点(如tags、security),可在merged_swagger中添加对应的merge逻辑。
  • 远程Swagger适配:若Swagger文件存储在远程服务器,将local_file替换为http数据源即可:
    data "http" "swagger1" {
      url = "https://example.com/swagger1.json"
    }
    

关于你尝试过的方法说明

  • source_api_id引用:该方式用于创建API的克隆版本或新版本,并非追加端点到现有API,因此无法满足需求。
  • azurerm_api_management_api_schema:该资源用于管理API的数据模型(如请求/响应的Schema),不负责导入或追加OpenAPI端点定义,因此不适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 02:31:19