如何用Terraform为现有Azure APIM API新增接口并获取Operation Id配置操作级策略
解决新增接口不删除原有接口的问题
你直接替换content_value会删除原有接口的核心原因是:azurerm_api_management_api的import块是全量覆盖模式,APIM会完全以你导入的OpenAPI定义为准同步API操作,如果新的Swagger未包含原有接口定义,原有接口就会被清理。你可以选择以下两种方案实现增量新增:
- 方案1:使用全量合并后的OpenAPI定义
把新增端点合并到原Swagger文件中,保证你要导入的OpenAPI定义同时包含所有原有接口和新增接口,再替换content_value的值,此时Terraform只会新增缺失的接口,不会删除已存在的接口。 - 方案2:单独声明新增操作资源
如果你不想维护全量Swagger,可以移除azurerm_api_management_api中的import块,改用azurerm_api_management_api_operation资源逐个定义新增端点,完全不会影响已有接口,示例如下:
# 示例:新增一个GET类型的操作 resource "azurerm_api_management_api_operation" "new_endpoint_getuser" { operation_id = "get-user" api_name = azurerm_api_management_api.api-foo.name api_management_name = data.azurerm_api_management.apim_service.name resource_group_name = data.azurerm_resource_group.rg.name display_name = "Get User Info" method = "GET" url_template = "/user/{id}" response { status_code = 200 } }
获取Operation ID并配置操作级策略
输出Operation ID
如果你是单独声明的azurerm_api_management_api_operation资源,直接通过资源的operation_id属性即可获取,通过output块输出的示例如下:
output "api_operation_ids" { type = map(string) value = { get_user = azurerm_api_management_api_operation.new_endpoint_getuser.operation_id # 可追加其他操作的ID } }
如果你是全量导入OpenAPI的场景,可以通过azurerm_api_management_api_operation数据源查询指定接口的Operation ID:
data "azurerm_api_management_api_operation" "existing_getuser" { operation_id = "get-user" # 对应OpenAPI里定义的operationId api_name = azurerm_api_management_api.api-foo.name api_management_name = data.azurerm_api_management.apim_service.name resource_group_name = data.azurerm_resource_group.rg.name }
配置操作级策略
只需要在azurerm_api_management_api_policy资源中指定operation_id参数即可,示例如下:
resource "azurerm_api_management_api_policy" "getuser_operation_policy" { api_name = azurerm_api_management_api.api-foo.name api_management_name = data.azurerm_api_management.apim_service.name resource_group_name = data.azurerm_resource_group.rg.name operation_id = azurerm_api_management_api_operation.new_endpoint_getuser.operation_id xml_content = <<XML <policies> <inbound> <base /> <!-- 这里写当前操作独有的策略 --> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies> XML }
后续封装独立模块时,把operation_id作为模块的输入变量传入即可完成不同操作的策略复用。
内容的提问来源于stack exchange,提问作者Zucoa
相关产品推荐
相关产品推荐

