Google cloud storage 能否将keyfile.json传递给gsutil?

Google cloud storage 能否将keyfile.json传递给gsutil?,google-cloud-storage,gsutil,Google Cloud Storage,Gsutil,在我正在运行的一些Python脚本中,我有一个(可能是唯一的?)用例。也就是说,我想要并行的gsutil,因此我不想从google.cloud导入存储,而是使用子流程调用,例如: subprocess.Popen(["gsutil", "-q", "-m", "-o", "GSUtil:parallel_process_count=8,GSUtil:parallel_thread_count=8", "cp", files, destination]) 以便从存储桶上载和下载文件 在实例组模板

在我正在运行的一些Python脚本中,我有一个(可能是唯一的?)用例。也就是说,我想要并行的
gsutil
,因此我不想从google.cloud导入存储
,而是使用
子流程
调用,例如:

subprocess.Popen(["gsutil", "-q", "-m", "-o", "GSUtil:parallel_process_count=8,GSUtil:parallel_thread_count=8", "cp", files, destination])
以便从存储桶上载和下载文件

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

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脚本的末尾加入它,我已经在嵌入bootstrap.sh脚本的实例组模板的末尾执行了该脚本,但这两个脚本都没有达到我想要的效果。也就是说,两者都偏离了我最初的目标,即在应用程序级别进行“gsutil身份验证”


tl;dr是否有方法将keyfile.json凭据传递给
gsutil
?这是gsutil团队讨论过的特性吗?如果我对云平台和gsutil文档的搜索不够好,我深表歉意。

您可以在
配置文件中为
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的所有文档都显示交互式身份验证对我来说毫无意义。然而,为什么您在文档中找不到它:这是有意义的,因为在任何地方都没有提到它:(不过,我只是想解决这个问题!这真是一个不错的选择。尽管奇怪的是,我仍然无法在文档中的任何地方找到此信息,这是一个意外的发现!