你能把keyfile.json传递给gsutil吗?

时间:2017-04-20 23:38:36

标签: google-cloud-storage gsutil

我正在运行的一些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脚本的末尾抛出它。嵌入式bootstrap.sh脚本,既没有真正实现我喜欢的东西。也就是说,两者都远离我最初的目标,即" gsutil authentication"在应用程序级别。

tl; dr有没有办法将keyfile.json凭据传递给gsutil?这是gsutil团队讨论过的一个功能吗?如果我还没有充分利用云平台和gsutil文档,我很抱歉。

1 个答案:

答案 0 :(得分:10)

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

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

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

如果要在命令行中而不是在.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])

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