在 Firebase 项目之间迁移 Firestore 数据

Migrate Firestore data between Firebase projects

我正在尝试使用 gcloud cli 将数据从我们的 firebase 开发项目迁移到我们的 firebase 测试项目。为了完成任务,我创建了以下脚本。

#!/bin/bash

SRC_PROJECT=
SRC_ACCOUNT="importexport@$SRC_PROJECT.iam.gserviceaccount.com"
SRC_CREDENTIALS=/home/$SRC_PROJECT.json

DEST_PROJECT=
DEST_ACCOUNT="importexport@$DEST_PROJECT.iam.gserviceaccount.com"
DEST_CREDENTIALS=/home/$DEST_PROJECT.json

GCLOUD_STORAGE=

echo "-------------------------------------------"
echo " Activate Service Account $SRC_PROJECT"
echo "-------------------------------------------"
gcloud --quiet config set project ${SRC_PROJECT}
gcloud beta auth activate-service-account ${SRC_ACCOUNT} --key-file=${SRC_CREDENTIALS} 


echo "-------------------------------------------"
echo " Exporting $SRC_PROJECT"
echo "-------------------------------------------"
gcloud beta firestore export $GCLOUD_STORAGE > ./meta.txt

echo "-------------------------------------------"
echo " Activate Service Account $DEST_PROJECT"
echo "-------------------------------------------"
gcloud --quiet config set project ${DEST_PROJECT}
gcloud beta auth activate-service-account ${DEST_ACCOUNT} --key-file=${DEST_CREDENTIALS} 

echo "-------------------------------------------"
echo "Importing $DEST_PROJECT $(grep -o 'gs://.*$' ./meta.txt)"
echo "-------------------------------------------"
gcloud beta firestore import $(grep -o 'gs://.*$' ./meta.txt)

此脚本假定您的凭据文件位于 /home 并遵循 <project_id>.json 的命名约定。它还假定已为遵循 importexport@<project_id>.iam.gserviceaccount.com.

命名约定的源项目和目标项目创建服务帐户

运行脚本就像执行以下命令一样简单...

%> ./migrate.sh dev-project-id test-project-id google-storage

我已确保服务帐户都拥有相同的权限 GCLOUD_STORAGE。但是我仍然收到以下错误:

ERROR: (gcloud.beta.firestore.import) PERMISSION_DENIED: The caller does not have permission

有没有其他人试图完成类似的事情?知道为什么我仍然会遇到权限问题吗?

这是我分配给两个帐户的权限,并且两个帐户都作为成员添加到彼此的存储中。

当我最初发布这个问题时,我创建了一个专门用于访问与传输相关的所有环境的专用服务帐户。这样做意味着我必须确保一个服务帐户对两个 Firebase 项目以及存储文件的存储桶都有正确的权限(在我的例子中,这在技术上是在第三个项目中)。

无论我分配的权限与原始项目帐户的权限多么接近,我都无法让它工作。

该问题的解决方案是采用为 "own" 其中一个项目创建的默认服务帐户之一,并将其​​分配给其他环境所需的权限。这种方法适用于通用服务帐户失败的情况。

我不知道为什么会这样,但它使我能够继续前进。我希望它也对你有用。

Update There is now new documentation on the Firebase website that shows how to setup the correct permissions for a user to be able to have access to both environments ... BUT there is no way currently to define a service account that spans both environments. Service accounts can't be defined at the company level ... only the project level. This is why I was seeing the failures trying to define one service account with access to two projects.