Я пытаюсь настроить запланированную функцию firebase, которая будет экспортировать все коллекции в Firestore каждые 24 часа. Я использую этот скрипт для этого:
import {fs} from '../services/firestore';
import * as functions from 'firebase-functions';
import * as firestore from '@google-cloud/firestore';
const client = new firestore.v1.FirestoreAdminClient();
const bucket = 'gs://my-cool-backup';
export const scheduledFirestoreExport = functions
.region('europe-west1')
.pubsub
.schedule('every 24 hours')
.onRun(async (context) => {
const collections = await fs.listCollections();
const projectId = process.env.GCP_PROJECT || process.env.GCLOUD_PROJECT;
const databaseName =
client.databasePath(projectId, '(default)');
const responses = await client.exportDocuments({
name: databaseName,
outputUriPrefix: bucket,
collectionIds: collections.map(x => x.id)
});
const response = responses[0];
console.log(`Operation Name: ${response['name']}`);
return response;
});
../services/firestore
выглядит так:
import * as settings from '../settings.json';
import * as serviceAccount from '../firebase-admin.json';
import * as admin from 'firebase-admin';
export const fs = admin.initializeApp({
credential: admin.credential.cert(serviceAccount as any),
...settings.firebase
}).firestore();
Когда я запускаю функцию с помощью Google Cloud Platform, это вывод:
Error: function execution failed. Details:
7 PERMISSION_DENIED: The caller does not have permission
У учетной записи службы, которую я использую, есть следующие разрешения
У меня много функций, работающих без проблем, только этот терпит неудачу. Я подозреваю, что это из-за @google-cloud/firestore
, тогда как другие используют только firebase-admin
Сообщение об ошибке дает мне очень мало go с. Что мне здесь не хватает?