接收来自 Cloud Storage 的直接事件 (gcloud CLI)

本快速入门向您展示如何使用 Eventarc 在未经身份验证的 Cloud Run 服务中从 Cloud Storage 接收直接事件(不使用 Cloud Audit Logs)。

您可以配置通知触发以响应 Cloud Storage 存储桶内的各种事件 - 对象创建、删除、归档和元数据更新。如需了解详情,请参阅创建触发器以将 Cloud Storage 事件路由到 Cloud Run

在本快速入门中,您将执行以下操作:

  1. 创建 Cloud Storage 存储桶作为事件来源。

  2. 将事件接收器服务部署到 Cloud Run。

  3. 创建 Eventarc 触发器。

  4. 通过将文件上传到 Cloud Storage 存储桶来创建事件,并在 Cloud Run 日志中查看该事件。

准备工作

您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 安装 Google Cloud CLI。
  3. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  4. 创建或选择 Google Cloud 项目

    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目 名称。

  5. 确保您的 Google Cloud 项目已启用结算功能

  6. 安装 Google Cloud CLI。
  7. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  8. 创建或选择 Google Cloud 项目

    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目 名称。

  9. 确保您的 Google Cloud 项目已启用结算功能

  10. 启用 Cloud Run、Cloud Storage、Eventarc 和 Pub/Sub API。

    gcloud services enable \
    eventarc.googleapis.com \
    pubsub.googleapis.com \
    run.googleapis.com \
    storage.googleapis.com
  11. 更新 gcloud 组件:
    gcloud components update
  12. 使用您的账号登录:
    gcloud auth login
  13. 设置本快速入门中使用的配置变量:
    gcloud config set run/region us-central1
    gcloud config set run/platform managed
    gcloud config set eventarc/location us-central1
  14. 如果您是项目创建者,则会被授予基本 Owner 角色 (roles/owner)。默认情况下,此 Identity and Access Management (IAM) 角色可提供完全访问大多数 Google Cloud 资源所需的权限,您可以跳过此步骤。

    如果您不是项目创建者,则必须向主账号授予项目的必需权限。例如,主账号可以是 Google 账号(针对最终用户)或服务账号(针对应用和计算工作负载)。如需了解详情,请参阅事件目标位置的角色和权限页面。

    所需权限

    如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

    如需详细了解如何授予角色,请参阅管理访问权限

    您也可以通过自定义角色或其他预定义角色来获取所需的权限。

  15. 启用或使用包含 Compute Engine 的 Google Cloud 服务后,系统会自动创建 Compute Engine 默认服务账号

    为了进行测试,您可以将此服务账号附加到 Eventarc 触发器以表示该触发器的身份。请记下创建触发器时要使用的电子邮件地址格式:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

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

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

    系统会自动向 Compute Engine 服务账号授予项目的基本 Editor 角色 (roles/editor)。但是,如果自动角色授予功能已停用,请参阅适用的角色和权限说明以创建新的服务账号并为其授予所需的角色。

  16. 将项目的 Eventarc Event Receiver 角色 (roles/eventarc.eventReceiver) 授予 Compute Engine 默认服务账号,以便 Eventarc 触发器可以接收来自事件提供程序的事件。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/eventarc.eventReceiver
  17. 在为 Cloud Storage 中的直接事件创建触发器之前,请将 Pub/Sub Publisher 角色 (roles/pubsub.publisher) 授予 Cloud Storage 服务代理(Google 管理的服务账号):

    SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p PROJECT_ID)"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:${SERVICE_ACCOUNT}" \
        --role='roles/pubsub.publisher'
    
  18. 如果您在 2021 年 4 月 8 日或之前启用了 Cloud Pub/Sub 服务代理,以支持经过身份验证的 Pub/Sub 推送请求,请向 Google 管理的服务账号授予 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

创建 Cloud Storage 存储桶

创建一个 Cloud Storage 存储桶以用作事件来源:
gsutil mb -l us-central1 gs://PROJECT_ID-bucket/

创建事件来源后,您可以在 Cloud Run 上部署事件接收器服务。

将事件接收器服务部署到 Cloud Run

部署一个 Cloud Run 服务,以使用预构建的映像 us-docker.pkg.dev/cloudrun/container/hello 接收和记录事件:

gcloud run deploy helloworld-events \
    --image=us-docker.pkg.dev/cloudrun/container/hello \
    --allow-unauthenticated

部署成功后,命令行会显示服务网址。

现在,您已将名为 helloworld-events 的事件接收器服务部署到 Cloud Run,接下来便可以设置触发器了。

创建 Eventarc 触发器

Eventarc 触发器会将 Cloud Storage 存储桶中的事件发送到 helloworld-events Cloud Run 服务。

  1. 创建一个过滤 Cloud Storage 事件并且使用 Compute Engine 默认服务账号的触发器。

      gcloud eventarc triggers create storage-events-trigger \
          --destination-run-service=helloworld-events \
          --destination-run-region=us-central1 \
          --event-filters="type=google.cloud.storage.object.v1.finalized" \
          --event-filters="bucket=PROJECT_ID-bucket" \
          --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    这将创建一个名为 storage-events-trigger 的触发器。

    请注意,首次在 Google Cloud 项目中创建 Eventarc 触发器时,预配 Eventarc 服务代理可能会有延迟。通常,您可以尝试再次创建触发器,以解决此问题。如需了解详情,请参阅权限遭拒错误

  2. 如需确认 storage-events-trigger 已成功创建,请运行以下命令:

      gcloud eventarc triggers list --location=us-central1
    

    输出内容类似如下:

     NAME                    TYPE                                      DESTINATION_RUN_SERVICE  DESTINATION_RUN_PATH  ACTIVE
     storage-events-trigger  google.cloud.storage.object.v1.finalized  helloworld-events                              Yes
    

生成并查看事件

  1. 如需生成事件,请将一个文本文件上传到 Cloud Storage:

     echo "Hello World" > random.txt
     gsutil cp random.txt gs://PROJECT_ID-bucket/random.txt
    

    上传操作会生成事件,而 Cloud Run 服务会记录事件的消息。

  2. 如需查看日志条目,请过滤日志条目,并以 JSON 格式返回输出:

    gcloud logging read 'jsonPayload.message: "Received event of type google.cloud.storage.object.v1.finalized."'
    
  3. 查找如下日志条目:

    jsonPayload:
      event:
      ...
      eventType: google.cloud.storage.object.v1.finalized
      message: |
        Received event of type google.cloud.storage.object.v1.finalized. Event data: {
          "kind": "storage#object",
          "id": "PROJECT_ID-bucket/random.txt/1713970683868432",
          "selfLink": "https://www.googleapis.com/storage/v1/b/PROJECT_ID-bucket/o/random.txt",
          "name": "random.txt",
          "bucket": "PROJECT_ID-bucket",
          ...
        }
    

恭喜!您已成功将事件接收器服务部署到 Cloud Run,创建 Eventarc 触发器,在 Cloud Storage 中生成事件并在 Cloud Run 日志中查看该事件。

清理

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。

您可以:

  1. 删除 Cloud Storage 存储分区

  2. 删除 Cloud Run 服务

  3. 删除 Eventarc 触发器

或者,您也可以删除 Google Cloud 项目,以避免产生费用。删除 Google Cloud 项目后,系统会停止对该项目中使用的所有资源计费。

删除 Google Cloud 项目:

gcloud projects delete PROJECT_ID

如果您打算探索多个教程和快速入门,重复使用项目可以帮助您避免超出项目配额上限。

后续步骤