簡體   English   中英

通過服務帳戶訪問 Google Cloud Storage

[英]Google Cloud Storage access via service account

我一直在反復撞到眾所周知的 GCP 存儲 API 的磚牆。

我正在嘗試應用 django-storages 模塊來連接我的 static 文件的 GCP 存儲桶以及我將來想用它做的任何其他事情。

根據 django-storages 文檔 ( https://django-storages.readthedocs.io/en/latest/backends/gcloud.html#usage ),如果您在 GCP 虛擬環境中運行,則將您的服務帳戶設置為通過 IAM 接口的存儲權限和一切都應該像 tickety-boo 一樣工作。

因此,我的 GCP 雲構建運行器構建了 docker 圖像,然后運行python manage.py migratepython manage.py collectstatic ,然后將我的 docker 圖像部署到 CloudRun。 構建運行器使用名為XXXX@cloudbuild.gserviceaccount.com的服務帳戶,因此進入 IAM,我添加了“雲存儲 - 存儲管理員”角色,為了確定,我還添加了“雲存儲 - 存儲 object 管理員” “ 角色。

現在我觸發重新運行我的 cloudbuild 並且......在遷移階段我收到錯誤:

...
Step #2 - "apply migrations":   File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
Step #2 - "apply migrations":     return _bootstrap._gcd_import(name[level:], package, level)
Step #2 - "apply migrations":   File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
Step #2 - "apply migrations":   File "<frozen importlib._bootstrap>", line 991, in _find_and_load
Step #2 - "apply migrations":   File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
Step #2 - "apply migrations":   File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
Step #2 - "apply migrations":   File "<frozen importlib._bootstrap_external>", line 843, in exec_module
Step #2 - "apply migrations":   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
Step #2 - "apply migrations":   File "/src/lang/urls.py", line 20, in <module>
Step #2 - "apply migrations":     re_path('favicon.ico$', RedirectView.as_view(url=staticfiles_storage.url('images/apple_touch_icon.png'), permanent=False)),
Step #2 - "apply migrations":   File "/usr/local/lib/python3.8/site-packages/storages/backends/gcloud.py", line 290, in url
Step #2 - "apply migrations":     return blob.generate_signed_url(
Step #2 - "apply migrations":   File "/usr/local/lib/python3.8/site-packages/google/cloud/storage/blob.py", line 620, in generate_signed_url
Step #2 - "apply migrations":     return helper(
Step #2 - "apply migrations":   File "/usr/local/lib/python3.8/site-packages/google/cloud/storage/_signing.py", line 550, in generate_signed_url_v4
Step #2 - "apply migrations":     ensure_signed_credentials(credentials)
Step #2 - "apply migrations":   File "/usr/local/lib/python3.8/site-packages/google/cloud/storage/_signing.py", line 52, in ensure_signed_credentials
Step #2 - "apply migrations":     raise AttributeError(
Step #2 - "apply migrations": AttributeError: you need a private key to sign credentials.the credentials you are currently using <class 'google.auth.compute_engine.credentials.Credentials'> just contains a token. see https://googleapis.dev/python/google-api-core/latest/auth.html#setting-up-a-service-account for more details.
Finished Step #2 - "apply migrations"

嗯。 我似乎無法通過服務工作者進行身份驗證。

使用 django 上的谷歌示例教程中的代碼,我的 settings.py 中有以下行:

credentials, project_id = google.auth.default()

但是我不對返回的憑據變量做任何事情。 在我看來,關於如何通過服務帳戶訪問存儲桶的在線文檔有點稀疏。 有什么見解嗎?

我發現一個用戶有類似的問題: https://pnote.eu/notes/django-app-engine-user-uploaded-files/

對於具有Uniform而不是fine-grained的存儲桶訪問策略的存儲桶,似乎會出現問題。 上述文章的作者提出了 django-storage 的問題,最終合並了一個修復程序。文檔中現在有一個我錯過的“注意”框,其中指出:

GS_DEFAULT_ACL:使用此設置時,請確保您的存儲桶啟用了細粒度訪問控制,而不是統一訪問控制,否則,文件上傳將返回 HTTP 400。如果您已經有一個設置了統一訪問控制的存儲桶要公開閱讀,請將 GS_DEFAULT_ACL 設置為 None 並將 GS_QUERYSTRING_AUTH 設置為 False。

所以簡而言之,解決方案是添加到您的 settings.py 文件中:

GS_QUERYSTRING_AUTH = False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM