使用 IAM 进行访问权限控制

您(即部署函数的用户或服务账号)可以在项目级别使用角色来设置访问权限控制。请为项目成员或服务账号授予角色,从而确定该成员或账号对 Google Cloud 项目及其资源的访问权限级别。默认情况下,所有 Google Cloud 项目都只包含一位用户:原始项目创建者。其他用户在被添加为项目团队成员之后,才能访问相关项目和函数。

针对用户的访问权限控制

您可以将用户作为团队成员添加到项目中,然后使用身份和访问权限管理 (IAM) 为他们授予角色。

Cloud Functions 支持 EditorOwnerViewer 三个基础角色,这些角色提供以下权限:

  • EditorOwner:拥有所有函数相关资源的读写权限。这些角色的用户可以部署、更新和删除函数。若要访问项目中的其他资源,还需具备额外权限。
  • 查看者:拥有函数和位置的只读权限。此角色的用户可以列出函数和查看其详情,但无法查看源代码。若要访问项目中的其他资源,还需具备额外权限。

Cloud Run 函数还支持 Cloud Run 函数DeveloperViewer 预定义角色,这些角色提供以下权限:

  • Developer:拥有所有函数相关资源的读写权限。这些角色的用户可以部署、更新和删除函数。没有项目中其他资源的访问权限。
  • 查看者:拥有函数和位置的只读权限。此角色的用户可以列出函数和查看其详情,但无法查看源代码。没有项目中其他资源的访问权限。

针对服务账号的访问权限控制

服务账号是一种特殊类型的 Google Cloud 账号,充当需要验证身份并获得授权以访问数据并执行各项操作的非人类用户的身份。其中一些账号由 Google 本身创建和管理,称为服务代理

以下服务账号用于 Cloud Functions:

名称 成员 ID 角色
Compute Engine 默认服务账号 PROJECT_NUMBER-compute@developer.gserviceaccount.com 编辑者
Google Cloud Run 函数 Service Agent service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com Cloud Run 函数 Service Agent
PROJECT_NUMBER@cloudbuild.gserviceaccount.com Cloud Build Service Account
Cloud Build Service Account service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com Cloud Build Service Agent
Google Container Registry Service Agent service-PROJECT_NUMBER@containerregistry.iam.gserviceaccount.com Container Registry Service Agent
Artifact Registry Service Agent service-PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com Artifact Registry Service Agent

运行时服务账号

在运行时,Cloud Run 函数默认使用 Compute Engine 默认服务账号 (PROJECT_NUMBER-compute@developer.gserviceaccount.com),该账号在项目中也具有 Editor 角色。您可以更改这些服务账号的角色,以限制或扩展正在运行的函数的权限。您还可以通过提供非默认个人服务账号来更改使用的服务账号。

如需详细了解服务账号,请参阅服务账号文档

管理服务账号

如需在创建、更新或删除函数期间对您的项目执行管理操作,Cloud Functions 函数中的所有项目都需要 Google Cloud Functions Service Agent 服务账号 (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)。

此外,所有运行时都会在您的项目中执行容器映像构建和存储。为支持这一点,您还需要预配以下各项:

这些服务账号应具有上中列出的角色。

Google Cloud Run functions Service Agent 服务账号

默认情况下,Google Cloud Functions Service Agent 服务账号 (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com) 对项目具有 cloudfunctions.serviceAgent 角色。

以下是 cloudfunctions.serviceAgent 使用的一些重要权限:

权限 说明
roles/artifactregistry.admin 管理存储库库并将构建映像存储在 Artifact Registry 中。
roles/cloudbuild.builds.editor 使用 Cloud Build 在用户项目中执行构建时需要。
roles/cloudbuild.customworkers.builder 在 Cloud Build 自定义工作器中创建构建。
compute.globalOperations.get,
compute.networks.access,
vpcaccess.connectors.{get, use}
预配可访问使用方项目 VPC 的函数。
roles/eventarc.developer 管理函数的 Eventarc 触发器。
firebasedatabase.instances.{get, update} 创建由 Firebase 实时数据库触发的函数。
iam.serviceAccounts.{actAs, getAccessToken, signBlob} 获取运行时服务账号凭据。
iam.serviceAccounts.getOpenIdToken 代理获取用户指定机构的 OpenID 令牌时需要。OpenID 令牌用于调用 IAM 支持的函数。
pubsub.subscriptions 管理用户项目中的订阅。
pubsub.topics 管理用户项目中的主题。
roles/run.developer 管理 Cloud Run 函数服务。
storage.buckets.create,
storage.objects.{delete, get, create, list}
在用户项目中存储源代码时需要。

您可以在预定义的 IAM 角色下或运行以下命令来查看整组权限:

gcloud iam roles describe roles/cloudfunctions.serviceAgent

您可以将此服务账号重置为默认角色,方法是移除该账号当前具有的所有角色,并添加 Cloud Functions Service Agent 角色:

gcloud projects add-iam-policy-binding PROJECT_ID \
  --member serviceAccount:service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com \
  --role roles/cloudfunctions.serviceAgent

排查权限错误

如果您在项目中部署、更新、删除或执行函数时发生权限错误,请执行以下步骤:

  1. 确保您在项目中拥有 EditorOwner 角色,或您正在使用 Cloud Functions Developer 角色。

    如果您使用的是项目级层的 Cloud Run functions Developer 角色,还应确保向用户授予 IAM Service Account User 角色

    目前,在每个函数级层仅允许执行权限。

  2. 验证 Cloud Functions Service Agent 服务账号 (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com) 是否具有项目的 cloudfunctions.serviceAgent 角色。

    确保勾选控制台 IAM 页面的权限标签页上的包括 Google 提供的角色授权框,以查看此账号。或者,您也可以使用 gcloud projects add-iam-policy-binding PROJECT_ID

  3. 确保您拥有对触发器来源(例如 Pub/SubCloud Storage)的权限。

如果您在运行函数时遇到“权限不足”错误或其他身份验证问题,请确保运行时服务账号拥有适当权限,可以访问函数所需的资源,然后按照第 2 步和第 3 步进行操作。

如果您在部署期间遇到“服务不可用”错误,请确保项目中存在运行时服务账号 PROJECT_ID@appspot.gserviceaccount.com。如需重新创建这个已删除的服务账号,请参阅恢复删除的服务账号

另请参阅排查 Cloud Run 函数问题