我正在尝试使用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:呼叫者没有权限
是否有人尝试完成类似的任务?知道为什么我还会遇到权限问题吗?
这是我分配给两个帐户的权限,并且两个帐户都作为成员添加到彼此的存储中。
答案 0 :(得分:1)
当我最初发布此问题时,我创建了一个专门的服务帐户,该帐户专门用于访问与传输有关的所有环境。这样做意味着我必须确保一个服务帐户对Firebase项目以及存储文件的存储桶都具有正确的权限(就我而言,这在技术上是在第三个项目中)。
无论我将权限分配得多么接近原始项目帐户的权限,我都无法使它正常工作。
该问题的解决方案是采用一个默认服务帐户之一来“拥有”一个项目,并将其分配给其他环境所需的权限。这种方法在通用服务帐户失败的情况下有效。
我不知道为什么这样做,但这正是使我前进的原因。我希望它也对您有用。