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

如何在Google Cloud Armor中为特定URL应用基于速率的限流?

在Google Cloud Armor中为特定URL配置基于速率的限流

要给/login和/insert这类特定URL端点设置不同的速率限流,不需要依赖enforceOnKey: HTTP_PATH的128字节限制,而是通过Cloud Armor安全规则的CEL表达式匹配URL路径,再为每个路径绑定独立的速率限制策略即可。以下是具体的Pulumi实现示例:

核心思路

  1. 为每个目标URL创建独立的速率限制策略,定义对应的QPS阈值
  2. 编写安全规则,用CEL表达式精准匹配目标URL路径
  3. 将规则与对应的速率策略关联,实现针对性限流

Pulumi代码示例(TypeScript)

import * as gcp from "@pulumi/gcp";

// 1. 创建速率限制策略
// 为 /login 设置1000 QPS的限流阈值
const loginRatePolicy = new gcp.compute.SecurityPolicyRuleRateLimitOptions("login-rate-policy", {
    enforceOnKey: "IP", // 按客户端IP维度限流,也可根据需求选其他维度
    rateLimitThreshold: {
        count: 1000,
        intervalSec: 1, // 1秒内允许1000次请求
    },
});

// 为 /insert 设置10000 QPS的限流阈值
const insertRatePolicy = new gcp.compute.SecurityPolicyRuleRateLimitOptions("insert-rate-policy", {
    enforceOnKey: "IP",
    rateLimitThreshold: {
        count: 10000,
        intervalSec: 1,
    },
});

// 2. 创建Cloud Armor安全策略
const securityPolicy = new gcp.compute.SecurityPolicy("url-rate-limit-policy", {
    description: "针对特定URL的速率限流策略",
});

// 3. 添加 /login 的限流规则
new gcp.compute.SecurityPolicyRule("login-rate-limit-rule", {
    securityPolicy: securityPolicy.name,
    action: "rate_based_ban", // 超过阈值后执行封禁,可根据需求改为"allow"或"redirect"等
    priority: 1000, // 优先级数值越小,规则执行顺序越靠前
    match: {
        expr: {
            // 匹配/login及所有子路径,如/login/verify
            expression: "request.path == '/login' || request.path.startsWith('/login/')",
        },
        versionedExpr: "SRC_IPS_V1",
    },
    rateLimitOptions: loginRatePolicy,
});

// 4. 添加 /insert 的限流规则
new gcp.compute.SecurityPolicyRule("insert-rate-limit-rule", {
    securityPolicy: securityPolicy.name,
    action: "rate_based_ban",
    priority: 1001,
    match: {
        expr: {
            expression: "request.path == '/insert' || request.path.startsWith('/insert/')",
        },
        versionedExpr: "SRC_IPS_V1",
    },
    rateLimitOptions: insertRatePolicy,
});

关键细节说明

  • URL匹配逻辑:使用request.path(请求的路径部分)而非完整的httpRequest.requestUrl,更精准且避免额外的URL解析。如果需要精确匹配(不包含子路径),可将表达式改为request.path == '/login';支持正则匹配,比如request.path.matches(r'^/login(/.*)?$')。
  • 限流维度:示例中用enforceOnKey: "IP"按客户端IP限流,也可根据业务需求选择HTTP_HEADER(指定请求头)、HTTP_COOKIE等维度。
  • 动作选择:rate_based_ban会在超过阈值后封禁请求,若仅需返回429状态码,可结合responseHeaderAction自定义响应,或选择合适的动作类型。

内容的提问来源于stack exchange,提问作者Aviral Srivastava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:38:23