Проект был создан 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, но ошибка не исчезла. Я использовал разные форматы в части «projectID» в запросе billingUp: projectName, projects / projectName, projectID, projects / projectID, и ничего не работает. Возможные решения?
Попробуйте эту команду: gcloud beta billing accounts list
. Если это сообщает об ошибке API, вы не включили выставление счетов. Если это работает, значит, у вас проблема с кодом или вы недостаточно долго ждали включения API.
@JohnHanley команда работает без проблем, показывает имя, идентификатор и статус учетных записей.
@DustinIngram Хм, я сомневаюсь в этом, потому что уже два дня я пробую это.
Убедитесь, что номер учетной записи проекта соответствует проекту для учетных данных учетной записи службы, которую вы используете.
Я просто нашел обходной путь, очень примитивное решение, но сработало. Надеюсь, есть другой способ сделать это. Все, что я сделал, это вызвал командную оболочку с помощью os.system и использовал gcloud для ее включения:
billing_command = "gcloud beta billing projects link {} --billing-account {}".format(projectID, billingAccount)
os.system(billing_command)
Приведенная в ответе ошибка достаточно информативна. Прежде чем использовать определенные API или службы в GCP, вам необходимо сначала включить их с помощью консоли. В этом примере Cloud Billing API
не включен. Перейдите по следующему URL-адресу. (Этот URL также указан в ответе).
https://console.developers.google.com/apis/api/cloudbilling.googleapis.com/overview?project=XXXXXXXXXXX
Замените XXXXXXXXXXX
на идентификатор проекта. Вы увидите интерфейс, как показано ниже. Щелкните ENABLE
.
Теперь мы подошли ко второй части сообщения об ошибке. Вам действительно нужно подождать около 5 минут. Следующее сообщение об ошибке действительно просит вас сделать это.
If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
Теперь запустите свой запрос API, и вы получите ответ.
Используйте приведенный ниже код, эти документы 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())
Возможно ли, что биллинг действительно был включен, но еще не распространен?