您可以将 keyfile.json 传递给 gsutil 吗?

Posted

技术标签:

【中文标题】您可以将 keyfile.json 传递给 gsutil 吗?【英文标题】:Can you pass a keyfile.json to gsutil? 【发布时间】:2017-09-17 19:12:22 【问题描述】:

我在运行的一些 Python 脚本中有一个(可能是独一无二的?)用例。即,我想要gsutil 的并行令人敬畏,所以我不使用from google.cloud import storage,而是使用subprocess 调用,例如:

subprocess.Popen(["gsutil", "-q", "-m", "-o", "GSUtil:parallel_process_count=8,GSUtil:parallel_thread_count=8", "cp", files, destination])

为了从存储桶上传和下载文件。

在实例组模板中,我可以通过-scopes 传递服务帐户,但我希望在应用程序级别处理身份验证。我尝试设置环境变量并将其传递给subprocess:

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "keyfile.json"
tmp_env = os.environ.copy()
subprocess.Popen(['gsutil', ...], env=tmp_env)

但无济于事。运行:

gcloud auth activate-service-account --key-file /path/to/keyfile.json --project my-project -q

似乎是使用不需要 Python API 的 json 密钥文件进行身份验证的最佳方式。但是如果我把它放在我的 Dockerfile 的末尾,它就不起作用了,虽然我当然可以把它放在我在实例组模板嵌入引导程序末尾执行的 startup.sh 脚本的末尾.sh 脚本,两者都没有真正完成我想要的。也就是说,两者都偏离了我在应用程序级别进行“gsutil 身份验证”的最初目标。

tl;dr 有没有办法将 keyfile.json 凭据传递给gsutil?这是 gsutil 团队讨论过的功能吗?如果我没有很好地搜索 Cloud Platform 和 gsutil 文档,我深表歉意。

【问题讨论】:

【参考方案1】:

您可以在 .boto 配置文件中为 gsutil 提供指向 JSON 密钥文件的指针,如下所示:

[Credentials]
gs_service_key_file = /path/to/your/keyfile.json

这相当于为独立(非gcloud)安装运行gsutil config -e

如果您想在命令行而不是在.boto 配置文件中提供此参数,您可以使用-o 参数,类似于在命令行中配置进程和线程数的方式。也就是说:

subprocess.Popen(["gsutil", "-q", "-m", "-o", "Credentials:gs_service_key_file=/path/to/your/keyfile.json",
                 "-o", "GSUtil:parallel_process_count=8", "-o", GSUtil:parallel_thread_count=8", "cp", files, destination])

请注意,您需要确保可以从容器内访问密钥文件路径。

【讨论】:

优秀。正是我想要的。丹克。 为什么我在文档中找不到这个?当我(当然还有无数其他人)需要从某个容器上的脚本进行身份验证时,gsutil 的所有文档都显示交互式身份验证对我来说毫无意义 至于为什么您在文档中找不到它:这是有道理的,因为它没有在任何地方提及 :( 不过我只是 pushed a commit 来解决这个问题! 这真是个不错的选择。虽然奇怪的是,我仍然无法在文档中的任何地方找到此信息,这是一个令人惊讶的发现!

以上是关于您可以将 keyfile.json 传递给 gsutil 吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字节数组一个活动传递给另一个android [重复]

可以将任何原始类型传递给需要指针的函数吗?

可以将 NULL 传递给块参数吗?

以角度将指令/输入传递给孩子的反应方式是啥?

如何将字符串传递给函数并返回整数?

Javascript将选项传递给变量并使用php保存到txt文件