我正在尝试使用Google Cloud Functions从存储桶中的文件中打印某些内容。我有储存在桶中的文件,以通过身份验证的服务帐户Storage Admin
,Cloud Run Admin
,Service Account User
和Cloud Functions Admin
和下面的Python脚本。
def from_storage(event, context):
import json
from google.cloud import storage
client = storage.Client(project='my-project')
try:
bucket = client.get_bucket('my-storage')
except Exception as e:
print('Bucket not found.')
print(e)
try:
blob = bucket.blob('Hello_World.json')
data = json.load(blob.download_as_string())
return data
except Exception as e:
print('Error loading file:')
print(e)
我尝试使用以下代码进行部署:
gcloud functions deploy from_storage --runtime python39 --triger-http --allow-unauthenticated
我收到一个错误,指出部署服务帐户(似乎是一个自动创建的服务帐户)没有storage.objects.get
权限:
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: could not resolve storage source: googleapi: Error 403: [email protected] does not have storage.objects.get access to the Google Cloud Storage object., forbidden
我发现这很奇怪,因为我没有在IAM中看到该服务帐户,也无法在Cloud Functions中访问其权限。任何帮助将不胜感激!
我猜想[email protected]
-是Cloud Build服务帐户,前缀(数字)是运行Cloud Build的项目的编号。您能否检查Cloud Build API是否已启用?并且Cloud Build服务帐户具有相关权限,好吗?
在运行时中,默认情况下,云功能在[email protected]
服务帐户下运行,其中PROJECT_ID
s是项目的ID,该云功能在其中部署(并应运行)。这是App Engine的默认服务帐户。
可以(并建议)根据最小特权原则创建专用的服务帐户。在这种情况下,您可以使用相应的参数部署云功能(在您的示例中不这样)。
据我对您的特定示例的全面了解,将使用默认的App Engine服务帐户。
无论哪种情况,云功能运行时服务帐户都应具有相关的特权(IAM权限/角色)以使用API和资源(在任何项目中)。
您能否检查云功能运行时服务帐户是否具有访问云存储桶的相关权限?请记住,云功能可能会部署到一个项目中,而存储桶可能会在另一个项目中。
在您的帖子中,您提到您拥有“具有某些权限的经过身份验证的服务帐户”。如果您使用默认的App Engine帐户部署服务帐户,该服务帐户是做什么用的?可能我错过了一些东西。“为了使用非默认服务帐户部署功能,部署人员必须iam.serviceAccounts.actAs
对正在部署的服务帐户具有权限。” -使用非默认身份所需的权限-如果是这种情况-请您也检查一下吗?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句