首页 > 解决方案 > 无法在 Python API 中为新的 Google Cloud Platform 项目启用计费

问题描述

该项目是由 Python 使用 google_application_defaults 创建的,计费 API 已成功激活并在命令行上检查

os.system(gcloud services enable cloudbilling.googleapis.com)
os.system(gcloud services list --enabled)

然后,运行时:

from googleapiclient import discovery, errors, logging
CB = discovery.build("cloudbilling", "v1", credentials = default_creds,  cache_discovery = False)   
billing_body = {"projectID": projectID, "name": "projects/"+projectID+"/billingInfo", "billingEnabled": True, "billingAccountName": "billingAccounts/"+billingAccount}
billingUP = CB.projects().updateBillingInfo(name = projectID, body = billing_body )
try:
    billing_resp = billingUP.execute()
    print("Billing succesfully enabled")
except errors.HttpError as err:
    billing_resp = None
    print("request voided")
    logging.error("There was an error creating the project. Check:")
    logging.error(err._get_reason())

我收到以下错误:

Cloud Billing API has not been used in project XXXXXXXXXX before or it  is disabled. Enable it by visiting https://console.developers.google.com/apis/api/cloudbilling.googleapis.com/overview?project=XXXXXXXXXXX then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

我还尝试在 python 脚本之外的命令行上直接激活它,但错误仍然存​​在。我在 billingUp 请求的“projectID”部分中使用了不同的格式:projectName、projects/projectName、projectID、projects/projectID,但没有任何效果。任何可能的解决方案?

标签: pythongoogle-cloud-platformgcloudgoogle-api-client

解决方案


请使用下面的代码,这些 GCP 文档非常不清楚,难以理解和实现

from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
projectID="<project id>"
biling_account_id = "<billing account id>"
credentials = GoogleCredentials.get_application_default()
from googleapiclient import discovery, errors, logging
CB = discovery.build("cloudbilling", "v1", credentials = credentials)   
 
billing_body = {
  "name": "projects/"+ projectID+"/billingInfo",
  "projectId": projectID,
  "billingEnabled": True,
  "billingAccountName": "billingAccounts/"+biling_account_id
}


print(billing_body)

billingUP = CB.projects().updateBillingInfo(name = "projects/"+ projectID,body=billing_body)
try:
    billing_resp = billingUP.execute()
    print("Billing succesfully enabled")
except errors.HttpError as err:
    billing_resp = None
    print("request voided")
    logging.error("There was an error enabling billing for the project. Check:")
    logging.error(err._get_reason())

推荐阅读