您可以将 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章