尝试在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代码添加策略是部署策略的正确方法?
Part of the main.tf file
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
}
2条答案
按热度按时间ercv8c1e1#
发生此问题的原因可能是未设置base-URL和Backend-id属性,在这种情况下,API Manager服务不会使用该ID检测后端组件。因此,我们需要同时指定base-URL和backend-id。
same issues解决方案
如果您仍面临问题,请检查以下步骤:
此策略将调用路由到两个后端服务中最近的一个,如果返回HTTP 404,则故障转移到辅助服务。
它假定API Manager部署在"美国东部"和"西欧"。同样,该策略(按原样)假定两个后端服务位于相同的区域,即:
https://hello-eus.azurewebsites.net/
(适用于美国东部);和https://hello-weu.azurewebsites.net/
(适用于西欧)如果从后端服务返回失败(HTTP 404),则策略会将调用重新路由到故障转移区域。
该策略使用缓存的值来跟踪哪个服务在最近10秒内返回了错误,以避免将新请求路由到可能会失败的后端。
使用重试策略中的逻辑,请参阅此处
参考here
6l7fqoea2#
我在使用OpenAPI JSON文件在APIM中创建API时遇到了同样的问题。
我可以通过在azurerm_api_management_api_policy资源中添加depends_on =[从属资源的名称(在您的示例中为azurerm_api_management_api_operation. api操作)]来解决此问题。
希望能有所帮助!