使用for_each循环创建多个azurerm_api_management_api失败求助
在Azure APIM中批量创建API时出现404错误的排查
我无法在单个API Management网关下创建多个指向同一后端但使用不同OpenAPI文档的API。不确定报错是循环逻辑问题还是Provider版本导致的,附上相关Terraform代码及报错信息,所有OpenAPI文件已放置在对应目录中。
main.tf
resource "azurerm_api_management" "apim" { name = "azdlgleuw-apim-bhaskar-007" resource_group_name = azurerm_resource_group.windows-function-rg.name location = "west Europe" publisher_name = "sharat" publisher_email = "abcde@xyz.com" virtual_network_type = "Internal" sku_name = "Developer_1" virtual_network_configuration { subnet_id = azurerm_subnet.api-subnet.id } depends_on = [azurerm_subnet_network_security_group_association.apim-subnet-nsg,azurerm_public_ip.api-pip] public_ip_address_id = azurerm_public_ip.api-pip.id } resource "azurerm_api_management_api" "sharatapimgmntapi" { for_each = var.apimanagementapi name = each.value["name"] resource_group_name = azurerm_resource_group.windows-function-rg.name api_management_name = azurerm_api_management.apim.name revision = each.value["revision"] display_name = each.value["display_name"] path = each.value["path"] protocols = each.value["protocols"] import { content_format = "openapi" content_value = file("${path.module}/${each.value["content_value"]}") } }
API策略配置
resource "azurerm_api_management_api_policy" "example" { for_each = var.apimanagementapi api_name = azurerm_api_management_api.sharatapimgmntapi[each.key].name api_management_name = azurerm_api_management.apim.name resource_group_name = azurerm_resource_group.windows-function-rg.name xml_content = <<XML <policies> <inbound> <base /> <set-backend-service base-url="https://functionapp-001.azurewebsites.net/api" /> </inbound> </policies> XML }
var.tf
variable "apimanagementapi" { type = map(any) default = { apimanagementapi_1 = { name = "bhaskar-import-api-001" revision = "1" display_name = "sharat-latestAPI" path = "extranet/v1" protocols = ["https"] content_value = "ExtranetAPIopenapi.yaml" }, apimanagementapi_2 = { name = "bhaskar-import-moreapi-001" revision = "1" display_name = "bhaskar-latestAPI" path = "ext/v2" protocols = ["https"] content_value = "moreapi.yaml" }, apimanagementapi_3 = { name = "bhaskar-import-newapi-001" revision = "1" display_name = "nan-latestAPI" path = "ex/v3" protocols = ["https"] content_value = "newapi.yaml" } } }
报错信息
│ Error: creating/updating Api (Subscription: "xxxxxxxxxxxx" │ Resource Group Name: "azdlgleuw-rg-bhaskarapigw-001" │ Service Name: "azdlgleuw-apim-bhaskar-007" │ Api: "bhaskar-import-moreapi-001;rev=1"): polling after CreateOrUpdate: executing request: unexpected status 404 (404 Not Found) with error: ResourceNotFound: Api not found. │ │ with azurerm_api_management_api.sharatapimgmntapi["apimanagementapi_2"], │ on main.tf line 318, in resource "azurerm_api_management_api" "sharatapimgmntapi": │ 318: resource "azurerm_api_management_api" "sharatapimgmntapi" { │ │ Error: creating/updating Api (Subscription: "xxxxxxxxxxxxxxxxxxxxxx" │ Resource Group Name: "azdlgleuw-rg-bhaskarapigw-001" │ Service Name: "azdlgleuw-apim-bhaskar-007" │ Api: "bhaskar-import-newapi-001;rev=1"): polling after CreateOrUpdate: executing request: unexpected status 404 (404 Not Found) with error: ResourceNotFound: Api not found. │ │ with azurerm_api_management_api.sharatapimgmntapi["apimanagementapi_3"], │ on main.tf line 318, in resource "azurerm_api_management_api" "sharatapimgmntapi": │ 318: resource "azurerm_api_management_api" "sharatapimgmntapi" {
排查建议
- 升级AzureRM Provider版本:这类404轮询错误在旧版Provider(如2.x)中较为常见,建议升级到最新稳定版(3.0+),新版本修复了批量资源创建时的异步轮询问题。
- 添加显式依赖:给API资源添加对APIM实例的
depends_on,确保APIM完全部署完成后再启动API创建流程:resource "azurerm_api_management_api" "sharatapimgmntapi" { for_each = var.apimanagementapi # 保留原有配置... depends_on = [azurerm_api_management.apim] } - 验证OpenAPI文件:用Swagger Editor检查
moreapi.yaml和newapi.yaml的语法有效性,格式错误可能导致API创建后被后台自动删除,引发404。 - 拆分部署步骤:先单独部署APIM实例,再部署API资源,排查是否是并发创建导致的问题:
terraform apply -target=azurerm_api_management.apim terraform apply - 检查API名称唯一性:确认三个API的
name在APIM实例中完全唯一,避免隐性的大小写或特殊字符冲突。
内容的提问来源于stack exchange,提问作者Sharat Bhaskar
相关产品推荐
相关产品推荐

