0

我需要开发一个 Cloud Function 脚本来停止对特定服务的计费,以防成本爆炸。

示例:想象一下,出于某种原因,Pub/Sub 的成本很高。

My Cloud Function 必须检测到此事件(我已经知道如何操作)并仅禁用此服务计费。

有没有办法做到这一点?我看到我可以禁用 API Service。是否可以使用 Cloud Function 禁用发布/订阅 API 服务?有代码示例吗?它会禁用此服务的计费吗?或者更好的方法是删除有问题的发布/订阅?

4

1 回答 1

0

当您禁用某个 API 时,您可能会删除该 API 创建的所有资源,并且您还将禁用依赖于您正在禁用的 API 的其他 API。根据您在提到的特定情况下您在项目中使用的产品,如果您禁用 Pub/Sub API,您可能会禁用以下 API:

cloudbuild.googleapis.com
cloudfunctions.googleapis.com
containerregistry.googleapis.com
run.googleapis.com
...among others

如果您知道禁用 API(以及所有其他相关 API)可能会在您的项目中导致的风险和中断,如果您在生产中有某些东西,那么使用Python 客户端库中的服务使用 API 的禁用方法的以下代码将起作用将禁用数据流 API:

from googleapiclient import discovery
import google.auth

def hello_world(request):
    credentials, project_id = google.auth.default()
    name = 'projects/[PROJECT-NUMBER-NOT-ID]/services/dataflow.googleapis.com'
    body = {'disableDependentServices': True,}
    service = discovery.build('serviceusage', 'v1', credentials=credentials, cache_discovery=False)
    request = service.services().disable(name=name, body=body)
    try:
        response = request.execute()
    except Exception as e:
        print(e)
    return "API disabled"

通过检查您的活动日志,您应该会在触发云功能后看到与以下类似的消息:

9:12 AM Completed: google.api.serviceusage.v1.ServiceUsage.DisableService [PROJECT-ID]@appspot.gserviceaccount.com has executed google.api.serviceusage.v1.ServiceUsage.DisableService on dataflow.googleapis.com
9:12 AM google.api.serviceusage.v1.ServiceUsage.DisableService [PROJECT-ID]@appspot.gserviceaccount.com has executed google.api.serviceusage.v1.ServiceUsage.DisableService on dataflow.googleapis.com

请注意,根据您使用的产品,禁用 API 的这种方法可能会停止与例如网络流量相关的所有计费费用,但一般而言,Cloud SQL 实例中的存储定价等费用仍将继续产生。

一般来说,我个人认为这不是最好的方法(因为如果你有一个生产中的应用程序并且其他 API 依赖于这个 API,那么禁用 API 可能会非常危险),我通常会考虑使用预算和预算警报(即还使用 Cloud Functions 和其他服务(如 Pub/Sub)来接收通知)。在此处此处查找有关预算和预算警报的文档的所有相关部分。

于 2020-02-27T09:38:04.093 回答