跨 Google Cloud 项目路由事件


本教程介绍如何使用 Eventarc 从一个 Google Cloud 项目中的来源读取事件,并将其路由到另一个 Google Cloud 项目中的目标目标位置。可以通过将 Pub/Sub 用作跨项目传输层来实现。

目标

在此教程中,您将学习以下操作:

  1. 在一个项目中创建一个主题,然后从另一个项目发布到该主题。这会使用 Eventarc 触发器将事件路由到未经身份验证的 Cloud Run 服务。

  2. 使用适用于 Cloud Storage 的 Pub/Sub 通知将 Cloud Storage 事件从一个项目发布到另一个项目。使用 Eventarc 触发器将事件路由到未经身份验证的 Cloud Run 服务。

  3. 使用 Cloud Logging 接收器将 Cloud Audit Logs 从一个项目发布到另一个项目。使用 Eventarc 触发器将事件路由到未经身份验证的 Cloud Run 服务。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

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

请注意,本教程将需要两个项目。以下步骤适用于这两个项目。

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

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

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

    gcloud init
  6. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

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

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

    gcloud init
  10. 更新 gcloud 组件:
    gcloud components update
  11. 使用您的账号登录:
    gcloud auth login

跨项目路由 Pub/Sub 事件

由于 Pub/Sub 是全球分布式服务,因此您可以在一个项目中创建主题,从另一个项目发布到该主题,然后触发 Eventarc 以将消息路由到 Cloud Run 服务:

跨项目路由事件:Cloud Pub/Sub 和 Eventarc

  1. 将 Google Cloud 项目 ID 设置为第二个项目:

    gcloud config set project PROJECT_TWO_ID
    

    PROJECT_TWO_ID 替换为您的第二个 Google Cloud 项目的 ID。

  2. 在第二个项目中,执行以下操作:

    1. 启用 Cloud Run 和 Eventarc API:

      gcloud services enable run.googleapis.com eventarc.googleapis.com
      
    2. 设置默认位置:

      REGION=REGION
      

      REGION 替换为您选择的受支持的 Eventarc 位置。例如 us-central1

    3. 创建 Pub/Sub 主题:

      TOPIC=my-topic
      gcloud pubsub topics create $TOPIC
      
    4. 部署未经身份验证的 Cloud Run 服务:

      gcloud run deploy hello \
          --image=gcr.io/cloudrun/hello \
          --allow-unauthenticated \
          --region=$REGION
      

      当您看到服务网址时,表示部署完成。

    5. 使用 Eventarc 触发器将主题连接到该服务:

      gcloud eventarc triggers create cross-project-trigger \
          --destination-run-service=hello \
          --destination-run-region=${REGION} \
          --location=${REGION} \
          --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
          --transport-topic=projects/PROJECT_TWO_ID/topics/$TOPIC
      

      这将创建一个名为 cross-project-trigger 的触发器。

  3. 将 Google Cloud 项目 ID 设置为第一个项目:

    gcloud config set project PROJECT_ONE_ID
    

    PROJECT_ONE_ID 替换为您的第一个 Google Cloud 项目的 ID。

  4. 在第一个项目中,向第二个项目中的主题发布消息:

    gcloud pubsub topics publish projects/PROJECT_TWO_ID/topics/$TOPIC --message="hello"
    
  5. 将 Google Cloud 项目 ID 设置为第二个项目:

    gcloud config set project PROJECT_TWO_ID
    
  6. 在第二个项目中,确认生成的事件已记录:

    gcloud logging read "resource.labels.service_name=hello AND jsonPayload.message:hello" --format=json
    

    系统会返回如下所示的日志条目:

    "message": "Received event of type google.cloud.pubsub.topic.v1.messagePublished. Event data: hello"
    

跨项目路由 Cloud Storage 事件

使用适用于 Cloud Storage 的 Pub/Sub 通知将事件从一个项目发布到另一个项目,然后通过 Eventarc 触发器将事件路由到 Cloud Run 服务:

跨项目路由事件:Cloud Storage 和 Eventarc

  1. 将 Google Cloud 项目 ID 设置为第一个项目:

    gcloud config set project PROJECT_ONE_ID
    
  2. 创建 Cloud Storage 存储分区,请运行以下命令:

    PROJECT1=$(gcloud config get-value project)
    BUCKET=$PROJECT1-cross-project
    gsutil mb -l $REGION gs://$BUCKET
    
  3. 针对第二个项目中的主题为该存储桶创建 Pub/Sub 通知:

    gsutil notification create -t projects/PROJECT_TWO_ID/topics/$TOPIC -f json gs://$BUCKET
    
  4. 将文件上传到该存储桶:

    echo "Hello World" > random.txt
    gsutil cp random.txt gs://$BUCKET/random.txt
    
  5. 将 Google Cloud 项目 ID 设置为第二个项目:

    gcloud config set project PROJECT_TWO_ID
    
  6. 在第二个项目中,确认生成的事件已记录:

    gcloud logging read "resource.labels.service_name=hello AND jsonPayload.message:random.txt" --format=json
    

    系统会返回如下所示的日志条目:

    Received event of type google.cloud.pubsub.topic.v1.messagePublished. Event data: {
      "kind": "storage#object",
      "id": "project1-cross-project/random.txt/1635327604259719",
      "selfLink": "https://www.googleapis.com/storage/v1/b/project1-cross-project/o/random.txt",
      "name": "random.txt",
      "bucket": "project1-cross-project",
      "generation": "1635327604259719",
    [...]
    }
    

跨项目路由 Cloud Audit Logs 事件

当创建与触发器的过滤条件匹配的审核日志条目时,可能会触发对您的服务的请求。如需了解详情,请参阅确定 Cloud Audit Logs 的事件过滤条件。在这种情况下,在第一个项目中创建 Compute Engine 虚拟机实例时,与触发器的过滤条件匹配的审核日志条目可让您捕获事件并将其路由到第二个项目中的 Cloud Run 服务:

跨项目路由事件:Cloud Audit Logs 和 Eventarc

  1. 将 Google Cloud 项目 ID 设置为第一个项目:

    gcloud config set project PROJECT_ONE_ID
    
  2. 在第一个项目中,为 Compute Engine 启用管理员读取数据读取数据写入日志类型:

    请注意,在项目级层,您需要 roles/owner Identity and Access Management (IAM) 角色才能为 Google Cloud 资源配置数据访问审核日志。

    1. 读取您项目的 IAM 政策,并将其存储在一个文件中:

      gcloud projects get-iam-policy PROJECT_ONE_ID > /tmp/policy.yaml
      
    2. 修改 /tmp/policy.yaml,仅添加或更改数据访问审核日志配置。

      auditConfigs:
      - auditLogConfigs:
        - logType: ADMIN_READ
        - logType: DATA_READ
        - logType: DATA_WRITE
        service: compute.googleapis.com
      
    3. 写入新的 IAM 政策:

      gcloud projects set-iam-policy PROJECT_ONE_ID /tmp/policy.yaml
      

      如果上述命令报告与其他更改发生冲突,请重复以上步骤(从读取项目的 IAM 政策开始)。

  3. 在第一个项目中,创建一个 Cloud Logging 接收器以将 Cloud Audit Logs 路由到第二个项目中的主题:

    gcloud logging sinks create cross-project-sink \
        pubsub.googleapis.com/projects/PROJECT_TWO_ID/topics/my-topic \
        --log-filter='protoPayload.methodName="beta.compute.instances.insert"'
    

    系统应会返回如下所示的提醒:

    Please remember to grant `serviceAccount:p1011272509317-375795@gcp-sa-logging.iam.gserviceaccount.com` the Pub/Sub Publisher role on the topic.
    
  4. 将 Google Cloud 项目 ID 设置为第二个项目:

    gcloud config set project PROJECT_TWO_ID
    
  5. 在第二个项目中,将角色授予服务账号:

    gcloud pubsub topics add-iam-policy-binding my-topic \
        --member=SERVICE_ACCOUNT \
        --role=roles/pubsub.publisher
    

    SERVICE_ACCOUNT 替换为上一步中返回的服务账号电子邮件地址。

  6. 将 Google Cloud 项目 ID 设置为第一个项目:

    gcloud config set project PROJECT_ONE_ID
    
  7. 在第一个项目中,创建 Compute Engine 虚拟机实例

    如果您使用 Google Cloud Console 创建虚拟机实例,则可以接受默认值,供本教程使用。

  8. 将 Google Cloud 项目 ID 设置为第二个项目:

    gcloud config set project PROJECT_TWO_ID
    
  9. 在第二个项目中,确认生成的事件已记录:

    gcloud logging read "resource.labels.service_name=hello AND jsonPayload.message:beta.compute.instances.insert" --format=json
    

    系统会返回如下所示的日志条目:

    Received event of type google.cloud.pubsub.topic.v1.messagePublished. Eventdata: {
      "logName": "projects/workflows-atamel/logs/cloudaudit.googleapis.com%2Factivity",
      "operation": {
        "id": "operation-1635330842489-5cf5321f4f454-ecc363cd-3883c08d",
        "last": true,
        "producer": "compute.googleapis.com"
      },
      "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "methodName": "beta.compute.instances.insert",
      }
    [...]
    }
    

清理

如果您为本教程创建了一个新项目,请删除项目。 如果您使用的是现有项目,希望保留此项目且不保留本教程中添加的任何更改,请删除为教程创建的资源

删除项目

为了避免产生费用,最简单的方法是删除您为本教程创建的项目。

要删除项目,请执行以下操作:

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除教程资源

  1. 删除您在本教程中部署的 Cloud Run 服务:

    gcloud run services delete SERVICE_NAME

    其中,SERVICE_NAME 是您选择的服务名称。

    您还可以从 Google Cloud Console 中删除 Cloud Run 服务。

  2. 移除您在教程设置过程中添加的任何 gcloud CLI 默认配置。

    例如:

    gcloud config unset run/region

    gcloud config unset project

  3. 删除在本教程中创建的其他 Google Cloud 资源:

    • 删除 Eventarc 触发器:

      gcloud eventarc triggers delete TRIGGER_NAME
      
      TRIGGER_NAME 替换为您的触发器的名称。

    • 删除 Pub/Sub 主题:

      gcloud pubsub topics delete TOPIC TOPIC_ID
      
      TOPIC_ID 替换为您的主题的 ID。

    • 删除 Cloud Logging 接收器。

      gcloud logging sinks delete SINK_NAME
      
      SINK_NAME 替换为您的接收器的名称。

后续步骤