如何将数据直接从一个 Google Cloud Storage 项目移动到另一个?

Posted

技术标签:

【中文标题】如何将数据直接从一个 Google Cloud Storage 项目移动到另一个?【英文标题】:How can I move data directly from one Google Cloud Storage project to another? 【发布时间】:2015-09-12 00:17:16 【问题描述】:

如何将数据直接从一个 Google Cloud Storage 项目移动到另一个项目? 我了解如何上传和如何下载,但我想在项目之间直接传输。

【问题讨论】:

“项目”是一种组织工具的结构......无论如何,对象都存在于存储桶中。因此,您只需将其从存储桶复制到存储桶。 @HannahS 如果有适合您的答案,请将其标记为已接受的答案。这会奖励作者并帮助有相同问题的其他人。 【参考方案1】:

要将任何单个对象从一个 GCS 位置复制到另一个位置,您可以使用 copy 命令。这可以通过我们的任一公共 API 或使用命令行客户端 gsutil 来完成。

使用 gsutilcp command 可以这样使用:

gsutil cp gs://bucket1/obj gs://bucket2/obj2

编辑: 自从我写了这篇文章后,Google Cloud Transfer Service 已经可用,这对于在 GCS 项目之间复制整个存储桶或将整个存储桶从 S3 复制到 GCS 中很有用。你可以了解更多here。

【讨论】:

这似乎是在同一个项目的两个存储桶之间进行复制。你有从一个项目复制到另一个项目的例子吗? 本例中的桶可以在不同的项目中。此示例中没有提及具体项目。 问题出在凭据上,您必须拥有可以访问这两个项目的凭据。 @JohnAndrews 对我有用的是:尝试执行此问题其他地方详述的 gsutil cp 命令,它会给您一个错误,告诉您哪个服务帐户缺少权限。然后,将该权限添加到存储桶的权限(我使用角色 Storage Object Admin)并重试。 我最终使用了:gsutil -m rsync -pPr PROD-15745 gs://eci_staging_transfer/PROD-15745,其中 PROD-15745 是要复制的文件夹,而 eci_staging_transfer 是存储桶名称。 rsync docs. 更有用 gsutil cmds:gsutil cp dmesg.txt gs://my_bucket/(只需复制文件),gsutil ls -al gs://my_bucket/(列出文件),gsutil rm gs://my_bucket/dmesg.txt(删除文件)。 ls 输出格式与您习惯的不同。您也可以随时通过 GCP 控制台 GUI 检查存储桶内容。【参考方案2】:

打开 Web 控制台 Storage > Tranfer 以创建新传输。

选择您要从中复制的源存储桶。就像上面的cratervale menitoned 一样,桶标识符是globally unique (这是解决方案的关键)。因此,一旦您到达传输表单的目标部分,您就可以在其文本输入中直接写入/粘贴目标存储桶。即使该存储桶来自另一个项目。一旦目标被验证为现有存储桶,它将向您显示一个绿色图标。您可以再次填写表单以完成设置。

从表单开始传输后,您可以通过点击控制台顶部的刷新按钮来跟踪其进度。

【讨论】:

这对我来说是最简单的路线。 我认为这个答案是最好的方法。 完美答案:)【参考方案3】:

这是最快的方法之一:

gsutil -m rsync -r gs://bucket-source/dir gs://bucket-destination/dir

请注意,/dir 指的是一个目录 [或子目录,例如/dir1/dir2] 在主桶下。它不引用文件名。如果您尝试传输单个文件,则会收到错误消息。

在official docs 中查看更多配置选项。

但是,您应该正确设置一些事项以防止出现问题。这是一个设置列表:

    为您的源存储桶创建一个服务帐户 [来自源项目,Google Cloud Console -> IAM -> Service Account]。使用 Storage Admin 作为角色。确保创建 JSON 密钥并将其下载到计算机上的安全位置。记下此文件的路径 [例如path/to/source-service-account.json] 稍后您将需要它。 为您的目标存储桶创建一个服务帐户[过程与上述相同,但请确保切换到目标项目]。如果您以后需要使用它,您可以下载 JSON 密钥,但这是可选的。 将源存储桶[在上面1.中创建]的服务帐户添加到目标存储桶[来自目标项目,Google Cloud Console -> Storage -> Browser,然后点击主存储桶,然后点击权限 选项卡,然后单击“添加成员”按钮。在提供的文本框中添加源存储桶服务帐户的电子邮件地址,然后授予 Storage Admin 权限] 如果您正在使用 gcloud cli [命令行工具],并且已登录到源项目,您现在可以运行 gsutil 命令。但是,如果您没有经过适当的身份验证,您可能会遇到访问权限错误。您可以通过运行以下命令 gcloud auth activate-service-account --key-file=/path/to/source-service-account.json 使用服务帐户文件 [您在上面 1. 中创建和下载的文件] 进行身份验证。完成此操作后,您将使用服务帐户登录 GCP。您现在可以运行gsutil 命令来传输您的文件。 完成后,使用gcloud auth list 检查您的登录状态。而且,您可以使用gcloud config set account 'ACCOUNT' 切换帐户

干杯。

【讨论】:

问题。如果我从同一个项目和区域内的 bucket->bucket 复制,我需要付费吗?如果我从bucket->bucket在同一区域但不同的项目中复制,我需要付费吗?谁能帮我解答这个问题?【参考方案4】:

如果您想使用控制台,请遵循@Martin van Dam 的回答。

如果你想使用外壳:

第一步,打开google cloud shell

第二步,运行gcloud init,按照流程连接bucket1所属的云项目。

第三步,运行gsutil cp -r gs://[bucket1]/* gs://[bucket2]

你已经完成了!


*现在有一个问题!如果两个存储桶都属于同一个项目,这些步骤将完美运行。但如果两个桶都不属于same projectsame google cloud account。它行不通。您需要修复权限。

如果它们属于同一个 GCP 帐户:

转到Storage>Browser>选择存储桶>选项>Edit bucket permissions>add member>为存储桶2所属的项目插入service account email id>将角色设置为存储。Storage Admin>保存.然后运行gstuil cp 命令。

如果它们属于单独的 GCP 帐户:

转到Storage>Browser>选择bucket>选项>Edit bucket permissions>add member>插入bucket2所属项目的gmail id>设置角色为Storage.Storage Admin>保存.然后运行gstuil cp 命令。

【讨论】:

我设法在两个项目之间进行复制,没有任何问题。不错的一个【参考方案5】:

GCS 中的存储分区名称在您的所有项目中都是唯一的。例如,Project1 和 Project2 不能同时拥有名为“images”的存储桶,尽管它们都可以在这些名为“images”的存储桶中拥有文件夹。

这似乎具有误导性,因为 gsutil 可能会要求您选择要使用的项目。对于复制命令,可以忽略此选择。

gsutil cp gs://bucket1/obj gs://bucket2/obj

将允许您将 Project1/bucket1 中的对象复制到 Project2/bucket2

【讨论】:

【参考方案6】:

如果您拥有可以访问这两个项目的密钥或服务帐户,那么使用 gsutils 将非常简单,而且工作速度极快。

这是我在本地 Mac 上所做的,并在几分钟内同步了 TB 的数据(是的,几分钟而不是几小时)

gsutil -m rsync -r gs://my/source/project/bucket/files/ gs://my/target/project/bucket/directory/

这里的关键是使用-m标志。

查看官方文档https://cloud.google.com/storage/docs/gsutil/commands/rsync 了解更多详情。

【讨论】:

这很好用,而且很快,因为 -m 使它并行运行并且它使用 rsync 所以它可以有效地复制而不移动未更改的文件。您确实需要一个对两个项目都具有正确权限的帐户。 不知道为什么这被否决了,这是快速完成的最有效方法。 gsutil rsync 通过复制、更新或删除目标文件夹中源文件夹中已更改的任何文件,使目标文件夹的内容与源文件夹的内容相同。 上面的链接包含“]”所以如果你点击它就会被破坏。这是正确的:cloud.google.com/storage/docs/gsutil/commands/rsync【参考方案7】:

使用 Google Cloud Shell

转到第一个包含您要复制的存储桶的项目 gcloud config set project [PROJECT1 ID]

创建了一个目录,您可以将该存储桶挂载到 mkdir test

将bucket挂载到目录gcsfuse [BUCKET1] test

切换到第二个项目,其中包含您要填充的存储桶 gcloud config set project [PROJECT2 ID]

将新建文件夹的内容复制到第二个bucket gsutil cp -r /home/user/test gs://[BUCKET2]

【讨论】:

【参考方案8】:

根据文档Moving Buckets。

您可以简单地使用gsutil

gsutil cp -r gs://[SOURCE_BUCKET]/* gs://[DESTINATION_BUCKET]

注意: _if 使用zsh。确保将源存储桶用单引号括起来。因为 zsh 会在 gsutil 看到它之前尝试扩展通配符。见here。

您可以在存储浏览器的“概览”选项卡中找到gsutil 的链接。

【讨论】:

以上是关于如何将数据直接从一个 Google Cloud Storage 项目移动到另一个?的主要内容,如果未能解决你的问题,请参考以下文章

从 Kubernetes pod 直接将数据写入 Google Cloud Storage

如何从 Cloud Functions 连接 Google Cloud SQL?

如何将公共数据集导入 Google Cloud Bucket

如何在基于服务器的应用程序中直接使用 Google Cloud IoT 数据?

从 Google Cloud Datalab 向 BigQuery 插入数据时如何调试解析错误?

如何更改 Google Compute Engine 服务帐户的范围以将数据写入 Google Cloud Storage 存储桶?