【问题标题】:Cloud Build service account no access to storage.objects.getCloud Build 服务帐号无权访问 storage.objects.get
【发布时间】:2021-05-05 20:41:53
【问题描述】:

我正在尝试让 Google Cloud Functions 从存储桶中的文件中打印一些内容。 我将文件存储在一个存储桶中,一个经过身份验证的服务帐户 Storage AdminCloud Run AdminService Account UserCloud 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: 488395598433@cloudbuild.gserviceaccount.com does not have storage.objects.get access to the Google Cloud Storage object., forbidden

我觉得这很奇怪,因为我在我的 IAM 中看不到这个服务帐户,也无法在 Cloud Functions 中访问它的权限。任何帮助将不胜感激!

【问题讨论】:

  • 如果重新启用 Cloud Build API 后您仍然看不到它的服务帐户,请通过“IAM & Admin”->“IAM”页面手动添加它,授予它 Cloud Build 服务帐户角色。
  • 重新启用就可以了。我之前已经启用了 Cloud Build API,知道为什么没有出现相应的服务帐户吗?
  • 我也遇到了这个错误。 2021 年 4 月 20 日

标签: python google-cloud-platform google-cloud-functions google-iam


【解决方案1】:

如果您在其他服务帐户中看不到“xxxxxxxxxxxx@cloudbuild.gserviceaccount.com”。因此,我认为激活 Cloud Build API 时出现了问题。能否请您禁用 Cloud Build API,然后再次启用它以查看是否可以解决问题?

如果重新启用 Cloud Build API 后您仍然看不到它的服务帐户,请通过“IAM 和管理员”->“IAM”页面手动添加它,授予其 Cloud Build 服务帐户角色。

【讨论】:

  • 这里一样,虽然启用了 API,但找不到任何云构建服务帐户的痕迹。禁用/重新启用它修复它,谢谢
【解决方案2】:

请参阅:
Configure Access for Cloud Build Service Account 和此 link,它解释了自动创建的 Cloud Build 服务帐户的权限(在自动创建时授予)。

根据我的经验和我猜幕后发生的情况,我收到了这个错误,你可能也有,因为你是第一次使用 Cloud Build 服务。所以我在第一次运行脚本时遇到了错误,但在随后的运行中错误消失了。这意味着在服务器上授予权限需要时间。

【讨论】:

    【解决方案3】:

    我猜488395598433@cloudbuild.gserviceaccount.com - 是一个 Cloud Build 服务帐户,其中前缀(数字)是项目的编号,该项目正在运行 Cloud Build。请检查一下 Cloud Build API 是否已启用?请问Cloud Build服务账号有相关权限吗?

    在运行时,默认情况下,云功能在PROJECT_ID@appspot.gserviceaccount.com 服务帐户下运行,其中PROJECT_ID 是项目的ID,该云功能在其中部署(并且应该运行)。这是 App Engine 的默认服务帐号。

    可以(并且建议)根据最小权限原则创建专用服务帐户。在这种情况下,您可以使用对应的参数部署云函数(不在您的示例中)。

    根据我对您的特定示例的最佳理解,将使用默认的 App Engine 服务帐户。

    在任何一种情况下,云函数运行时服务帐户都应具有相关权限(IAM 权限/角色)以使用 API 和资源(在任何项目中)。

    您能否检查一下云函数运行时服务帐户是否具有访问云存储桶的相关权限?请记住,云功能可能部署到一个项目中,而存储桶可能位于另一个项目中。

    在您的帖子中,您提到您有一个“经过身份验证的服务帐户”,具有一些权限。如果您使用默认 App Engine 帐户部署服务帐户,该服务帐户有什么用?可能我错过了什么。 “为了使用非默认服务帐户部署功能,部署者必须对正在部署的服务帐户具有iam.serviceAccounts.actAs 权限。” - 来自Permissions required to use non-default identities 如果是你的情况 - 请你也检查一下吗?

    【讨论】:

    • 进行部署的服务账号前缀不是项目号。 Cloud Build API 已启用,重新启用后部署服务帐户出现在 IAM 中。赋予它适当的权限使我能够部署该功能。该功能现在确实由另一个服务帐户PROJECT_ID@appspot.gserviceaccount.com 运行。
    • 根据我的经验,以及到目前为止我看到的所有案例,Cloud Build 服务帐户中的数字前缀 - 比如488395598433@cloudbuild.gserviceaccount.com - 我的意思是数字488395598433 - 实际上是项目编号云构建服务运行的位置。根据 IAM 权限以及 GCP 项目和 API 配置,该服务帐号可以管理任意 GCP 项目中的任意资源。
    • Cloud Build 服务帐户和 Cloud Function 运行时服务帐户(讨论中的特定情况下的 App Engine 默认服务帐户)- 是完全不同的服务帐户。
    猜你喜欢
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 2019-09-18
    • 2016-08-09
    • 2017-01-28
    • 1970-01-01
    相关资源
    最近更新 更多