You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
}

关键细节说明

  1. Terraform层面做判断:用Terraform内置的contains函数在渲染策略模板时完成API名称匹配,符合条件就插入<rate-limit>节点,否则插入空字符串,避免APIM运行时识别陌生函数。
  2. 无效ApiKey限流逻辑:通过context.Request.Headers.GetValueOrDefault获取请求的ApiKey,默认值设为Default,当Key不存在或为Default时,触发rate-limit-by-key规则。
  3. 多字符串匹配扩展:如果需要匹配多个关键词(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:14:53