Не удается включить выставление счетов для нового проекта Google Cloud Platform в Python API

Проект был создан 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, и ничего не работает. Возможные решения?

Возможно ли, что биллинг действительно был включен, но еще не распространен?

Dustin Ingram 18.12.2018 23:22

Попробуйте эту команду: gcloud beta billing accounts list. Если это сообщает об ошибке API, вы не включили выставление счетов. Если это работает, значит, у вас проблема с кодом или вы недостаточно долго ждали включения API.

John Hanley 18.12.2018 23:26

@JohnHanley команда работает без проблем, показывает имя, идентификатор и статус учетных записей.

Irribarra Cristián 19.12.2018 14:29

@DustinIngram Хм, я сомневаюсь в этом, потому что уже два дня я пробую это.

Irribarra Cristián 19.12.2018 14:32

Убедитесь, что номер учетной записи проекта соответствует проекту для учетных данных учетной записи службы, которую вы используете.

John Hanley 19.12.2018 20:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
5
1 790
3

Ответы 3

Я просто нашел обходной путь, очень примитивное решение, но сработало. Надеюсь, есть другой способ сделать это. Все, что я сделал, это вызвал командную оболочку с помощью 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())

Другие вопросы по теме