如何使用 Cloud Armor 对 Firebase 函数进行速率限制

How to rate limit a firebase function with Cloud Armor

我有一个 public 可访问的云功能(firebase 功能),我想在 Google Cloud Armor 的帮助下限制此功能的速率。

然而,这并不像我想的那样是一项微不足道的任务,我找不到太多关于设置这样的东西的文档。

document 准确说明了我的需要,但未提供任何指导以将其设置为云功能。

当我尝试在 GCP 控制台中添加 Cloud Armor 策略时,我什至无法添加目标

我使用的是标准(不是 Managed Protection Plus)计划,但我认为这应该没问题。

Cloud Armor 不支持速率限制 Cloud Functions。您应该直接在云函数中使用 maxInstances 选项。这将允许您控制函数的同时执行。

If an HTTP function is scaled up to the maxInstances limit, new requests are queued for 30 seconds and then rejected with a response code of 429 Too Many Requests if no instance is available by then.

Cloud Armor 是一种 WAF,Web 应用程序防火墙,用于在 OSI 层的应用程序级别过滤流量。它不是速率限制器或身份验证层。

为此,您需要添加一个 API 管理层,允许您对 API 进行身份验证和速率限制。 API 网关可以做到这一点,但只能基于 API 密钥。如果用户不使用 API 密钥,它是一个受速率限制的公共池,垃圾邮件发送者可以通过每次消耗所有配额来创建服务不可用。

APIGee 是另一个解决方案,但它是企业级的(具有企业级计费计划)。


或者,如果是为了保护您的资金,您可以限制函数实例的数量,这要感谢 Kunal Deo 的出色回答。

请注意,如果来自该服务的所有用户都使用相同的 API 密钥,之前提供的解决方案(仅 API 网关)将提供 service/application 级别的速率限制。单个用户可能会耗尽您的整个报价并阻止其他用户执行功能。

如果您需要通过 IP 地址(或类似地址)进行速率限制,您可以:

  1. 将您的函数设为私有(没有调用 allUsers 或 allAuthenticatedUsers 的权限,只能调用服务帐户)。如果愿意,您可以在函数前面放置一个 API 网关。
  2. 在您的函数(无服务器 NEG)或您的 API 网关前使用负载均衡器。 LB 必须具有使用服务帐户的调用权限
  3. 添加 Cloud Armor 以保护负载均衡器并对其进行速率限制。

至少从阅读文档来看,它应该可以工作:

https://cloud.google.com/load-balancing/docs/https/setting-up-https-serverless

https://cloud.google.com/armor/docs/rate-limiting-overview