APIM Terraform策略部署报错:contains不在当前上下文
解决方案
核心问题分析
你遇到的"The name 'contains' does not exist in the current context"报错,是因为在APIM策略的XML中误用了Terraform的contains函数——APIM的策略运行环境不识别Terraform的内置函数,得把判断逻辑移到Terraform的模板渲染阶段完成。
整合策略的代码实现
下面的代码会在Terraform层面判断API名称是否包含指定字符串(比如api_a),动态插入对应限流规则,同时保留针对无效ApiKey(值为Default)的限流逻辑,全程无需单独XML文件:
resource "azurerm_api_management_api_policy" "api_policies" { for_each = var.target_apis # 替换为你的API集合变量 api_name = each.value.name api_management_name = azurerm_api_management.your_apim_instance.name resource_group_name = azurerm_resource_group.your_rg.name policy = <<EOF <policies> <inbound> <!-- 针对无效/默认ApiKey的限流规则:无Key或Key为Default时触发 --> <rate-limit-by-key calls="100" renewal-period="60" counter-key='@(context.Request.Headers.GetValueOrDefault("Ocp-Apim-Subscription-Key", "Default"))' /> <!-- 仅当API名称包含"api_a"时,添加额外通用限流 --> ${contains(each.value.name, "api_a") ? <<EOT <rate-limit calls="50" renewal-period="60" /> EOT : ""} </inbound> <backend> <forward-request /> </backend> <outbound /> <on-error /> </policies> EOF }
关键细节说明
- Terraform层面做判断:用Terraform内置的
contains函数在渲染策略模板时完成API名称匹配,符合条件就插入<rate-limit>节点,否则插入空字符串,避免APIM运行时识别陌生函数。 - 无效ApiKey限流逻辑:通过
context.Request.Headers.GetValueOrDefault获取请求的ApiKey,默认值设为Default,当Key不存在或为Default时,触发rate-limit-by-key规则。 - 多字符串匹配扩展:如果需要匹配多个关键词(比如
api_a和api_b),可以把判断条件改成:${contains(each.value.name, "api_a") || contains(each.value.name, "api_b") ? <<EOT <rate-limit calls="50" renewal-period="60" /> EOT : ""}
内容的提问来源于stack exchange,提问作者Panda
相关产品推荐
相关产品推荐

