本文档介绍如何授予 Identity and Access Management (IAM) 角色和权限,以支持使用 Eventarc 将事件从 Google Cloud 和其他来源路由到 Cloud Run 服务。
向调用 Eventarc API 的主账号授予项目范围权限(例如,Eventarc 触发器创建者):
- Eventarc Admin 角色可让您完全控制所有 Eventarc 资源,包括在创建触发器时为触发器指定服务账号。
- Service Account User 角色支持主账号模拟 (impersonate) 和使用服务账号。该服务账号与 Eventarc 触发器相关联,代表触发器的身份。
向触发器服务账号授予 Eventarc 触发器权限:Eventarc Event Receiver 角色可让您的 Eventarc 触发器接收来自事件提供方的事件。如果您要从 Cloud Pub/Sub 路由直接事件,则无需授予该角色。
向触发器服务账号授予 Cloud Run 服务权限:Cloud Run Invoker 角色允许 Eventarc 触发器调用目标 Cloud Run 服务。此选项适用于将事件路由到经过身份验证的 Cloud Run 服务。
-
- 如果您要为来自 Cloud Storage 的直接事件创建触发器,请授予 Pub/Sub Publisher 角色。
- 如果您在 2021 年 4 月 8 日或之前启用了 Cloud Pub/Sub 服务代理,请授予 Service Account Token Creator 角色。
如需详细了解如何授予 IAM 角色,请参阅管理访问权限。您也可以通过自定义角色或其他预定义角色来获取所需的权限。
授予项目范围的权限
如果您是项目创建者,则您会被授予基本 Owner 角色 (roles/owner
)。默认情况下,此角色可提供完全访问大多数 Google Cloud 资源所需的权限。否则,必需的角色必须由相应资源的管理员授予适当的主账号(也称为成员)。
例如,主账号可以是 Google 账号(针对最终用户)或服务账号(针对应用和计算工作负载)。每个主账号都有自己的标识符,标识符通常是电子邮件地址。
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
值的完整列表,请参阅政策绑定参考文档。
Service Account User 角色 (
roles/iam.serviceAccountUser
) 让主账号能够以服务账号身份运行操作。例如,您需要此角色才能将用户管理的服务账号与 Eventarc 触发器相关联。您也需要此角色才能在部署 Cloud Run 服务时充当运行时服务账号。如需了解详情,请参阅服务账号身份验证角色。
您可以授予项目的角色,以允许主账号模拟 (impersonate) 多个服务账号;也可以向服务账号授予角色,以仅允许主账号模拟特定的服务账号。
授予对项目的角色:
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.iam.gserviceaccount.com \ --member=PRINCIPAL \ --role=roles/iam.serviceAccountUser
替换以下内容:
SERVICE_ACCOUNT_PROJECT_ID
:包含服务账号的 Google Cloud 项目 ID。SERVICE_ACCOUNT_NAME
:服务账号的名称。
授予 Eventarc 触发器权限
每个 Eventarc 触发器在创建时都会与一个 IAM 服务账号相关联。您可以指定用户管理的服务账号,供触发器作为其默认身份。如果您在创建触发器期间未指定服务账号,则触发器将使用 Compute Engine 默认服务账号作为其身份。
我们建议您创建自己的用户管理的服务账号,以便在管理触发器时获得更大的控制力和灵活性。
创建服务账号并记下其名称:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \ --description="DESCRIPTION" \ --display-name="DISPLAY_NAME"
替换以下内容:
SERVICE_ACCOUNT_NAME
:服务账号的名称。此名称显示在用于标识服务账号的电子邮件地址中。DESCRIPTION
:服务账号的可选说明DISPLAY_NAME
:要在 Google Cloud 控制台中显示的服务账号名称
将项目的 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.iam.gserviceaccount.com \ --role=roles/eventarc.eventReceiver
将
SERVICE_ACCOUNT_NAME
替换为您在上一步中记下的服务账号的名称。
授予 Cloud Run 服务权限
所有 Cloud Run 服务在默认情况下都会以私密方式部署,这意味着,如果不在请求中提供身份验证凭据,就无法访问这些服务。对于采用网域限定共享组织政策的项目,请使用经过身份验证的 Cloud Run 目标服务,而不是允许公开(未经身份验证)访问的服务。
默认情况下,只有 Project Owner、Project Editor、Cloud Run Admin 和 Cloud Run Invoker 可以调用 Cloud Run 服务。
如果要将事件路由到经过身份验证的 Cloud Run 目标服务,请向与您的 Eventarc 触发器关联的用户管理的服务账号授予 Cloud Run 服务的 Cloud Run Invoker 角色 (
run.invoker
):gcloud run services add-iam-policy-binding SERVICE_NAME \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/run.invoker
将
SERVICE_NAME
替换为 Cloud Run 服务的名称。您也可以选择对 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 Cloud 服务具有服务代理,让服务可以访问您的资源。如果 API 需要服务代理,则 Google 会在您激活并使用 API 后创建服务代理。
如果您要为来自 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.iam.gserviceaccount.com \ --role=roles/pubsub.publisher
将
PROJECT_NUMBER
替换为您的 Google Cloud 项目编号。您可以在 Google Cloud 控制台的欢迎页面上或者通过运行以下命令找到项目编号:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
如果您在 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.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
后续步骤
了解使用服务账号的最佳实践。
了解如何描述触发器并验证其关联的服务账号。