通过 GSUTIL 将文件从 Windows 10 文件夹上传到 Gcloud 存储桶时出现问题

Posted

技术标签:

【中文标题】通过 GSUTIL 将文件从 Windows 10 文件夹上传到 Gcloud 存储桶时出现问题【英文标题】:Issue when uploading file from windows 10 folder to Gcloud bucket via GSUTIL 【发布时间】:2019-05-22 22:48:37 【问题描述】:

嗨, 我正在使用通过 GCLOUD SDK 和 gsutil 安装的 GSUTIL 作为其正常工作的命令,我能够创建存储桶并将文件上传到该存储桶。当我尝试通过 Windows 批处理文件(.bat)使用相同的文件时,它失败并出现以下错误,

Caught non-retryable exception while listing gs://sushanth-07081985/: ServiceException: 401 Anonymous caller does not have storage.objects.list access to sushanth-07081985.
CommandException: Caught non-retryable exception - aborting rsync

下面是我的批处理文件

set gsutil="C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\bundledpython\python.exe" "C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\gsutil\gsutil"

echo Backing up Test Folder
%gsutil% -m rsync -n -r -d -x ".*node_modules.*^|.*\.git.*" ./TestFolder gs://sushanth-07081985

在阅读了各种 S.O 帖子后尝试了以下事情

    执行命令 gcloud config list --all 并看到 pass_credentials_to_gsutil 未设置,因此将其设置为 false

    gcloud 配置设置 pass_credentials_to_gsutil false

    创建了一个服务帐户并尝试了

    gcloud auth activate-service-account --key-file codes-20180829-2c7c4b3e24df.json

    gsutil config -e(备份 .boto 文件,因为它说要更改它)。这里给出了服务帐号 JSON 文件的完整路径。

在这之后我根本无法运行,所以试图撤消我所做的一切,它像以前一样工作

    替换了我之前备份的 .boto 文件。 gcloud init(重新初始化配置) gcloud 配置设置 pass_credentials_to_gsutil true

我使用的是 Windows 10,基本上我想设置一个 gsutil 以使用服务帐户通过批处理作业(.bat)将文件上传到云存储。了解任何一步一步的方法会很好。

谢谢

更新日期:2018 年 12 月 25 日 下面的方法对吗?

    使用默认值在 IAM 中创建了一个S服务A帐户并生成了一个 p12 文件 运行 gsutil config -e 命令,它要求提供 p12 文件的完整路径[D:\BigData\16.GCP\GCS\Private\codes-20180829-d05f0ecb939d.p12] & SA 电子邮件 ID(从 IAM 获取本身) 它生成了一个 .boto 文件,其中填充了 gs_service_key_file[p12 文件路径]、gs_service_client_id[SA 电子邮件 id]、gs_service_key_file_password[notasecret] 的值 进入每个存储桶并手动添加 SA,将角色设置为 StorageAdmin 有环境。变量 BOTO_PATH 设置为 C:\Users\Sushanth.boto

现在可以了,想知道上述方法是否正确?

【问题讨论】:

【参考方案1】:

您应该为 gsutil 调用 gcloud 包装脚本:

C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\bin\gsutil

此脚本会将您配置的 gcloud 身份验证选项传递到 gsutil 的主入口点(您之前调用的入口点,位于 ...\google-cloud-sdk\platform\gsutil\gsutil)。

如果您将这两个混淆了,您可以通过对两个路径运行 gsutil 的 version -l 命令来判断哪一个是 Cloud SDK 入口点。此命令将打印有关您的环境的信息,包括您是否通过 Cloud SDK 调用 gsutil 以及正在加载哪些 .boto 配置:

> C:\path\to\google-cloud-sdk\platform\gsutil\gsutil version -l
[...]
using cloud sdk: False
pass cloud sdk credentials to gsutil: False
config path(s): C:\Users\bob\.boto
[...]

【讨论】:

谢谢。关于 gsutil 版本 -l 很有趣。我尝试生成 .boto,但它一直指向我的电子邮件帐户凭据 C:\Users\Sushanth\AppData\Roaming\gcloud\legacy_credentials\ 目前有一个可行的解决方案,我已经更新了有问题的部分。想知道这是否是正确的方法? 如果您想使用 gcloud 来管理您的凭据,您必须运行 gcloud auth activate-service-account 并为其提供您的 SA 密钥文件的路径。在幕后,gcloud 创建了一个引用该密钥文件路径的 boto 文件,当您调用包装脚本时,它将使用您当前设置/激活的 gcloud 凭据覆盖您的 BOTO_CONFIG 环境变量。但是,如果您想使用“独立”gsutil(调用 platform/gsutil 目录中的可执行文件),它将使用您在 BOTO_CONFIG 环境变量中指定的任何 boto 文件。

以上是关于通过 GSUTIL 将文件从 Windows 10 文件夹上传到 Gcloud 存储桶时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

gsutil cp 通信问题

gsutil - 在 Windows 上使用正则表达式同步两个存储桶的内容时排除文件

无法导入 gsutil

gsutil - 如何从谷歌私有云复制/下载所有文件?

无论如何要在某个时间戳之后 rsync gsutil 文件?

如何使用 gsutil 通过 http 链接从谷歌云存储下载到 AWS 实例或 s3 存储桶?