如何将数据直接从一个 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 来完成。
使用 gsutil,cp 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 project
或same 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 存储桶?