You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 02:58:11