我需要开发一个云功能脚本,以在成本爆炸的情况下停止为特定服务计费。
例如:想象一下,由于某种原因,Pub/Sub有很大的成本。
我的云功能必须检测到这个事件(我已经知道怎么做了(,并且只禁用这个服务计费。
有办法做到这一点吗?我看到我可以禁用API服务。是否可以使用云功能禁用pub/sub API服务?有代码示例吗?它会禁用此服务的计费吗?或者更好的方法是删除有问题的酒吧/酒吧?
当您禁用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的方法可能会停止与网络流量相关的所有计费费用,例如,但通常情况下,云SQL实例中的存储定价等费用仍将继续累积。
一般来说,我个人认为这不是最好的方法(因为如果您在生产中有应用程序,而其他API依赖于此API,禁用API可能非常危险(,我通常会考虑使用预算和预算警报(也使用云功能和Pub/Sub等其他服务来接收通知(。在此处和此处查找文档中有关预算和预算警报的所有相关部分。
以下是我如何完全自动禁用谷歌云项目的计费,以防止超支,从而让您对此有不同的看法。禁用计费也可能产生不利影响。
- 在谷歌云控制台IAM中为项目设置服务帐户具有适用的角色,如云功能服务代理和项目计费经理
- 创建并下载服务帐户密钥.json
- 在谷歌云控制台中设置预算警报计费当实际或预测支出超过预算限额
- 使用电子邮件触发器设置pipemory工作流为您提供一个唯一的电子邮件地址,并添加一个类似于的nodejs脚本下面将使用json禁用项目计费用于在触发时从服务帐户密钥文件进行身份验证(别忘了更改变量serviceAccountKey以匹配您的key.json并更改变量name以匹配您的项目id(
- 在gmail中设置一个类似于下面的过滤器,以转发预算警报通过电子邮件通知此pipemory工作流以触发禁用的nodejs通过将billingAccountName设置为空字符串进行计费
匹配:来自:(cloudplatform-noreply@google.com)主题:(达到预算(
执行此操作:转发到xxxx@upload.pipedream.net
import {auth} from 'google-auth-library';
import {CloudBillingClient} from "@google-cloud/billing";
export default defineComponent({
async run({ steps, $ }) {
const serviceAccountKey = {
"type": "...",
"project_id": "...",
"private_key_id": "...",
...
}
let updateProjectBillingInfo = async () => {
const authClient = auth.fromJSON(serviceAccountKey);
authClient.scopes = ['https://www.googleapis.com/auth/cloud-platform'];
const billingClient = new CloudBillingClient({authClient})
const name = 'projects/your-project-id'
const projectBillingInfo = {
"billingAccountName": "",
}
const request = {
name,
projectBillingInfo,
};
const response = await billingClient.updateProjectBillingInfo(request);
return response
}
return await updateProjectBillingInfo()
},
})