我试图列出位于其他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'
如何正确引用文件来执行函数?
Google客户端库all非常有用地支持应用程序默认凭证(adc),包括自动查找凭证。你应该利用这个
当您的代码在Cloud Functions服务上运行时,它将作为服务帐户标识运行。您可能正在使用默认的云功能服务帐户运行云功能。
可在部署/更新Cloud Function时指定自定义服务帐户。注意最好使用用户定义的、非默认的服务帐户来运行你的云功能。
当云函数尝试创建云存储客户端时,它使用它的身份(服务帐户)来创建。
解决方案是:
- 利用adc,云存储客户端创建使用这些即
storage_client = storage.Client()
- 调整云功能的服务帐户,使其具有正确的IAM角色|对云存储的权限。
注意您可能应该调整Bucket的IAM Policy。因为你在不同的项目中使用云存储桶,如果你想调整项目的IAM Policy,确保你使用桶的(!)项目的IAM Policy,而不是Cloud Function项目的IAM Policy。
看到我为云存储角色:预定义的角色和也许roles/storage.objectViewer
这包括storage.objects.list
许可需要。
您正在尝试列出位于另一个GCP项目中的桶,同时通过从谷歌云存储(GCS)中提取服务帐户(SA)密钥文件来授权您的客户端。
我建议使用不同的安全模式来解决这个问题。本质上使用一个SA,它具有调用云函数的权限和列出GCS桶内容的权限。它将避免从GCS中提取包含密钥文件的文件,同时仍然保持安全性,因为恶意行为者将需要访问您的GCP帐户。下面的步骤将向您展示如何这样做。
- 在您的第一个云功能项目中创建一个角色为云功能调用者的服务帐户
- 在此新SA上授予您的用户帐户或用户组服务帐户用户角色
- 更改Cloud Function以使用这个新创建的SA,在这里更改Cloud Function Runtime SA
- 在第二个项目或GCS桶中授予Cloud Function runtime SA一个GCS角色
在这个模式中,您将"Cloud Function runtime SA,用于调用Cloud Function。由于Cloud Function运行时SA对其他项目中的GCS桶具有足够的权限,因此不需要SA密钥,因为运行时SA已经具有足够的权限。