在 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
有没有其他人试图完成类似的事情?知道为什么我仍然会遇到权限问题吗?
这是我分配给两个帐户的权限,并且两个帐户都作为成员添加到彼此的存储中。
- Cloud Datastore 导入导出管理员
- 云数据存储所有者
- 云文件存储编辑器
- Firebase 管理员
- 所有者
- 存储管理员
当我最初发布这个问题时,我创建了一个专门用于访问与传输相关的所有环境的专用服务帐户。这样做意味着我必须确保一个服务帐户对两个 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.
我正在尝试使用 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
有没有其他人试图完成类似的事情?知道为什么我仍然会遇到权限问题吗?
这是我分配给两个帐户的权限,并且两个帐户都作为成员添加到彼此的存储中。
- Cloud Datastore 导入导出管理员
- 云数据存储所有者
- 云文件存储编辑器
- Firebase 管理员
- 所有者
- 存储管理员
当我最初发布这个问题时,我创建了一个专门用于访问与传输相关的所有环境的专用服务帐户。这样做意味着我必须确保一个服务帐户对两个 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.