为 Cloud Run for Anthos 创建触发器

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

Eventarc 触发器声明您对某个事件或一系列事件感兴趣。要配置事件路由,您可以为触发器指定过滤条件,包括事件来源和目标 Cloud Run for Anthos 服务。

向 Pub/Sub 主题发布消息或者创建符合触发器过滤条件的审核日志都会触发对服务的请求。

准备工作

由于 Workload Identity 具有增强的安全属性和可管理性,因此它是从 Google Kubernetes Engine (GKE) 内运行的应用访问 Google Cloud 服务的推荐方法。它也是使用 Eventarc 转发 Cloud Run for Anthos 事件所必需的。确保您的 GKE 集群已启用 Workload Identity。

如需了解详情,请参阅使用 Workload Identity

准备创建触发器

对于针对 Cloud Run for Anthos 服务的每个触发器,Eventarc 会创建一个事件转发器组件。Eventarc 需要具有在 GKE 集群中安装组件和管理资源的权限。在为 Cloud Run for Anthos 目标创建 Eventarc 触发器之前,请务必完成以下任务。

启用 Eventarc API

要查看和分配 Identity and Access Management (IAM) 角色,您必须为项目启用 Eventarc API。在启用此 API 之前,您无法在 Cloud Console 中查看 Eventarc 角色。

gcloud services enable eventarc.googleapis.com

创建服务帐号

如果您还没有用户管理的服务帐号,请创建一个,然后为其授予必要的角色和权限,以便 Eventarc 可以管理 Cloud Run for Anthos 目标的事件。

  1. 设置项目配置变量:

    gcloud config set project PROJECT_ID
    

    PROJECT_ID 替换为您的 Google Cloud 项目 ID。您可以在 Google Cloud Console 的信息中心页面上找到项目 ID。

  2. 创建一个在创建触发器时使用的服务帐号:

    TRIGGER_SA=SA_NAME
    gcloud iam service-accounts create $TRIGGER_SA

    SA_NAME 替换为服务帐号的名称。该名称必须介于 6 到 30 个字符之间,且可以包含小写字母数字字符和短划线。在服务帐号创建完毕后,无法再更改其名称。

  3. 向服务帐号授予适当的角色:

    Cloud Audit Logs

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:$TRIGGER_SA@PROJECT_NUMBER.iam.gserviceaccount.com" \
      --role "roles/pubsub.subscriber"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:$TRIGGER_SA@PROJECT_NUMBER.iam.gserviceaccount.com" \
      --role "roles/monitoring.metricWriter"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:$TRIGGER_SA@PROJECT_NUMBER.iam.gserviceaccount.com" \
      --role "roles/eventarc.eventReceiver"
    

    Cloud Storage

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:$TRIGGER_SA@PROJECT_NUMBER.iam.gserviceaccount.com" \
      --role "roles/pubsub.subscriber"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:$TRIGGER_SA@PROJECT_NUMBER.iam.gserviceaccount.com" \
      --role "roles/monitoring.metricWriter"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:$TRIGGER_SA@PROJECT_NUMBER.iam.gserviceaccount.com" \
      --role "roles/eventarc.eventReceiver"
    

    Pub/Sub 主题

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:$TRIGGER_SA@PROJECT_NUMBER.iam.gserviceaccount.com" \
      --role "roles/pubsub.subscriber"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:$TRIGGER_SA@PROJECT_NUMBER.iam.gserviceaccount.com" \
      --role "roles/monitoring.metricWriter"
    
    

    PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。您可以在 Google Cloud Console 的信息中心页面上找到您的项目编号。

  4. 如果您要创建 Cloud Storage 触发器,请向 Cloud Storage 服务帐号授予 pubsub.publisher 角色:

    SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p PROJECT_ID)"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:${SERVICE_ACCOUNT}" \
        --role='roles/pubsub.publisher'
    

启用 GKE 目标

如需允许 Eventarc 管理 GKE 集群中的资源,请启用 GKE 目标,并将 Eventarc 服务帐号绑定到所需的角色。

  1. 为 Eventarc 启用 GKE 目标:

    gcloud eventarc gke-destinations init
    
  2. 在系统提示绑定所需角色时,输入 y

    绑定以下角色:

    • roles/compute.viewer
    • roles/container.developer
    • roles/iam.serviceAccountAdmin

使用 Google Cloud CLI 创建触发器

您可以通过运行包含必需和可选标志的 gcloud eventarc triggers create 命令来创建触发器。

Cloud Audit Logs

gcloud eventarc triggers create TRIGGER \
    --location=LOCATION \
    --destination-gke-cluster=DESTINATION_GKE_CLUSTER \
    --destination-gke-location=DESTINATION_GKE_LOCATION \
    --destination-gke-namespace=DESTINATION_GKE_NAMESPACE \
    --destination-gke-service=DESTINATION_GKE_SERVICE \
    --destination-gke-path=DESTINATION_GKE_PATH \
    --event-filters="type=google.cloud.audit.log.v1.written" \
    --event-filters="serviceName=SERVICE_NAME" \
    --event-filters="methodName=METHOD_NAME" \
    --service-account=TRIGGER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com

替换以下内容:

  • TRIGGER 是触发器的 ID 或完全限定标识符。
  • LOCATION:Eventarc 触发器的位置。为避免全球触发器导致任何性能和数据驻留问题,触发器位置应与生成事件的 Google Cloud 服务的位置匹配。或者,您可以设置 eventarc/location 属性;例如 gcloud config set eventarc/location us-central1。如需了解详情,请参阅 Eventarc 位置
  • DESTINATION_GKE_CLUSTER:接收事件的目标 Cloud Run for Anthos 服务在其中运行的 GKE 集群的名称。
  • DESTINATION_GKE_LOCATION:目的地 Cloud Run for Anthos 服务所在的位置。如果未指定,系统将假定服务与触发器位于同一区域。 如需了解详情,请参阅 Cloud Run for Anthos on Google Cloud 位置
  • DESTINATION_GKE_NAMESPACE:运行目的地 Cloud Run for Anthos 服务的命名空间。如果未指定,系统会使用 default 命名空间。
  • DESTINATION_GKE_SERVICE:接收触发器事件的 Cloud Run for Anthos 服务的名称。除非触发器的位置是全球位置,否则该服务必须与触发器位于同一区域。该服务必须与触发器位于同一项目中,并在事件生成时,接收作为 HTTP POST 请求发送到其根网址路径 (/) 的事件。
  • (可选)DESTINATION_GKE_PATH:应向其发送触发器的事件的目的地 Cloud Run for Anthos 服务上指定的相对路径。例如://routerouteroute/subroute
  • SERVICE_NAME:Google Cloud 服务的标识符。
  • METHOD_NAME:操作的标识符。
  • TRIGGER_SERVICE_ACCOUNT:与触发器关联并且您之前授予了 Eventarc 所需的特定角色的 IAM 服务帐号电子邮件地址。例如:$TRIGGER_SA@PROJECT_ID.iam.gserviceaccount.com
  • PROJECT_ID:您的 Google Cloud 项目 ID。

注意:

  • 这些标志是必需的:
    • --event-filters="type=google.cloud.audit.log.v1.written"
    • --event-filters="serviceName=VALUE"
    • --event-filters="methodName=VALUE"
  • 如需查看 Eventarc 支持的审核日志事件列表(包括 serviceNamemethodName 值),请参阅 Eventarc 支持的事件
  • 每个触发器可以有多个事件过滤条件,在一个 --event-filters=[ATTRIBUTE=VALUE,...] 标志内以英文逗号分隔,您也可以重复使用该标志来添加更多过滤条件。只有符合所有过滤条件的事件会被发送到目标。不支持通配符和正则表达式。请参阅确定 Cloud Audit Logs 的事件过滤条件
  • (可选)如需过滤特定资源的事件,您可以使用 --event-filters="resourceName=VALUE" 标志并指定资源的完整路径。忽略动态创建的资源的标志,系统在创建这些资源时会生成标识符。

例如:

  gcloud eventarc triggers create cal-gke-trigger \
      --location=us-central1 \
      --destination-gke-cluster=gke-events-cluster \
      --destination-gke-location=us-central1-a \
      --destination-gke-namespace=default \
      --destination-gke-service=helloworld-events \
      --destination-gke-path=/ \
      --event-filters="type=google.cloud.audit.log.v1.written" \
      --event-filters="serviceName=storage.googleapis.com" \
      --event-filters="methodName=storage.buckets.update" \
      --event-filters="resourceName=projects/_/buckets/eventarc-bucket/objects/random.txt" \
      --service-account=${TRIGGER_SA}@${PROJECT_ID}.iam.gserviceaccount.com

这会为由 storage.googleapis.com 写入的审核日志和标识为 storage.buckets.update 的操作创建名为 cal-gke-trigger 的触发器。

Cloud Storage

gcloud eventarc triggers create TRIGGER \
    --location=LOCATION \
    --destination-gke-cluster=DESTINATION_GKE_CLUSTER \
    --destination-gke-location=DESTINATION_GKE_LOCATION \
    --destination-gke-namespace=DESTINATION_GKE_NAMESPACE \
    --destination-gke-service=DESTINATION_GKE_SERVICE \
    --destination-gke-path=DESTINATION_GKE_PATH \
    --event-filters="type=EVENT_FILTER_TYPE" \
    --event-filters="bucket=BUCKET" \
    --service-account=TRIGGER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com

替换以下内容:

  • TRIGGER 是触发器的 ID 或完全限定标识符。
  • LOCATION:Eventarc 触发器的位置。Cloud Storage 存储桶必须与 Eventarc 触发器位于同一 Google Cloud 项目和区域或多区域中。或者,您可以设置 eventarc/location 属性;例如 gcloud config set eventarc/location us-central1。如需了解详情,请参阅 Eventarc 位置
  • DESTINATION_GKE_CLUSTER:接收事件的目标 Cloud Run for Anthos 服务在其中运行的 GKE 集群的名称。
  • DESTINATION_GKE_LOCATION:目的地 Cloud Run for Anthos 服务所在的位置。如果未指定,系统将假定服务与触发器位于同一区域。 如需了解详情,请参阅 Cloud Run for Anthos on Google Cloud 位置
  • DESTINATION_GKE_NAMESPACE:运行目的地 Cloud Run for Anthos 服务的命名空间。如果未指定,系统会使用 default 命名空间。
  • DESTINATION_GKE_SERVICE:接收触发器事件的 Cloud Run for Anthos 服务的名称。除非触发器的位置是全球位置,否则该服务必须与触发器位于同一区域。该服务必须与触发器位于同一项目中,并在事件生成时,接收作为 HTTP POST 请求发送到其根网址路径 (/) 的事件。
  • (可选)DESTINATION_GKE_PATH:应向其发送触发器的事件的目的地 Cloud Run for Anthos 服务上指定的相对路径。例如://routerouteroute/subroute
  • EVENT_FILTER_TYPE:Cloud Storage 事件的标识符,可以是以下各项之一:
    • google.cloud.storage.object.v1.finalized - 当存储桶中创建了新对象(或者现有对象被覆盖,以及创建了该对象的新实例)时,系统将发送事件
    • google.cloud.storage.object.v1.archived - 事件在对象的现行版本被归档或被删除时发送。系统仅针对启用了版本控制的存储桶发送此事件。
    • google.cloud.storage.object.v1.deleted - 事件在某个对象被永久删除时发送。根据存储桶的对象版本控制设置,这意味着:
      • 对于启用了版本控制的存储桶,只有当某个版本被永久删除时(而不是在对象被归档时),系统才会发送此事件。
      • 对于未启用版本控制的存储桶,当某个对象被删除或覆盖时,系统会发送此事件。
    • google.cloud.storage.object.v1.metadataUpdated - 事件在现有对象的元数据发生更改时发送。
  • BUCKET 是 Cloud Storage 存储桶的全球唯一标识符。
  • TRIGGER_SERVICE_ACCOUNT:与触发器关联并且您之前授予了 Eventarc 所需的特定角色的 IAM 服务帐号电子邮件地址。例如:$TRIGGER_SA@PROJECT_ID.iam.gserviceaccount.com
  • PROJECT_ID 是您的 Google Cloud 项目 ID。

注意:

  • 这些标志是必需的:
    • --event-filters="type=EVENT_FILTER_TYPE"
    • --event-filters="bucket=BUCKET"
  • 一旦创建触发器,EVENT_FILTER_TYPE 便无法修改。请创建新触发器,并删除旧触发器。
  • 事件是通过来自 Cloud Storage 的 Pub/Sub 通知传送的。针对同一存储桶设置过多的注册通知可能会耗尽存储桶的通知限制,如错误 Cloud Storage bucket ...: Pub/Sub notification limit reached 所示。存储桶最多可将 10 项通知配置设置为针对特定事件触发。请参阅 Cloud Storage 配额和限制页面,详细了解配额和限制。
  • 每个触发器可以有多个事件过滤条件,在一个 --event-filters=[ATTRIBUTE=VALUE,...] 标志内以英文逗号分隔,您也可以重复使用该标志来添加更多过滤条件。只有符合所有过滤条件的事件会被发送到目标。不支持通配符和正则表达式。
  • --service-account 标志用于指定与触发器关联的 Identity and Access Management (IAM) 服务帐号电子邮件。
  • (可选)DESTINATION_GKE_PATH:应向其发送触发器的事件的目的地 Cloud Run for Anthos 服务上指定的相对路径。例如://routerouteroute/subroute

例如:

  gcloud eventarc triggers create gcs-gke-trigger \
      --location=us-central1 \
      --destination-gke-cluster=gke-events-cluster \
      --destination-gke-location=us-central1-a \
      --destination-gke-namespace=default \
      --destination-gke-service=helloworld-events \
      --destination-gke-path=/ \
      --event-filters=type=google.cloud.storage.object.v1.finalized \
      --event-filters="bucket=my-project-bucket" \
      --service-account=${TRIGGER_SA}@${PROJECT_ID}.iam.gserviceaccount.com

此命令会为 Cloud Storage 存储桶 my-project-bucket 和标识为 google.cloud.storage.object.v1.finalized 的事件创建一个名为 gcs-gke-trigger 的触发器。

现有 Pub/Sub 主题

gcloud eventarc triggers create TRIGGER \
    --location=LOCATION \
    --destination-gke-cluster=DESTINATION_GKE_CLUSTER \
    --destination-gke-location=DESTINATION_GKE_LOCATION \
    --destination-gke-namespace=DESTINATION_GKE_NAMESPACE \
    --destination-gke-service=DESTINATION_GKE_SERVICE \
    --destination-gke-path=DESTINATION_GKE_PATH \
    --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
    --transport-topic=projects/PROJECT_ID/topics/TOPIC_ID \
    --service-account=TRIGGER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com

请替换以下内容:

  • TRIGGER 是触发器的 ID 或完全限定标识符。
  • LOCATION:Eventarc 触发器的位置。为避免全球触发器导致任何性能和数据驻留问题,触发器位置应与生成事件的 Google Cloud 服务的位置匹配。或者,您可以设置 eventarc/location 属性;例如 gcloud config set eventarc/location us-central1。如需了解详情,请参阅 Eventarc 位置
  • DESTINATION_GKE_CLUSTER:接收事件的目标 Cloud Run for Anthos 服务在其中运行的 GKE 集群的名称。
  • DESTINATION_GKE_LOCATION:目的地 Cloud Run for Anthos 服务所在的位置。如果未指定,系统将假定服务与触发器位于同一区域。 如需了解详情,请参阅 Cloud Run for Anthos on Google Cloud 位置
  • DESTINATION_GKE_NAMESPACE:运行目的地 Cloud Run for Anthos 服务的命名空间。如果未指定,系统会使用 default 命名空间。
  • DESTINATION_GKE_SERVICE:接收触发器事件的 Cloud Run for Anthos 服务的名称。除非触发器的位置是全球位置,否则该服务必须与触发器位于同一区域。该服务必须与触发器位于同一项目中,并在事件生成时,接收作为 HTTP POST 请求发送到其根网址路径 (/) 的事件。
  • (可选)DESTINATION_GKE_PATH:应向其发送触发器的事件的目的地 Cloud Run for Anthos 服务上指定的相对路径。例如://routerouteroute/subroute
  • PROJECT_ID 是您的 Google Cloud 项目 ID。
  • TOPIC_ID 是现有 Pub/Sub 主题的 ID。主题必须与触发器位于同一项目中。
  • TRIGGER_SERVICE_ACCOUNT:与触发器关联并且您之前授予了 Eventarc 所需的特定角色的 IAM 服务帐号电子邮件地址。例如:$TRIGGER_SA@PROJECT_ID.iam.gserviceaccount.com

注意:

  • --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" 标志是必需的。
  • 每个触发器可以有多个事件过滤条件,在一个 --event-filters=[ATTRIBUTE=VALUE,...] 标志内以英文逗号分隔,您也可以重复使用该标志来添加更多过滤条件。只有符合所有过滤条件的事件会被发送到目标。不支持通配符和正则表达式。
  • --transport-topic 标志用于指定现有 Pub/Sub 主题的 ID 或其完全限定标识符。
  • 默认情况下,为 Eventarc 创建的 Pub/Sub 订阅会持续存在(无论其活跃状态如何),并且不会过期。如需更改非活跃状态持续时间,请参阅管理订阅

例如:

  gcloud eventarc triggers create pubsub-gke-trigger-existing \
      --destination-gke-cluster=gke-events-cluster \
      --destination-gke-location=us-central1-a \
      --destination-gke-namespace=default \
      --destination-gke-service=helloworld \
      --destination-gke-path=/ \
      --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
      --transport-topic=projects/${PROJECT_ID}/topics/${TOPIC_ID} \
      --service-account=${TRIGGER_SA}@${PROJECT_ID}.iam.gserviceaccount.com

这会为 projects/${PROJECT_ID}/topics/${TOPIC_ID} 标识的 Pub/Sub 主题创建一个名为 pubsub-gke-trigger-existing 的触发器。

新的 Pub/Sub 主题

gcloud eventarc triggers create TRIGGER \
    --location=LOCATION \
    --destination-gke-cluster=DESTINATION_GKE_CLUSTER \
    --destination-gke-location=DESTINATION_GKE_LOCATION \
    --destination-gke-namespace=DESTINATION_GKE_NAMESPACE \
    --destination-gke-service=DESTINATION_GKE_SERVICE \
    --destination-gke-path=DESTINATION_GKE_PATH \
    --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
    --service-account=TRIGGER_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com

替换以下内容:

  • TRIGGER 是触发器的 ID 或完全限定标识符。
  • LOCATION:Eventarc 触发器的位置。为避免全球触发器导致任何性能和数据驻留问题,触发器位置应与生成事件的 Google Cloud 服务的位置匹配。或者,您可以设置 eventarc/location 属性;例如 gcloud config set eventarc/location us-central1。如需了解详情,请参阅 Eventarc 位置
  • DESTINATION_GKE_CLUSTER:接收事件的目标 Cloud Run for Anthos 服务在其中运行的 GKE 集群的名称。
  • DESTINATION_GKE_LOCATION:目的地 Cloud Run for Anthos 服务所在的位置。如果未指定,系统将假定服务与触发器位于同一区域。 如需了解详情,请参阅 Cloud Run for Anthos on Google Cloud 位置
  • DESTINATION_GKE_NAMESPACE:运行目的地 Cloud Run for Anthos 服务的命名空间。如果未指定,系统会使用 default 命名空间。
  • DESTINATION_GKE_SERVICE:接收触发器事件的 Cloud Run for Anthos 服务的名称。除非触发器的位置是全球位置,否则该服务必须与触发器位于同一区域。该服务必须与触发器位于同一项目中,并在事件生成时,接收作为 HTTP POST 请求发送到其根网址路径 (/) 的事件。
  • (可选)DESTINATION_GKE_PATH:应向其发送触发器的事件的目的地 Cloud Run for Anthos 服务上指定的相对路径。例如://routerouteroute/subroute
  • TRIGGER_SERVICE_ACCOUNT:与触发器关联并且您之前授予了 Eventarc 所需的特定角色的 IAM 服务帐号电子邮件地址。例如:$TRIGGER_SA@PROJECT_ID.iam.gserviceaccount.com
  • PROJECT_ID 是您的 Google Cloud 项目 ID。

注意:

  • --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" 标志是必需的。
  • 每个触发器可以有多个事件过滤条件,在一个 --event-filters=[ATTRIBUTE=VALUE,...] 标志内以英文逗号分隔,您也可以重复使用该标志来添加更多过滤条件。只有符合所有过滤条件的事件会被发送到目标。不支持通配符和正则表达式。
  • 默认情况下,为 Eventarc 创建的 Pub/Sub 订阅会持续存在(无论其活跃状态如何),并且不会过期。如需更改非活跃状态持续时间,请参阅管理订阅

例如:

  gcloud eventarc triggers create pubsub-gke-trigger-new \
      --location=us-central1 \
      --destination-gke-cluster=gke-events-cluster \
      --destination-gke-location=us-central1-a \
      --destination-gke-namespace=default \
      --destination-gke-service=helloworld \
      --destination-gke-path=/ \
      --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
      --service-account=${TRIGGER_SA}@${PROJECT_ID}.iam.gserviceaccount.com

这会创建一个新的 Pub/Sub 主题和一个名为 pubsub-gke-trigger-new 的触发器。

使用 Google Cloud Console 创建触发器

您可以通过 Cloud Console 创建触发器。如需了解详情,请参阅通过 Cloud Console 创建 Eventarc 触发器

使用 Google Cloud CLI 列出触发器

您可以通过列出 Eventarc 触发器来确认已创建触发器:

gcloud eventarc triggers list --location=LOCATION

LOCATION 替换为 Eventarc 触发器位置的 ID 或完全限定标识符,例如 us-central1

如需详细了解如何管理 Eventarc 触发器,请参阅管理触发器

后续步骤

  • 如需开始使用 Eventarc for Cloud Run for Anthos,请参阅快速入门