设置响应 Header 与 remaining-calls Azure API 管理
Set Response Header With remaining-calls Azure API Management
我正在使用 Azure API 管理,并根据订阅进行一些速率限制。我需要在响应 headers 中向用户发送剩余通话次数。我知道我应该在出站策略中设置一些值,但我不知道如何做。这是我的政策 XML 如果有人可以提供帮助。
<policies>
<inbound>
<base />
<set-variable name="remainingCalls" value="remaining-calls-variable-name" />
<quota-by-key calls="5" renewal-period="86400" counter-key="@(context.Subscription?.Key ?? "anonymous")" increment-condition="@(context.Response.StatusCode >= 200 && context.Response.StatusCode < 300)" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
<set-header name="remainingCalls" exists-action="append">
<value>@(context.Response.Headers.GetValueOrDefault("remaining-calls-header-name","2"))</value>
</set-header>
</outbound>
<on-error>
<base />
</on-error>
</policies>
根据 Azure Documentation,您只能在 inbound
部分通过订阅设置速率限制,策略范围应该是产品、api 或操作。
这是示例,其中每个订阅的速率限制为每 90 秒 30 次调用。每次策略执行后,该时间段允许的剩余调用存储在变量remainingCallsPerSubscription
.
中
<policies>
<inbound>
<base />
<rate-limit calls="30" renewal-period="90" remaining-calls-variable-name="remainingCallsPerSubscription"/>
</inbound>
<outbound>
<base />
</outbound>
</policies>
注意:每个策略文档只能使用一次该策略。
策略表达式不能用于此策略的任何策略属性。
我已经就此请求联系了 Microsoft Azure 支持,他们能够指导我找到可能有用的解决方法,并且在我的特定用例中这是一个很好的解决方案。对于配额策略,正如@Venkatesh-MAT 所提到的,不支持在响应 header 中检索剩余配额信息作为 rate-limit 策略。然而,有一个单独的 REST API 用于此目的。这是相同 https://docs.microsoft.com/en-us/rest/api/apimanagement/current-ga/quota-by-counter-keys/list-by-service.
的文档
本文档中的 API 需要不记名令牌作为身份验证。为了能够生成不记名令牌,您可以简单地使用 azure cli 使用命令 az account get-access-token --resource https://management.azure.com
获取资源令牌,或者如果您需要以编程方式执行此操作,则必须执行以下步骤:
使用具有订阅范围的 azure cli 设置原则角色以创建有权访问此资源范围的服务原则(az ad sp create-for-rbac -n "principle-1" --role contributor –scopes /subscriptions/{subscriptionID}/resourceGroups/{resourcegroup}/providers/Microsoft.ApiManagement/service/{API management Service name} /quotas/{subscription key})
使用上述步骤生成的客户端 ID、客户端密码和租户 ID 调用此 API https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token body 类型 x-www-form-urlencoded 和 body键值如下
KEY
: grant_type VALUE
: client_credentials
KEY
: client_id VALUE
: 从第 1 步生成的 appid
KEY
:范围VALUE
:https://management.azure.com/.default
KEY
: client_secret VALUE
: 从第 1 步生成的密码
然后使用输出访问令牌获取配额策略消费。
我正在使用 Azure API 管理,并根据订阅进行一些速率限制。我需要在响应 headers 中向用户发送剩余通话次数。我知道我应该在出站策略中设置一些值,但我不知道如何做。这是我的政策 XML 如果有人可以提供帮助。
<policies>
<inbound>
<base />
<set-variable name="remainingCalls" value="remaining-calls-variable-name" />
<quota-by-key calls="5" renewal-period="86400" counter-key="@(context.Subscription?.Key ?? "anonymous")" increment-condition="@(context.Response.StatusCode >= 200 && context.Response.StatusCode < 300)" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
<set-header name="remainingCalls" exists-action="append">
<value>@(context.Response.Headers.GetValueOrDefault("remaining-calls-header-name","2"))</value>
</set-header>
</outbound>
<on-error>
<base />
</on-error>
</policies>
根据 Azure Documentation,您只能在 inbound
部分通过订阅设置速率限制,策略范围应该是产品、api 或操作。
这是示例,其中每个订阅的速率限制为每 90 秒 30 次调用。每次策略执行后,该时间段允许的剩余调用存储在变量remainingCallsPerSubscription
.
<policies>
<inbound>
<base />
<rate-limit calls="30" renewal-period="90" remaining-calls-variable-name="remainingCallsPerSubscription"/>
</inbound>
<outbound>
<base />
</outbound>
</policies>
注意:每个策略文档只能使用一次该策略。
策略表达式不能用于此策略的任何策略属性。
我已经就此请求联系了 Microsoft Azure 支持,他们能够指导我找到可能有用的解决方法,并且在我的特定用例中这是一个很好的解决方案。对于配额策略,正如@Venkatesh-MAT 所提到的,不支持在响应 header 中检索剩余配额信息作为 rate-limit 策略。然而,有一个单独的 REST API 用于此目的。这是相同 https://docs.microsoft.com/en-us/rest/api/apimanagement/current-ga/quota-by-counter-keys/list-by-service.
的文档本文档中的 API 需要不记名令牌作为身份验证。为了能够生成不记名令牌,您可以简单地使用 azure cli 使用命令 az account get-access-token --resource https://management.azure.com
获取资源令牌,或者如果您需要以编程方式执行此操作,则必须执行以下步骤:
使用具有订阅范围的 azure cli 设置原则角色以创建有权访问此资源范围的服务原则
(az ad sp create-for-rbac -n "principle-1" --role contributor –scopes /subscriptions/{subscriptionID}/resourceGroups/{resourcegroup}/providers/Microsoft.ApiManagement/service/{API management Service name} /quotas/{subscription key})
使用上述步骤生成的客户端 ID、客户端密码和租户 ID 调用此 API https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token body 类型 x-www-form-urlencoded 和 body键值如下
KEY
: grant_typeVALUE
: client_credentialsKEY
: client_idVALUE
: 从第 1 步生成的 appidKEY
:范围VALUE
:https://management.azure.com/.defaultKEY
: client_secretVALUE
: 从第 1 步生成的密码
然后使用输出访问令牌获取配额策略消费。