cloud/gsutil 将文件从实例复制到存储桶
Posted
技术标签:
【中文标题】cloud/gsutil 将文件从实例复制到存储桶【英文标题】:cloud/gsutil copy files from instance to bucket 【发布时间】:2020-11-30 20:36:54 【问题描述】:我已经从实例内部尝试了 gsutil rsync/cp,它可以工作。 我正在寻找一种使用 gcloud/gsutil cli 从本地计算机运行同步的方法。 是否有像 gcloud compute scp 这样的命令从实例同步到存储桶? [编辑] 我查看了官方文档,但找不到这样的示例。
【问题讨论】:
请不要标记 [Edits] 等。只需格式化问题,以便对有类似问题的人有所帮助。他们是否需要知道您后来添加了一些您最初忘记的内容?不,他们不会在意的。此外,“编辑”链接无论如何都会显示完整的编辑历史记录。 【参考方案1】:如果我知道您想在云外的机器上运行命令,该命令将在云虚拟机和存储桶之间同步文件,那么不,没有这样的命令,这在设计上是不可能的。想一想:VM 可以运行 Linux、Windows 甚至是您自己开发的操作系统。 (还记得那个只是为了好玩而这样做的 Linus Torvalds 吗?这个。)GCE 本身是不可能支持的。出于同样的原因,即使从另一个虚拟机(不仅是您的本地计算机)也是不可能的。
但是,只要您可以从本地计算机 ssh 到实例,相同的 gsutil rsync ...
就可以通过 ssh 连接正常工作:
ssh instance-1 'gsutil rsync ...'
只是不要错过或弄乱引号。如果您使用gcloud compute ssh
而不是仅使用ssh
登录实例,则将改为(注意--
告诉gcloud
其余参数应传递给ssh
)。
gcloud compute ssh instance-1 -- 'gsutil rsync ...'
gsutil
在两个存储桶之间高效地复制和 rsync 数据,无论您在哪里调用命令;数据永远不会离开云端。这是可能的,因为存储桶是 Google 自己的装置,它们完全控制自己的 API。但是进入运行随机操作系统并读取/写入文件的工作虚拟机是根本不可能的。
这种技术甚至适用于整个内联 shell 脚本。例如,这是我用来设置新实例的脚本的一部分(我生成了很多临时 VM,所以我想要一个解决方案,例如缺少 bash 完成包等):
ssh "$target" '
set -eu
cd ~
if [[ -f .kkm-config-done ]]; then
echo "### STOP: .kkm-config-done exists, not overwriting files"
exit 1
. . . .
'
注意唯一的单引号,结束唯一的 ssh
参数。
Tangential:阅读 IAP 隧道,它可以让您 ssh 进入您的实例,而无需将侦听 ssh 端口暴露给整个互联网(hic sunt dracones :))。它们是免费的并且非常安全。在一个简单的情况下,就像在gcloud compute ssh
命令中添加--tunnel-through-iap
开关一样简单。指针在此开关的文档中。
【讨论】:
是的,我想我正在寻找一种不使用实例 CPU 和 ram 进行同步的方法,女巫是我的问题。 @SnakeFoot,rsync 的 CPU 和 RAM 使用率微乎其微。也许你应该更好地描述你的问题。一种方法是安排磁盘快照,每 N 分钟或几小时或每隔 N 分钟一次,使用磁盘的快照副本分离一个临时 VM。但是,如果您的限制如此严格以至于 rsync 是一个问题,那么增加 CPU 和 RAM 可能会更好。当然,活动磁盘的快照可能并不完全一致。以上是关于cloud/gsutil 将文件从实例复制到存储桶的主要内容,如果未能解决你的问题,请参考以下文章
使用 Node 将文件从一个 AWS S3 存储桶复制到另一个存储桶
将多个 .gz 文件从一个 GCS 存储桶复制到 Java 中的另一个存储桶
如何在使用 gsutil 保留 ACL 的同时将文件从 Google Cloud Storage 存储桶 1 复制到存储桶 2