如果您想要节省费用且需要根据预算控制环境,则可以使用程序化预算通知,根据预算通知自动执行费用控制响应。
预算通知使用 Pub/Sub 主题,通过面向云的企业消息传递中间件的可扩缩性、灵活性和可靠性来提供 Cloud Billing 预算的实时状态。
本文档包含一些示例和分步说明,介绍了如何结合使用预算通知与 Cloud Run 函数来自动执行费用管理。
设置预算通知
第一步是为您的预算启用 Pub/Sub 主题。这在管理程序化预算提醒通知中有详细描述。
启用预算通知后,请注意以下事项:
- Pub/Sub 主题 - 为预算配置的通知端点。
- 预算 ID:包含在所有通知中的预算的唯一 ID。您可以在管理通知下的预算中找到该预算的 ID。在您选中将一个 Pub/Sub 主题关联到此预算后,系统即会显示该 ID。
监听通知
下一步是通过订阅 Pub/Sub 主题来监听通知。如果您没有订阅者账号,Pub/Sub 将丢弃已发布的消息,您以后将无法再进行检索。
虽然您可以通过多种方式订阅感兴趣的主题,但在以下示例中,我们将使用 Cloud Run 函数触发器。
创建 Cloud Run 函数
如需创建新的 Cloud Run 函数,请执行以下操作:
在 Google Cloud 控制台中,前往 Cloud Run 函数页面。
点击
创建函数并为函数指定对您的预算有意义的名称。在触发器下,选择 Pub/Sub 主题。
选择您在预算中配置的主题。
为要运行的函数提供源代码和依赖项。
确保将要执行的函数设置为正确的函数名称。
描述 Cloud Run 函数
如需告知 Cloud Run 函数您希望它如何处理通知,您可以使用內嵌编辑器编写代码,也可以上传文件。如需详细了解您的代码将收到的通知,请参阅通知格式。
例如,在被预算通知触发后,函数可能会记录收到的 Pub/Sub 通知、属性和数据。如需了解详情,请参阅 Pub/Sub 触发器。
查看 Cloud Run 函数事件
保存 Cloud Run 函数后,您可以点击查看日志以查看记录的预算通知。下图显示了有关函数调用的日志。
测试 Cloud Run 函数
系统会向 Pub/Sub 发送通知,订阅者则会收到这些消息。如需测试示例通知以确保函数正常运行,请使用此对象作为消息正文在 Pub/Sub 中发布消息:
{ "budgetDisplayName": "name-of-budget", "alertThresholdExceeded": 1.0, "costAmount": 100.01, "costIntervalStart": "2019-01-01T00:00:00Z", "budgetAmount": 100.00, "budgetAmountType": "SPECIFIED_AMOUNT", "currencyCode": "USD" }
您还可以添加结算账号 ID 等消息属性。如需了解详情,请参阅完整的通知格式文档。
向 Slack 发送通知
电子邮件并非在任何时候都是您及时了解云费用的最佳方式,尤其是在您的预算非常重要且具有高时效性的情况下。利用通知,您可以将预算消息转发给其他媒介。
在以下示例中,我们介绍了如何将预算通知转发给 Slack。这样一来,每次 Cloud Billing 发布预算通知时,Cloud Run 函数都会使用聊天机器人将消息发布到聊天机器人工作区的 Slack 频道。
设置 Slack 频道和权限
第一步是创建 Slack 工作区以及用于调用 Slack API 的聊天机器人用户令牌。API 令牌可以通过 https://api.slack.com/apps 进行管理。如需查看详细说明,请参阅 Slack 网站上的聊天机器人用户。
编写 Cloud Run 函数
按照创建 Cloud Run 函数中的步骤创建一个新函数。确保将触发器设置为预算所使用的同一 Pub/Sub 主题。
添加以下依赖项:
Node.js
将以下内容复制到
package.json
中:Python
将以下内容复制到
requirements.txt
中:编写代码或使用以下示例,通过 Slack API 将预算通知发布到 Slack 聊天频道。
确保正确设置以下 Slack API postMessage 参数:
- 聊天机器人用户 OAuth 访问令牌
- 频道名称
示例代码:
Node.js
Python
现在,您可以测试 Cloud Run 函数,以查看在 Slack 中显示的消息。
通过限制(停用)结算功能来停止使用
下面的示例展示了如何通过停用 Cloud Billing 设置费用上限并停止对项目的使用。停用项目结算功能将导致该项目中的所有 Google Cloud 服务(包括免费层级服务)终止。
为什么停用结算功能?
您可能会因为 Google Cloud 的相关开支存在硬性限制,而需要设置费用上限。这对于在沙盒环境中执行操作的学生、研究人员或开发者来说非常常见。在这些情况下,您希望停止支出,而且可能愿意在达到预算上限时,关停所有 Google Cloud 服务并停止使用。
在我们的示例中,我们将“acme-backend-dev”用作非生产项目,该项目的 Cloud Billing 可以安全地停用。
在开始使用此示例之前,请确保已完成以下操作:
启用 Cloud Billing API。Cloud Run 函数需要调用 Cloud Billing API 才能为项目停用 Cloud Billing。
设置预算以监控项目费用并启用预算通知。
编写 Cloud Run 函数
接下来,您需要配置 Cloud Run 函数来调用 Cloud Billing API。这样,Cloud Run 函数就可以为示例项目“acme-backend-dev”停用 Cloud Billing。
按照创建 Cloud Run 函数中的步骤创建一个新函数。确保将触发器设置为预算所使用的同一 Pub/Sub 主题。
添加以下依赖项:
Node.js
将以下内容复制到
package.json
中:Python
将以下内容复制到
requirements.txt
中:将以下代码复制到 Cloud Run 函数中。
将要执行的函数设置为
stopBilling
(Node) 或stop_billing
(Python)。GOOGLE_CLOUD_PROJECT
环境变量可能会自动设置,具体取决于您的运行时。查看自动设置的环境变量列表,并确定是否需要手动将GOOGLE_CLOUD_PROJECT
变量设为您要为其设置 Cloud Billing 上限(停用 Cloud Billing)的项目。
Node.js
Python
配置服务账号权限
Cloud Run 函数作为自动创建的服务账号运行。因此,该服务账号可以停用结算功能,而您需要为其授予正确的权限,例如 Billing Admin。
如需确定正确的服务账号,请查看 Cloud Run 函数详细信息。服务账号显示在页面底部。
您可以在 Google Cloud 控制台中的“结算”页面上管理 Billing Admin 权限。
要向服务账号授予结算账号管理员权限,请选择服务账号名称。
验证 Cloud Billing 已停用
当预算发出通知时,指定的项目将不再拥有 Cloud Billing 账号。如果您要测试函数,请发布包含上述测试消息的示例消息。Cloud Billing 账号下将不再显示此项目,且此项目中的资源(包括同一项目中的 Cloud Run 函数)已停用。
您可以在 Google Cloud 控制台中为项目手动重新启用 Cloud Billing。
有选择地控制使用量
上面的示例中所述的设置 Cloud Billing 上限(停用 Cloud Billing)操作只有两种最终结果。您的项目要么启用,要么停用。停用项目后,所有服务都将停止,且所有资源最终会被删除。
如果您需要更精细的响应,则可以有选择地控制资源。例如,如果您希望停止某些 Compute Engine 资源,但 Cloud Storage 保持不变,则可以有选择地控制使用量。这样可以降低每小时的费用,而不会完全停用您的环境。
您可以根据自己的需要编写足够细化的政策。不过,在我们的示例中,我们的项目使用许多 Compute Engine 虚拟机运行研究,并将结果存储在 Cloud Storage 中。下面的 Cloud Run 函数示例会关闭所有 Compute Engine 实例,但在超出预算后不会影响我们存储的结果。
编写 Cloud Run 函数
按照创建 Cloud Run 函数中的步骤创建一个新函数。确保将触发器设置为预算所使用的同一 Pub/Sub 主题。
确保您已添加了通过限制(停用)结算功能来停止使用中描述的依赖项。
将以下代码复制到 Cloud Run 函数中。
将要执行的函数设置为
limitUse
(Node) 或limit_use
(Python)。GCP_PROJECT
环境变量可能会自动设置,具体取决于您的运行时。查看自动设置的环境变量列表,并确定是否需要手动将GCP_PROJECT
变量设置为运行虚拟机的项目。设置 ZONE 参数。在此示例中,实例将在此地区停止。
Node.js
Python
配置服务账号权限
- Cloud Run 函数作为自动创建的服务账号运行。如需控制使用量,您需要将服务账号权限授予项目中需要进行更改的任何服务。
- 如需确定正确的服务账号,请查看 Cloud Run 函数的详细信息。服务账号显示在页面底部。
- 在 Google Cloud 控制台中,前往 IAM 页面,以设置相应权限。
转到 IAM 页面
验证实例已经停止
当预算发出通知时,Compute Engine 虚拟机会停止运行。
如需测试函数,请发布包含之前测试消息的示例消息。如需验证函数是否成功运行,请在 Google Cloud 控制台中检查您的 Compute Engine 虚拟机。