Я разрабатываю облачную функцию Firebase, которая собирает метаданные из файла, хранящегося в хранилище Firebase
Мой код выглядит примерно так:
const { Storage } = require('@google-cloud/storage');
const storage = new Storage();
exports.someFunction = functions.https.onCall((data, context) => {
getMetadata("myBucket", data.filename)
.then(() => {
console.log("OK");
return;
})
.catch(err => {
console.error(err);
})
// do some other stuff here ....
return;
}
async function getMetadata(bucketName, filename) {
const [metadata] = await storage
.bucket(bucketName)
.file(filename)
.getMetadata(); <<== ERROR HAPPENS IN THIS CALL
console.log(metadata.selfLink);
console.log(metadata.size);
}
Всякий раз, когда вызывается storage.bucket(bucketName).file(filename).getMetadata()
как указано в приведенном выше коде, это приводит к 403 с «Проектом, подлежащим выставлению счета, связан с отсутствующим платежным счетом».Я попытался запустить его как локально (с firebase functions:shell
), так и развернуть.Вот полное сообщение об ошибке:
{ Error: The project to be billed is associated with an absent billing account.
at Util.parseHttpRespBody (/srv/node_modules/@google-cloud/common/build/src/util.js:191:38)
at Util.handleResp (/srv/node_modules/@google-cloud/common/build/src/util.js:135:117)
at retryRequest (/srv/node_modules/@google-cloud/common/build/src/util.js:423:22)
at onResponse (/srv/node_modules/retry-request/index.js:200:7)
at /srv/node_modules/teeny-request/build/src/index.js:222:13
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:229:7)
code: 403,
errors:
[ { domain: 'global',
reason: 'accountDisabled',
message: 'The project to be billed is associated with an absent billing account.',
locationType: 'header',
location: 'Authorization' } ],
response: undefined,
message: 'The project to be billed is associated with an absent billing account.' }
Этот проект Firebase уже несколько недель включен в "план Blaze", а платежный аккаунт включен уже около года, а также взимается плата за другие проекты GCP..
Я прочитал, что служебная учетная запись должна иметь разрешение «signBlob», которое я попытался добавить «Создателем токена учетной записи службы» в учетную запись службы AppEngine по умолчанию и в служебную учетную запись Firebsae.
Я также попытался инициализировать хранилище с помощью административного SDK Firebase
const serviceAccount = require("path-to-json-downloaded-from-firebase-console.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://<my-project>.firebaseio.com"
});
const storage = admin.storage();
Но мне не повезло ни с одним из них.
Я не смог выяснить, какая учетная запись «отключена» или «отсутствует»'ни что еще я должен настроить, чтобы это работало и застряло.
Любые указатели, которые могут заставить меня устранять неполадки далее, очень помогли бы.