首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用服务帐户文件的Google函数未找到

使用服务帐户文件的Google函数未找到
EN

Stack Overflow用户
提问于 2022-06-29 14:39:13
回答 2查看 655关注 0票数 0

我试图列出位于另一个GCP项目中的桶,实质上使用这里的代码:https://cloud.google.com/docs/authentication/production#auth-cloud-explicit-python

为此,我需要使用Json文件验证访问权限。

不幸的是,我无法通过将Json文件链接到函数来解决错误。这是我使用的代码:

代码语言:javascript
复制
def explicit(argument):
from google.cloud import storage

# Explicitly use service account credentials by specifying the private key
# file.
storage_client = storage.Client.from_service_account_json(
    'gs://PROJECT/PATH/service_account.json')

# Make an authenticated API request
buckets = list(storage_client.list_buckets())
print(buckets)

我所犯的错误:

代码语言:javascript
复制
Traceback (most recent call last): File "/layers/google.python.pip/pip/lib/python3.9/site-packages/flask/app.py", line 2073, in wsgi_app response = self.full_dispatch_request() File "/layers/google.python.pip/pip/lib/python3.9/site-packages/flask/app.py", line 1518, in full_dispatch_request rv = self.handle_user_exception(e) File "/layers/google.python.pip/pip/lib/python3.9/site-packages/flask/app.py", line 1516, in full_dispatch_request rv = self.dispatch_request() File "/layers/google.python.pip/pip/lib/python3.9/site-packages/flask/app.py", line 1502, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args) File "/layers/google.python.pip/pip/lib/python3.9/site-packages/functions_framework/__init__.py", line 99, in view_func return function(request._get_current_object()) File "/workspace/main.py", line 6, in explicit storage_client = storage.Client.from_service_account_json( File "/layers/google.python.pip/pip/lib/python3.9/site-packages/google/cloud/client.py", line 106, in from_service_account_json with io.open(json_credentials_path, "r", encoding="utf-8") as json_fi: FileNotFoundError: [Errno 2] No such file or directory: 'gs://PROJECT/PATH/service_account.json'

如何正确地引用文件来执行函数?

EN

回答 2

Stack Overflow用户

发布于 2022-06-29 16:54:50

谷歌的客户端库all支持应用程序默认凭据(ADCs),包括自动查找凭据。你应该利用这个。

当您的代码在云函数服务上运行时,它作为服务帐户标识运行。您可能正在使用默认云功能服务帐户运行云函数。您可以在部署“更新云”函数时指定用户定义的服务帐户。

注意使用用户定义的、非默认的服务帐户运行云函数更好。

当云函数尝试创建云存储客户端时,它使用它的标识(服务帐户)来创建。

解决办法是:

  1. 利用ADC并使用这些(即storage_client = storage.Client() )创建云存储客户端
  2. 调整云函数的服务帐户,使其对云存储具有正确的IAM角色\\权限。

注意:,您可能应该调整桶的IAM策略。因为在不同的项目中使用云存储桶,所以如果要调整项目的IAM策略,请确保使用云存储桶的(!)项目的IAM策略,而不是云函数的项目的IAM策略。

请参见云存储的IAM角色:预定义的角色roles/storage.objectViewer,因为这包括您需要的storage.objects.list权限。

票数 1
EN

Stack Overflow用户

发布于 2022-06-29 21:33:44

您正在尝试列出位于另一个GCP项目中的桶,同时通过从(GCS)中提取一个服务帐户(SA)密钥文件来授权您的客户。

我推荐一种不同的安全模式来解决这个问题。本质上,使用具有调用云功能的权限的单个SA,以及列出GCS桶内容的权限。它将避免从包含密钥文件的GCS中提取文件的需要,同时仍然保持安全性,因为一个糟糕的参与者将需要访问您的GCP帐户。下面的步骤向您展示了如何做到这一点。

  1. 在您的第一个云函数项目中使用角色云函数调用创建一个服务帐户(SA)
  2. 在此新SA上授予您的用户帐户或用户组服务帐户用户角色
  3. 更改云功能以使用新创建的SA,何处更改云功能运行时SA
  4. 在第二个项目中授予云函数运行时SA一个GCS角色,即GCS

在此模式中,您将"actAs“云函数运行时SA允许您调用云函数。由于云函数运行时SA对其他项目中的GCS桶具有足够的权限,因此不需要SA密钥,因为运行时SA已经具有足够的权限。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72803289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档