使用 IAM 进行访问权限控制
您(即部署函数的用户或服务账号)可以在项目级别使用角色来设置访问权限控制。请为项目成员或服务账号授予角色,从而确定该成员或账号对 Google Cloud 项目及其资源的访问权限级别。默认情况下,所有 Google Cloud 项目都只包含一位用户:原始项目创建者。其他用户在被添加为项目团队成员之后,才能访问相关项目和函数。
针对用户的访问权限控制
您可以将用户作为团队成员添加到项目中,然后使用身份和访问权限管理 (IAM) 为他们授予角色。
Cloud Functions 支持 Editor、Owner 和 Viewer 三个基础角色,这些角色提供以下权限:
- Editor 和 Owner:拥有所有函数相关资源的读写权限。这些角色的用户可以部署、更新和删除函数。若要访问项目中的其他资源,还需具备额外权限。
- 查看者:拥有函数和位置的只读权限。此角色的用户可以列出函数和查看其详情,但无法查看源代码。若要访问项目中的其他资源,还需具备额外权限。
Cloud Run 函数还支持 Cloud Run 函数Developer 和 Viewer 预定义角色,这些角色提供以下权限:
- 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
)。
此外,所有运行时都会在您的项目中执行容器映像构建和存储。为支持这一点,您还需要预配以下各项:
- 基本 Cloud Build 服务账号 (
PROJECT_NUMBER@cloudbuild.gserviceaccount.com
) - Cloud Build Service Agent 服务账号 (
service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com
) - Google Container Registry Service Agent 服务账号 (
service-PROJECT_NUMBER@containerregistry.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
排查权限错误
如果您在项目中部署、更新、删除或执行函数时发生权限错误,请执行以下步骤:
确保您在项目中拥有 Editor 或 Owner 角色,或您正在使用 Cloud Functions Developer 角色。
如果您使用的是项目级层的 Cloud Run functions Developer 角色,还应确保向用户授予 IAM Service Account User 角色。
目前,在每个函数级层仅允许执行权限。
验证 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
。确保您拥有对触发器来源(例如 Pub/Sub 或 Cloud Storage)的权限。
如果您在运行函数时遇到“权限不足”错误或其他身份验证问题,请确保运行时服务账号拥有适当权限,可以访问函数所需的资源,然后按照第 2 步和第 3 步进行操作。
如果您在部署期间遇到“服务不可用”错误,请确保项目中存在运行时服务账号 PROJECT_ID@appspot.gserviceaccount.com
。如需重新创建这个已删除的服务账号,请参阅恢复删除的服务账号。
另请参阅排查 Cloud Run 函数问题。