2017-04-20 80 views
2

我在運行的一些Python腳本中有一個(也許是唯一的?)用例。也就是說,我要的gsutil並行迷死人,所以我不做from google.cloud import storage,而我用subprocess調用,如:爲了上傳和下載水桶文件你可以傳遞一個keyfile.json到gsutil嗎?

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文檔。

回答

3

你可以提供一個指針爲gsutil一個JSON密鑰文件在.boto配置文件像這樣:

[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]) 

請注意,您需要確保密鑰文件路徑是從訪問你的容器內。

+0

非常好。正是我在找什麼。丹科。 – shogekiha

+0

爲什麼地球上我不能在文檔中找到它?對於我來說gsutil的所有文檔都顯示交互式身份驗證,當我(當然還有無數其他人)需要通過某個容器上的腳本進行身份驗證 – Brennan

+0

至於爲什麼在文檔中找不到它:有道理,因爲它沒有提到任何地方:(我只是[推送提交](https://github.com/GoogleCloudPlatform/gsutil/commit/5e5ba0671f3a6bde14676f6cbcef06ec9772ffb7)來解決這個問題,但! – 2017-11-06 20:56:58

相關問題