使用Terraform部署Azure APIM时如何添加操作JSON定义并关联操作
解决方案
完全可以通过Terraform实现你的两个需求,具体实现方式如下:
提示:你当前使用的azurerm 2.66.0版本对APIM schema资源的支持存在局限性,建议升级到3.x以上版本以获得完整功能支持。
1. 操作与JSON格式定义关联的实现
你需要用到azurerm_api_management_api_schema资源来管理JSON格式的模型定义,再在API操作资源中关联该schema即可完成绑定:
- 首先新增API Schema资源,传入你的JSON格式定义内容:
resource "azurerm_api_management_api_schema" "info_response_schema" { api_name = azurerm_api_management_api.sample-api.name api_management_name = data.azurerm_api_management.apim_service.name resource_group_name = data.azurerm_resource_group.rg.name schema_id = "info-response-schema" content_type = "application/json" # 这里填写你的JSON格式定义,以下为响应结构示例 value = jsonencode({ openapi = "3.0.1" info = { title = "InfoResponse" version = "1.0.0" } paths = {} components = { schemas = { InfoResponseModel = { type = "object" properties = { id = { type = "integer" format = "int32" } name = { type = "string" } status = { type = "string" } } } } } }) }
- 然后修改原有API操作资源,在响应块中关联上面定义的schema,示例如下(以200状态码响应为例):
resource "azurerm_api_management_api_operation" "get-info" { operation_id = "info" api_name = azurerm_api_management_api.sample-api.name api_management_name = data.azurerm_api_management.apim_service.name resource_group_name = data.azurerm_resource_group.rg.name display_name = "Get info Testing" method = "GET" url_template = "/info" description = "foo" response { status_code = 200 # 关联已定义的JSON schema representation { content_type = "application/json" schema_id = azurerm_api_management_api_schema.info_response_schema.schema_id type_name = "InfoResponseModel" } } # 其余状态码响应可按相同逻辑配置 response { status_code = 400 } response { status_code = 401 } response { status_code = 403 } response { status_code = 404 } }
如果需要定义请求体的JSON结构,只需要在操作资源中新增request块,用同样的方式关联对应schema即可。
2. 获取操作JSON格式定义的实现
如果你需要在Terraform中获取已创建操作的JSON格式定义,可以通过output块输出相关属性,示例如下:
output "api_operation_json_definition" { value = jsonencode({ operation_id = azurerm_api_management_api_operation.get-info.operation_id method = azurerm_api_management_api_operation.get-info.method url_template = azurerm_api_management_api_operation.get-info.url_template responses = azurerm_api_management_api_operation.get-info.response associated_schema = azurerm_api_management_api_schema.info_response_schema.value }) }
执行terraform apply后就可以直接获取到格式化的JSON定义内容。
额外优化方案
如果你的API本身有完整的OpenAPI JSON定义文件,可以直接用azurerm_api_management_api资源的content参数传入OpenAPI JSON内容,Terraform会自动创建所有关联的操作、参数、响应定义,无需单独创建每个azurerm_api_management_api_operation资源,也天然实现了操作与定义的绑定。
内容的提问来源于stack exchange,提问作者Zucoa
相关产品推荐
相关产品推荐

