如何在Google Cloud Armor中为特定URL应用基于速率的限流?
在Google Cloud Armor中为特定URL配置基于速率的限流
要给/login和/insert这类特定URL端点设置不同的速率限流,不需要依赖enforceOnKey: HTTP_PATH的128字节限制,而是通过Cloud Armor安全规则的CEL表达式匹配URL路径,再为每个路径绑定独立的速率限制策略即可。以下是具体的Pulumi实现示例:
核心思路
- 为每个目标URL创建独立的速率限制策略,定义对应的QPS阈值
- 编写安全规则,用CEL表达式精准匹配目标URL路径
- 将规则与对应的速率策略关联,实现针对性限流
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
相关产品推荐
相关产品推荐

