代码之家  ›  专栏  ›  技术社区  ›  ra9r

在Firebase项目之间迁移Firestore数据

  •  4
  • ra9r  · 技术社区  · 7 年前

    我正在尝试使用 gcloud

    #!/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 .

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

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

    错误:(gcloud.beta.firestore.import)权限被拒绝:调用者没有权限

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

    • 云数据存储导入导出管理
    • 云数据存储所有者
    • Firebase管理员
    • 所有者
    1 回复  |  直到 7 年前
        1
  •  1
  •   ra9r    7 年前

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

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

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

    我不知道这为什么奏效,但正是它使我能够向前迈进。我希望它对你也有用。

    现在有了 new documentation 服务帐户