我正在运行的一些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文档,我很抱歉。
答案 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])
请注意,您需要确保可以从容器中访问密钥文件路径。