Cloud Run functions 目标的角色和权限

本文档介绍如何授予 Identity and Access Management (IAM) 角色和权限,以支持使用 Eventarc 将事件从 Google Cloud 和其他来源路由到 Cloud Run functions。

  1. 向创建触发器和部署函数的主账号授予项目范围权限和部署权限:

    1. Eventarc Admin 角色可让您完全控制所有 Eventarc 资源,包括在创建触发器时为触发器指定服务账号。

    2. Service Account User 角色允许主账号模拟和使用服务账号,包括触发器服务账号和函数运行时或构建服务账号。

    3. 根据您部署函数的方式,Cloud Run Source Developer 和 Service Usage Consumer 角色(使用 gcloud run CLI 或 Cloud Run Admin API 部署时)或 Cloud Functions Developer 或 Cloud Functions Admin 角色(使用 gcloud functions CLI 或 Cloud Functions v2 API 部署时)可让您创建和更新函数。

  2. 向触发器服务账号授予 Eventarc 触发器权限:Eventarc Event Receiver 角色可让您的 Eventarc 触发器接收来自事件提供方的事件。如果您要从 Cloud Pub/Sub 路由直接事件,则无需授予该角色。

  3. 向触发器服务账号授予 Cloud Run functions 调用权限:Cloud Run Invoker 角色可让 Eventarc 触发器调用经过身份验证的 Cloud Run functions 函数。

  4. 向 Google 服务代理授予权限:

    1. Eventarc Service Agent 角色可让 Eventarc 服务代理管理底层传输资源并验证事件来源。首次创建 Eventarc 资源时,系统会默认授予此角色,但如果此角色被移除,您必须将其恢复。

    2. 如果您要使用 gcloud functions CLI 或 Cloud Functions v2 API 部署函数,则 Cloud Functions Service Agent 角色可让 Cloud Functions 服务代理创建和管理 Eventarc 触发器和底层 Cloud Run 服务。当您启用 Cloud Functions API 时,系统会默认授予此角色,但如果此角色被移除,您必须将其恢复。

    3. 如果您要为来自 Cloud Storage 的直接事件创建触发器,请向 Cloud Storage 服务代理授予 Pub/Sub Publisher 角色。

    4. 如果您在 2021 年 4 月 8 日或之前启用了 Cloud Pub/Sub 服务代理,请向 Pub/Sub 服务代理授予 Service Account Token Creator 角色。

如需详细了解如何授予 IAM 角色,请参阅管理访问权限。您也可以通过自定义角色或其他预定义角色来获取所需的权限。

授予项目范围的权限和部署权限

如果您是项目创建者,则您会被授予基本 Owner 角色 (roles/owner)。默认情况下,此角色可提供完全访问大多数Google Cloud 资源所需的权限。否则,必需的角色必须由相应资源的管理员授予适当的主账号(也称为成员)。

例如,主账号可以是 Google 账号(针对最终用户)或服务账号(针对应用和计算工作负载)。每个主账号都有自己的标识符,标识符通常是电子邮件地址。

  1. Eventarc Admin 角色 (roles/eventarc.admin) 可让您完全控制所有 Eventarc 资源。

    授予对项目的角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=PRINCIPAL \
      --role=roles/eventarc.admin

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目 ID。

    • PRINCIPAL:触发器创建者的标识符,通常其格式如下:PRINCIPAL_TYPE:ID。例如 user:my-user@example.com。如需查看可能的 PRINCIPAL_TYPE 值的完整列表,请参阅政策绑定参考文档。

  2. Service Account User 角色 (roles/iam.serviceAccountUser) 让主账号能够以服务账号身份运行操作。

    您需要此角色才能将用户代管式服务账号与 Eventarc 触发器相关联。您也需要此角色,以便在部署 Cloud Run 函数时充当运行时服务账号,并在从源代码部署时充当构建服务账号。如需了解详情,请参阅服务账号身份验证角色。

    您可以授予项目的角色,以允许主账号模拟多个服务账号;也可以向服务账号授予角色,以仅允许主账号模拟特定的服务账号。

    授予对项目的角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=PRINCIPAL \
      --role=roles/iam.serviceAccountUser

    或者,向服务账号授予角色:

    gcloud iam service-accounts add-iam-policy-binding \
      projects/SERVICE_ACCOUNT_PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@SERVICE_ACCOUNT_PROJECT_ID. \
      --member=PRINCIPAL \
      --role=roles/iam.serviceAccountUser

    替换以下内容:

    • SERVICE_ACCOUNT_PROJECT_ID:包含服务账号的 Google Cloud项目 ID。

    • SERVICE_ACCOUNT_NAME:服务账号的名称。

  3. 根据 Cloud Run 函数的部署方式,授予部署该函数所需的角色:

授予 Eventarc 触发器权限

每个 Eventarc 触发器在创建时都会与一个 IAM 服务账号相关联。您可以指定用户代管式服务账号,供触发器作为其默认身份。如果您在创建触发器期间未指定服务账号,则触发器将使用 Compute Engine 默认服务账号作为其身份。

我们建议您创建自己的用户管理的服务账号,以便在管理触发器时获得更大的控制力和灵活性。

  1. 创建服务账号并记下其名称:

    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
      --description="DESCRIPTION" \
      --display-name="DISPLAY_NAME"

    替换以下内容:

    • SERVICE_ACCOUNT_NAME:服务账号的名称。此名称显示在用于标识服务账号的电子邮件地址中。

    • DESCRIPTION:服务账号的可选说明。

    • DISPLAY_NAME:要在 Google Cloud 控制台中显示的服务账号名称。

  2. 将项目的 Eventarc Event Receiver 角色 (roles/eventarc.eventReceiver) 授予给与您的 Eventarc 触发器关联的服务账号,使得触发器可以接收来自事件提供方的事件。

    请注意,如果您要从 Cloud Pub/Sub 路由直接事件,则无需授予 Eventarc Event Receiver 角色。

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID. \
      --role=roles/eventarc.eventReceiver

    将 SERVICE_ACCOUNT_NAME 替换为您在上一步中记下的服务账号的名称。

授予 Cloud Run functions 调用权限

默认情况下,Cloud Run functions 需要进行身份验证,这意味着,如果不在请求中提供身份验证凭据,就无法调用这些函数。对于采用网域限制共享组织政策的项目,请使用经过身份验证的目标函数,而不是允许公开(未经身份验证)访问的函数。

  1. 如果要将事件路由到经过身份验证的 Cloud Run 函数,请向与您的 Eventarc 触发器关联的服务账号授予底层 Cloud Run 服务的 Cloud Run Invoker 角色 (roles/run.invoker):

    gcloud run services add-iam-policy-binding FUNCTION_NAME \
      --region=REGION \
      --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID. \
      --role=roles/run.invoker

    替换以下内容:

    • FUNCTION_NAME:Cloud Run 函数的名称。

    • REGION:函数部署到的区域。

  2. 您也可以选择对 Google Cloud 项目中的所有 Cloud Run 服务、函数和作业授予该角色。如需了解详情,请参阅控制对项目中所有服务和作业的访问权限。

请注意,如果您在未授予 Cloud Run Invoker 角色的情况下为经过身份验证的 Cloud Run 函数创建触发器,则触发器会成功创建且处于活动状态。但是,触发器将无法按预期运行,并且日志中会显示类似于以下内容的消息:

The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header.

向 Google 服务代理授予权限

某些 Google Cloud 服务具有服务代理,让服务可以访问您的资源。如果 API 需要服务代理,则 Google 会在您激活并使用 API 后创建服务代理。

  1. 如果 Eventarc Service Agent 角色 (roles/eventarc.serviceAgent) 已从 Eventarc 服务代理中移除,请在项目中授予该角色,以便 Eventarc 可以管理底层传输资源并验证事件来源。否则,当您首次创建 Eventarc 资源时,系统会默认授予此角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-eventarc. \
      --role=roles/eventarc.serviceAgent

    将 PROJECT_NUMBER 替换为您的 Google Cloud项目编号。您可以在 Google Cloud 控制台的欢迎页面上,或通过运行以下命令来查找项目编号:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'
  2. 如果您要使用 gcloud functions deploy 或 Cloud Functions v2 API 部署函数,并且已从 Cloud Functions 服务代理中移除 Cloud Functions Service Agent 角色 (roles/cloudfunctions.serviceAgent),请在项目中授予该角色,以便服务代理可以创建和管理 Eventarc 触发器和底层 Cloud Run 服务。否则,当您启用 Cloud Functions API 时,系统会默认授予此角色:

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

    请注意,此角色已弃用,仅适用于使用 Cloud Functions API 创建的函数。对于使用 Cloud Run 创建的函数,请参阅 Cloud Run 角色和权限页面。

  3. 如果您要为来自 Cloud Storage 的直接事件创建触发器,以支持向主题发布消息,请向 Cloud Storage 服务代理授予项目的 Pub/Sub Publisher 角色 (roles/pubsub.publisher):

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:service-PROJECT_NUMBER@gs-project-accounts. \
      --role=roles/pubsub.publisher
  4. 如果您在 2021 年 4 月 8 日或之前启用了 Cloud Pub/Sub 服务代理,为了支持经过身份验证的 Pub/Sub 推送请求,请向 Pub/Sub 服务代理授予项目的 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator)。否则,系统会默认授予此角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub. \
      --role=roles/iam.serviceAccountTokenCreator

后续步骤