I'm trying to programmatically update billing account for one of my projects. I'm using node client library for googleapis REST. This is my code:
const { google } = require('googleapis');
const cloudbilling = google.cloudbilling('v1');
async function main() {
let authClient;
try {
authClient = await authorize();
console.log('AUTH', authClient);
} catch (err) {
console.error(err);
}
const request = {
name: "projects/rensi-28",
requestBody: {
billingAccountName: "billingAccounts/My Billing Account"
}
};
google.options({auth: authClient});
try {
const response = (await cloudbilling.projects.updateBillingInfo(request)).data;
console.log(JSON.stringify(response, null, 2));
} catch (err) {
console.error('error:', err);
}
}
main();
async function authorize() {
const auth = new google.auth.GoogleAuth({
scopes: ['https://www.googleapis.com/auth/cloud-platform']
});
return await auth.getClient();
}
This is the error I get:
errors: [
{
message: 'The caller does not have permission',
domain: 'global',
reason: 'forbidden'
}
]
I'm using a service account and environment variable is correctly set, because I can create projects and use other APIs.
My service account has these roles:
| Level | Role |
|---|---|
| Project | Project Billing Manager |
| Project | Owner |
| Organization | Billing Account Administrator |
| Organization | Billing Account Creator |
| Organization | Project Billing Manager |
| Organization | Billing Account Viewer |
| Organization | Owner |
| Billing Account | Billing Account Administrator |
| Billing Account | Billing Account User |
| Billing Account | Billing Account Viewer |
If enable billing from gcloud with same service account it works:
gcloud alpha billing projects link p001 --billing-account 45FG32-45FG32-45FG32
gcloud alpha billing projects link p001 --billing-account 45FG32-45FG32-45FG32
billingAccountName: billingAccounts/45FG32-45FG32-45FG32
billingEnabled: true
name: projects/p001/billingInfo
projectId: bxtrb-rensi-28
What am I missing?