繁体   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