无法在我部署的Azure api管理器中应用策略



尝试在我的apim内的操作上部署策略时,我无法实现我的策略。

错误日志

Error: creating or updating API Policy (Resource Group "rg-opendata-dev" / API Management Service "apimopendata-dev" / API "apim-opendata-dev"): apimanagement.APIPolicyClient#CreateOrUpdate: Failure responding to request: StatusCode=400 -- Original Error: autorest/azure: Service returned an error. Status=400 Code="ValidationError" Message="Entity with specified identifier not found"
│ 
│   with azurerm_api_management_api_policy.apipolicy,
│   on main.tf line 78, in resource "azurerm_api_management_api_policy" "apipolicy":
│   78: resource "azurerm_api_management_api_policy" "apipolicy" {
│ 
╵

我不明白这个,因为我很确定我写的变量是正确的,还是我给变量取错了名字?

您是否也认为使用如下所示的xml代码添加策略是部署策略的正确方法?

main的一部分。tf文件


resource "azurerm_api_management_api" "api" {
name = "apim-opendata-${var.env}"
resource_group_name = data.azurerm_resource_group.rg.name
api_management_name = azurerm_api_management.apim.name
revision = "1"
display_name = "${var.display_name}"
service_url = "${var.service_url}"
protocols = ["https"]
}
resource "azurerm_api_management_api_operation" "apioperation" {
operation_id = "get-data"
api_name = azurerm_api_management_api.api.name
api_management_name = azurerm_api_management.apim.name
resource_group_name = data.azurerm_resource_group.rg.name
display_name = "Get Data"
method = "GET"
url_template = "/"
description = "Get data inside of the container"
response {
status_code = 200
}
}
resource "azurerm_api_management_api_policy" "apipolicy" {
api_name = azurerm_api_management_api.api.name
api_management_name = azurerm_api_management.apim.name
resource_group_name = data.azurerm_resource_group.rg.name
xml_content = <<XML
<policies>
<inbound>
<set-variable name="ContainerName" value="@(context.Request.Headers.GetValueOrDefault("Container"))" />
<set-variable name="BlobName" value="@(context.Request.Headers.GetValueOrDefault("Blob"))" />
<base />
<set-header name="Blob" exists-action="delete" />
<set-header name="Container" exists-action="delete" />
<set-header name="x-ms-version" exists-action="override">
<value>@{string version = "2017-11-09"; return version;}</value>
</set-header>
<set-backend-service base-url="@{
string containerName = context.Variables.GetValueOrDefault<string>("ContainerName");
string blobName = context.Variables.GetValueOrDefault<string>("BlobName");
return String.Format("https://${var.storage_account_name}.blob.core.windows.net/{0}/{1}", containerName, blobName);
}" />
<authentication-managed-identity resource="https://storage.azure.com/" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
XML  
}

问题可能是因为没有设置base-URL &在这种情况下,API管理器服务不会使用id检测后端组件。所以我们需要同时指定基础url和后端id。

相同问题的解决方案

如果您仍然面临这个问题,请检查下面的步骤:

此策略将调用路由到最近的两个后端服务中,如果返回HTTP 404,则将故障转移到辅助服务。

它假设API管理器部署在"美国东部"one_answers"西欧"。类似地,该策略(按原样)假设两个后端服务位于相同的区域,vis:

https://hello-eus.azurewebsites.net/(美国东部);和

https://hello-weu.azurewebsites.net/(用于西欧)

如果从后端服务返回失败(HTTP 404),策略将把调用重新路由到故障转移区域。

策略使用缓存值来跟踪哪个服务在过去10秒内返回了错误,以避免将新请求路由到可能失败的后端。

<retry condition="@(context.Response.StatusCode == 404)" count="2" interval="1" max-interval="10" delta="1" first-fast-retry="true">

使用重试策略内部的逻辑,请参阅此处

请参考这里

我在使用OpenAPI JSON文件在APIM中创建api时面临同样的问题。

我可以通过添加来解决这个问题Depends_on =[被依赖资源的名称](azurerm_api_management_api_operation.)在azurerm_api_management_api_policy资源

希望有帮助!

最新更新