如何通过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
相关产品推荐
相关产品推荐

