在Firebase项目之间迁移Firestore数据

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

#!/bin/bash

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

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

GCLOUD_STORAGE=$3

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的命名范围.它进一步假设已经为source project和dest项目创建了一个服务帐户,该服务帐户遵循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管理员
>所有者
>存储管理员

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

无论我分配的权限与原始项目帐户的权限相匹配,我都无法实现这一点.

该问题的解决方案是创建一个默认服务帐户以“拥有”其中一个项目,并为其他环境分配所需的权限.这种方法适用于通用服务帐户失败的情况.

我不知道为什么会这样,但这是让我前进的原因.我希望它对你也有用.

点赞