Я хочу добавить условие, которое позволяло бы мне добавлять индивидуальный лимит скорости, только если он задан (local.limit == true
), в противном случае не добавляйте его в политику. он работает нормально, если есть ограничение скорости, но если ограничения скорости нет, выдает ошибку
Атрибут «вызовы» недействителен. Значение «выходит за пределы допустимого». диапазон значений.
согласно https://learn.microsoft.com/en-us/azure/api-management/rate-limit-policy Calls является обязательным полем.
variable "rate_limit" {
type = string
}
locals {
j = "context.Request.Headers.GetValueOrDefault(\"Authorization\", \"\").AsJwt()?.Subject"
s = "context.Subscription.Id"
limit = var.rate_limit != ""
}
<choose>
<when condition = "@((${local.j} != null || ${local.s} != null) && (${local.limit == true}))">
<rate-limit-by-key calls = "${var.rate_limit}" renewal-period = "60" counter-key = "@(${local.j} ?? ${local.s})" />
</when>
<when condition = "@(context.Request.Headers.GetValueOrDefault("ApiKey") == "Default")">
<rate-limit-by-key calls = "100" renewal-period = "60" counter-key = "@(context.Request.IpAddress)" />
</when>
</choose>
План выглядит так
<when condition = "@((context.Request.Headers.GetValueOrDefault("Authorization", "").AsJwt()?.Subject != null || context.Subscription.Id != null) && (false))">
<rate-limit-by-key calls = "" renewal-period = "60" counter-key = "@(context.Request.Headers.GetValueOrDefault("Authorization", "").AsJwt()?.Subject ?? context.Subscription.Id)" />
</when>
Да, если я получаю ограничение скорости из какой-то конфигурации API. Это работает нормально, но если в какой-то конфигурации API нет ограничения скорости, то выдается ошибка. Есть ли способ динамически добавлять условие, например, если установлено ограничение скорости, то следует добавлять только условие.
Вместо передачи (${local.limit == true})
можете ли вы попробовать передать только ${local.limit}
, чтобы он проверял, существует он или нет, и продолжил выполнение условий. @Панда
Я пробовал это раньше, но выдает ту же ошибку
Вы пробовали использовать <empty-policy /> @Panda?
У вас есть пример?
<choose><when condition='@((${local.s} != null) && ${local.limit})'> <empty-policy /> </when>
Аналогично. @Панда
но я также хочу добавить политику, когда local.limit имеет значение false, что означает, что предоставляется ограничение скорости. И не хочу добавлять политику, если ограничение скорости не предусмотрено.
Добавьте local.limit == false
и попробуйте добавить указанное выше. @Панда
вы имеете в виду два отдельных условия?<when condition = "@((${local.j} != null || ${local.s} != null) && (${local.limit == true}))"> <rate-limit-by-key calls = "${var.rate_limit}" renewal-period = "60" counter-key = "@(${local.j} ?? ${local.s})" /> <when condition='@((${local.s} != null) && ${local.limit})'> <empty-policy />
</when>
Да. Вы пробовали это? @Панда
я не пробовал, потому что это не то, что я хотел. Я нашел другое решение
мне удалось это исправить
locals {
j = "context.Request.Headers.GetValueOrDefault(\"Authorization\", \"\").AsJwt()?.Subject"
s = "context.Subscription.Id"
limit = var.rate_limit != ""
rate_limit_config = <<XML
<when condition = "@(${local.j} != null || ${local.s} != null)">
<rate-limit-by-key calls = "${var.rate_limit}" renewal-period = "60" counter-key = "@(${local.j} ?? ${local.s})" />
</when>
XML
}
<choose>
${var.api.rate_limit != "" ? local.rate_limit_config : var.api.rate_limit}
<when condition = "@(context.Request.Headers.GetValueOrDefault("ApiKey") == "Default")">
<rate-limit-by-key calls = "10" renewal-period = "1" counter-key = "@(context.Request.IpAddress)" />
</when>
Если вы передаете первое условие, выдается ошибка? @Панда