Я хочу создавать бюджетные оповещения с помощью облачной функции, написанной на Python, с использованием бета-версии BillingBudgets API.
Моя облачная функция написана на Python и находится в административном проекте и направлена на создание одного бюджетного предупреждения для каждого существующего проекта в той же родительской учетной записи.
Я довольно легко получил список проектов и существующие бюджеты, но теперь у меня не получается создавать бюджеты. Я всегда получал такой ответ.
{
"error": {
"code": 403,
"message": "The caller does not have permission",
"status": "PERMISSION_DENIED"
}
}
Довольно очевидное сообщение, но учетная запись службы, используемая облачной функцией, имеет роль администратора учетной записи биллинга, поэтому я не могу понять, какое разрешение отсутствует.
Извлечение кода облачной функции:
import google.auth
from googleapiclient import discovery
scopes = ['https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/cloud-billing']
credentials, project_id = google.auth.default(scopes)
billingbudgetsService = discovery.build('billingbudgets', 'v1beta1', credentials=credentials, cache_discovery=False)
billing_account = "billingAccounts/000000-AAAAAA-BBBBBB"
budget_body = {
"budget": {
"displayName": "MyBudget",
"budgetFilter": {
"projects": [
"projects/11111111"
],
"creditTypesTreatment": "INCLUDE_ALL_CREDITS"
},
"amount": {
"specifiedAmount": {
"currencyCode": "EUR",
"units": "300"
}
},
"thresholdRules": [
{
"thresholdPercent": 0.5,
"spendBasis": "CURRENT_SPEND"
},
{
"thresholdPercent": 0.9,
"spendBasis": "CURRENT_SPEND"
},
{
"thresholdPercent": 1,
"spendBasis": "CURRENT_SPEND"
}
],
"allUpdatesRule": {
"pubsubTopic": "projects/billing-project/topics/budgets-alerts",
"schemaVersion": "1.0"
}
}
}
res = billingbudgetsService.billingAccounts().budgets().create(parent=billing_account, body=budget_body).execute()
Я уже проверил вызов API через API Explorer. с моей личной учетной записью (также администратором платежной учетной записи).
Кроме того, я получил ту же несанкционированную ошибку, отправив запрос с помощью команды curl, даже с моей личной учетной записью (которая работает с проводником API)
curl --request POST \
'https://billingbudgets.googleapis.com/v1beta1/billingAccounts/AAAAAA-BBBBBB-DDDDDDD/budgets' \
--header "authorization: Bearer $(gcloud auth application-default print-access-token)" \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"budget":{"displayName":"mybudget","budgetFilter":{"projects":["projects/11111111111"],"creditTypesTreatment":"INCLUDE_ALL_CREDITS"},"amount":{"specifiedAmount":{"currencyCode":"EUR","units":"300"}},"thresholdRules":[{"thresholdPercent":0.5,"spendBasis":"CURRENT_SPEND"},{"thresholdPercent":0.9,"spendBasis":"CURRENT_SPEND"},{"thresholdPercent":1,"spendBasis":"CURRENT_SPEND"}],"allUpdatesRule":{"pubsubTopic":"projects/project-billing/topics/budgets-alerts","schemaVersion":"1.0"}}}' \
--compressed
Поэтому я подозреваю, что это проблема с OAuth, но после нескольких обходных путей для учетных данных OAuth и генерации токенов я до сих пор понятия не имею.
Любые мысли или предложения приветствуются. Спасибо