我试图列出位于另一个GCP项目中的桶,实质上使用这里的代码:https://cloud.google.com/docs/authentication/production#auth-cloud-explicit-python
为此,我需要使用Json文件验证访问权限。
不幸的是,我无法通过将Json文件链接到函数来解决错误。这是我使用的代码:
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)我所犯的错误:
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'如何正确地引用文件来执行函数?
发布于 2022-06-29 16:54:50
谷歌的客户端库all支持应用程序默认凭据(ADCs),包括自动查找凭据。你应该利用这个。
当您的代码在云函数服务上运行时,它作为服务帐户标识运行。您可能正在使用默认云功能服务帐户运行云函数。您可以在部署“更新云”函数时指定用户定义的服务帐户。
注意使用用户定义的、非默认的服务帐户运行云函数更好。
当云函数尝试创建云存储客户端时,它使用它的标识(服务帐户)来创建。
解决办法是:
storage_client = storage.Client() )创建云存储客户端注意:,您可能应该调整桶的IAM策略。因为在不同的项目中使用云存储桶,所以如果要调整项目的IAM策略,请确保使用云存储桶的(!)项目的IAM策略,而不是云函数的项目的IAM策略。
请参见云存储的IAM角色:预定义的角色和roles/storage.objectViewer,因为这包括您需要的storage.objects.list权限。
发布于 2022-06-29 21:33:44
您正在尝试列出位于另一个GCP项目中的桶,同时通过从(GCS)中提取一个服务帐户(SA)密钥文件来授权您的客户。
我推荐一种不同的安全模式来解决这个问题。本质上,使用具有调用云功能的权限的单个SA,以及列出GCS桶内容的权限。它将避免从包含密钥文件的GCS中提取文件的需要,同时仍然保持安全性,因为一个糟糕的参与者将需要访问您的GCP帐户。下面的步骤向您展示了如何做到这一点。
在此模式中,您将"actAs“云函数运行时SA允许您调用云函数。由于云函数运行时SA对其他项目中的GCS桶具有足够的权限,因此不需要SA密钥,因为运行时SA已经具有足够的权限。
https://stackoverflow.com/questions/72803289
复制相似问题