在Firebase项目之间迁移Firestore数据

时间:2019-01-06 00:40:46

标签: firebase google-cloud-firestore google-cloud-storage data-migration

我正在尝试使用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中的凭据文件。进一步假设已按照importexport@<project_id>.iam.gserviceaccount.com的命名约定为源项目和dest项目创建了一个服务帐户。

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

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

我已确保服务帐户都具有对同一GCLOUD_STORAGE的权限。但是我仍然遇到以下错误:

  

错误:(gcloud.beta.firestore.import)PERMISSION_DENIED:呼叫者没有权限

是否有人尝试完成类似的任务?知道为什么我还会遇到权限问题吗?

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

  • Cloud Datastore Import Export Admin
  • 云数据存储所有者
  • 云文件存储编辑器
  • Firebase管理员
  • 所有者
  • 存储管理员

1 个答案:

答案 0 :(得分:1)

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

无论我将权限分配得多么接近原始项目帐户的权限,我都无法使它正常工作。

该问题的解决方案是采用一个默认服务帐户之一来“拥有”一个项目,并将其分配给其他环境所需的权限。这种方法在通用服务帐户失败的情况下有效。

我不知道为什么这样做,但这正是使我前进的原因。我希望它也对您有用。