【问题标题】:Firestore and Storage Bucket Export/Import between Projects项目之间的 Firestore 和存储桶导出/导入
【发布时间】:2020-08-27 22:57:25
【问题描述】:

因此,在 Google Cloud CLI 的当前 Beta 功能中,有一个用于导入和导出 Firestore 数据的选项。 https://firebase.google.com/docs/firestore/manage-data/export-import

现在我将导出到存储桶中,一切正常,然后再次导入,效果也很好。现在我有 2 个不同的项目,想将备份导入另一个项目,这可能吗?如果我也只需要一个项目的计费帐户,那就太好了。

文档中的这一行说它是可能的

在 Cloud Storage 中导出文件后,您可以导入文档 在这些文件中回到您的项目或另一个项目中。

但是文档并没有说明它是如何完成的?

【问题讨论】:

  • 该文档为您提供了运行 gcloud 命令以从存储桶导入备份的示例。我认为这是假设您了解如何在不同项目之间操作 gcloud。只要您的 Google 帐户对这两个项目具有管理员权限,您就应该能够从一个项目中的存储桶导入另一个项目中的 Firestore。你有什么特别的问题吗?
  • @DougStevenson 没有什么特别的,但是如果我在两个项目中都有一个同名的云存储桶和一个同名的备份会发生什么,如果我去哪一个呢?文档中的导入路径语法
  • Google Cloud 中的任何地方都不能有两个同名的存储桶。它们是独一无二的。

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


【解决方案1】:

可以在项目之间导入/导出。以下是对我有用的步骤:

首先,确保安装了gcloud 命令行工具。设置说明, 可以在 Firebase 的文档中阅读有关导出/导入过程的完整信息 关于Firestore Export and Import的页面。

在继续之前,将 gcloud 项目设置为您希望从中获取数据的项目:

gcloud config set project [PROJECT_ID]

然后,使用 Google Cloud Console 网络应用程序,确保已在其上创建 Cloud Storage 存储桶 将成为数据来源的项目。

例如,对于源存储桶,您可能会创建一个存储桶,例如:

gs://my-source-project-export.

您可以随意命名存储桶,只要您选择独特的名称即可。

然后可以使用命令完成源数据的导出。例如,如果您想导出 只是 camerasradios 集合到您的 my-source-project-export 存储桶,带有 日期目录来标识导出,您包括可选的collection-ids 标志,如下所示:

gcloud beta firestore export gs://my-source-project-export/export-20190113_2109 --collection-ids='cameras','radios'

省略标志将复制所有集合。

gcloud CLI 工具应该可以顺利完成导出。

现在,为了完成导入,我们首先将 gcloud 项目切换到 target 以获取我们的数据:

gcloud config set project [PROJECT_ID]

然后,我们可以尝试导入:

gcloud beta firestore import --collection-ids='cameras','radios' gs://my-source-project-export/export-20190113_2109

由于权限问题,操作可能会失败。如果是这样,它将报告需要哪个服务帐户 访问存储桶。要解决权限问题,您可以简单地使用 Google Cloud Console Storage Browser 管理 source 存储桶的权限。必须将所需的服务帐户添加到 members 列表中 角色Storage Admin

权限更正后,可以重新尝试操作。对于长时间运行的操作,列表 可以使用以下命令检索操作及其状态:

gcloud beta firestore operations list

导入完成后,最好撤销授予服务帐户的权限(如果有),以避免任何不必要的安全问题。

希望对您有所帮助。

【讨论】:

  • 谢谢,今天晚些时候回家试一试,然后给出完整的评价,直到那时 +1
  • 我收到了您所说的权限问题。我将该帐户添加到成员列表中,并且仍在获取它。是因为帐户在悬停时说“用户”而不是“服务帐户”吗?
  • 对于那些不知道他们的服务帐户是什么的人:它是 [PROJECT_ID]@appspot.gserviceaccount.com。所以如果你想从项目A导入数据到项目B,那么你必须在项目B的bucket中允许项目A的服务账号[PROJECT_A_ID]@appspot.gserviceaccount.com
  • 首先我尝试在 Google Cloud Console Web 应用程序中执行此操作,但我永远无法让目标项目看到源项目的存储桶。但是,只需对 gcloud CLI 执行相同操作(根据上文,除了没有 beta 前缀)就可以了!仍然不明白为什么,但是耶!感谢您清晰简洁的演练!
  • 我遇到了和@riper 一样的问题。我使用控制台创建存储桶并设置权限,但项目 B 不会在控制台中列出存储桶。我在网络云控制台中运行了命令,它首先尝试!同意,演练非常有帮助。
【解决方案2】:

接受的答案对我不起作用。无论在源存储桶上授予什么权限,导入总是失败并显示PERMISSION DENIED: The caller does not have permission

解决方案是创建另一个服务帐户。我使用Cloud Datastore Import Export AdminStorage Admin 角色在目标项目上创建了一个服务帐户。然后,我将此服务帐户添加到具有相同角色的源项目 IAM。完成此操作后,以下过程对我有用:

gcloud auth activate-service-account --key-file=./mynewserviceaccount.json
gcloud beta firestore export gs://mysourceprojectbucket --project mysourceprojectid
gcloud beta firestore import gs://mysourceprojectbucket/WHATEVER_NAME_FROM_EXPORT --project mydestinationproject

【讨论】:

    【解决方案3】:

    主要步骤: 确保在两个项目中都启用了计费。

    对于 PROJECT_1,

    1. 在 Google Cloud Storage 中创建存储桶 (BUCKET_1) PROJECT_1
    2. 使用 Cloud shell 将 Firestore 数据导出到 BUCKET_1
    3. 获取 PROJECT_2 的服务帐户并授予其“存储管理员”权限 BUCKET_1

    PROJECT_2

    从 BUCKET_1 导入数据

    我已将所有步骤的输出放入此blog post

    【讨论】:

      【解决方案4】:

      在我的例子中,目标数据库没有写规则。

      切换自:

      rules_version = '2';
      service cloud.firestore {
        match /databases/{database}/documents {
          match /{document=**} {
            allow read, write: if false;
          }
        }
      }
      

      收件人:

      rules_version = '2';
      service cloud.firestore {
        match /databases/{database}/documents {
          match /{document=**} {
            allow read, write: if true; /* Allow writes by setting true here */
          }
        }
      }
      

      解决了我的问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        • 1970-01-01
        • 2019-12-21
        • 1970-01-01
        • 2019-12-31
        • 2020-10-18
        • 2014-08-19
        相关资源
        最近更新 更多