使用Terraform更新现有Azure APIM的可行性及实现咨询
问题解答
可行性说明
完全可以用Terraform管理已部署的Azure API管理(APIM)服务,更新后端HTTP端点和策略。Terraform支持导入已有资源到状态文件,或者通过数据源定位已存在的资源,再基于这些资源完成配置更新操作。
可用的APIM数据源
AzureRM Terraform Provider提供了多个APIM相关的数据源,常用的包括:
azurerm_api_management:获取已存在的APIM服务实例信息azurerm_api_management_api:获取APIM中已发布的API详情azurerm_api_management_backend:若已存在后端端点,可通过该数据源获取其配置
参考示例
以下是完整示例,演示如何通过数据源定位已存在的APIM和API,然后更新后端HTTP端点并设置关联策略:
1. 配置Provider与数据源
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 3.0" } } } provider "azurerm" { features {} } # 获取已部署的APIM服务实例 data "azurerm_api_management" "existing" { name = "你的APIM服务名称" resource_group_name = "你的资源组名称" } # 获取APIM中已存在的目标API data "azurerm_api_management_api" "existing" { name = "目标API名称" api_management_name = data.azurerm_api_management.existing.name resource_group_name = data.azurerm_api_management.existing.resource_group_name }
2. 更新后端HTTP端点
如果后端端点不存在则直接创建,若已存在则通过配置覆盖更新:
# 创建或更新后端HTTP端点 resource "azurerm_api_management_backend" "updated_backend" { name = "更新后的后端标识名" api_management_name = data.azurerm_api_management.existing.name resource_group_name = data.azurerm_api_management.existing.resource_group_name protocol = "http" url = "https://new-backend.example.com/api/v1" # 可选:配置后端基础认证 credentials { basic { username = "backend-account" password = "backend-passwd" } } }
3. 绑定后端到API并更新策略
# 为目标API设置策略,将请求转发到更新后的后端 resource "azurerm_api_management_api_policy" "updated_policy" { api_name = data.azurerm_api_management_api.existing.name api_management_name = data.azurerm_api_management.existing.name resource_group_name = data.azurerm_api_management.existing.resource_group_name policy = <<POLICY <policies> <inbound> <base /> <set-backend-service backend-id="${azurerm_api_management_backend.updated_backend.name}" /> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies> POLICY }
4. 导入已有资源(可选)
如果后端端点或策略已经存在,且希望Terraform完全接管其生命周期,可先将资源导入状态文件:
# 导入已存在的后端端点 terraform import azurerm_api_management_backend.updated_backend /subscriptions/{你的订阅ID}/resourceGroups/{资源组名}/providers/Microsoft.ApiManagement/service/{APIM服务名}/backends/{后端标识名} # 导入已存在的API策略 terraform import azurerm_api_management_api_policy.updated_policy /subscriptions/{你的订阅ID}/resourceGroups/{资源组名}/providers/Microsoft.ApiManagement/service/{APIM服务名}/apis/{API名称}/policies/policy
注意事项
- 执行
terraform plan前,需确认数据源能正确匹配到已存在的资源,避免误创建新资源 - 若要完全接管已有资源,必须先导入到Terraform状态,否则Terraform会尝试创建新资源而非更新现有资源
- 策略内容需符合APIM官方的策略语法规范
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

