Доступ к файлу в хранилище Firebase приводит к 403 («Проект, к которому выставляется счет, связан с отсутствующим платежным аккаунтом») - PullRequest
2 голосов
/ 06 мая 2019

Я разрабатываю облачную функцию 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();

Но мне не повезло ни с одним из них.

Я не смог выяснить, какая учетная запись «отключена» или «отсутствует»'ни что еще я должен настроить, чтобы это работало и застряло.

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

1 Ответ

1 голос
/ 06 мая 2019

Причиной было моё недопонимание того, что "bucket" и "filename" присутствуют в вызовах в коде.

В моем случае ввод bucketName в качестве gs://[my-project].appspot.com и fileName в качестве полного пути под корзиной устранили проблему.

Более явно, аргументы должны были быть такими:

const [metadata] = await storage
        .bucket("gs://[my-project].appspot.com")
        .file("path1/path2/actual-file-name")
        .getMetadata();
...