使用 Pub/Sub 消息接收事件 (Terraform)

本快速入门介绍如何使用 Terraform 创建一个 Eventarc 触发器,该触发器可接收来自 Pub/Sub 的直接事件并将这些事件路由到 Cloud Run 服务。如需详细了解如何使用 Terraform 创建 Eventarc 触发器,请参阅使用 Terraform 创建触发器

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

  1. 准备部署 Terraform。

  2. 定义一个执行以下操作的 Terraform 配置:

    1. 启用 API。
    2. 创建服务账号。
    3. 创建 Pub/Sub 主题作为事件提供方。
    4. 将服务部署到 Cloud Run 作为事件目标。
    5. 创建 Eventarc 触发器。
  3. 应用 Terraform 配置。

这样一来,您就可以通过向 Pub/Sub 主题发布消息来生成事件。Eventarc 触发器会将消息路由到部署在 Cloud Run 上的事件接收器服务,该服务会记录事件消息,从而为您提供一个简单的事件驱动型架构示例。

准备工作

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

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

  3. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

  4. 如需初始化 gcloud CLI,请运行以下命令:

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

    选择或创建项目所需的角色

    • 选择项目:选择项目不需要特定的 IAM 角色,您可以选择已获授角色的任何项目。
    • 创建项目:如需创建项目,您需要拥有 Project Creator 角色 (roles/resourcemanager.projectCreator),该角色包含 resourcemanager.projects.create 权限。了解如何授予角色
    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

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

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

      gcloud config set project PROJECT_ID

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

  6. 验证是否已为您的 Google Cloud 项目启用结算功能

  7. 启用 Cloud Resource Manager 和 Identity and Access Management (IAM) API:

    启用 API 所需的角色

    如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (roles/serviceusage.serviceUsageAdmin),该角色包含 serviceusage.services.enable 权限。了解如何授予角色

    gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com
  8. 如果您使用的是本地 shell,请为您的用户账号创建本地身份验证凭证:

    gcloud auth application-default login

    如果您使用的是 Cloud Shell,则无需执行此操作。

    如果系统返回身份验证错误,并且您使用的是外部身份提供方 (IdP),请确认您已 使用联合身份登录 gcloud CLI

  9. 安装 Google Cloud CLI。

  10. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

  11. 如需初始化 gcloud CLI,请运行以下命令:

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

    选择或创建项目所需的角色

    • 选择项目:选择项目不需要特定的 IAM 角色,您可以选择已获授角色的任何项目。
    • 创建项目:如需创建项目,您需要拥有 Project Creator 角色 (roles/resourcemanager.projectCreator),该角色包含 resourcemanager.projects.create 权限。了解如何授予角色
    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

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

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

      gcloud config set project PROJECT_ID

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

  13. 验证是否已为您的 Google Cloud 项目启用结算功能

  14. 启用 Cloud Resource Manager 和 Identity and Access Management (IAM) API:

    启用 API 所需的角色

    如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (roles/serviceusage.serviceUsageAdmin),该角色包含 serviceusage.services.enable 权限。了解如何授予角色

    gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com
  15. 如果您使用的是本地 shell,请为您的用户账号创建本地身份验证凭证:

    gcloud auth application-default login

    如果您使用的是 Cloud Shell,则无需执行此操作。

    如果系统返回身份验证错误,并且您使用的是外部身份提供方 (IdP),请确认您已 使用联合身份登录 gcloud CLI

  16. 如果您要使用现有项目来完成本指南,请验证您是否拥有完成本指南所需的权限。如果您创建了新项目,则您已拥有所需的权限。

    所需权限

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

    如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

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

准备部署 Terraform

在部署任何 Terraform 资源之前,您必须先创建 Terraform 配置文件。借助 Terraform 配置文件,您可以使用 Terraform 语法为基础设施定义自己偏好的最终状态。

  1. 如果您使用的是本地 shell,请安装 Terraform

    Terraform 已集成到 Cloud Shell 环境中,您可以使用 Cloud Shell 部署 Terraform 资源,而无需安装 Terraform。

  2. 在 Cloud Shell 或本地 shell 中,设置要应用 Terraform 配置的默认 Google Cloud 项目。您只需为每个项目运行一次以下命令,即可在任何目录中运行它:

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    PROJECT_ID 替换为您的 Google Cloud 项目的 ID。

    请注意,如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

  3. 每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。创建一个目录,并在该目录中创建一个新文件:

    mkdir DIRECTORY && cd DIRECTORY && touch main.tf

    DIRECTORY 替换为您的 Terraform 目录的名称。

    文件名必须具有 .tf 扩展名,例如,在本快速入门中,配置文件为 main.tf

定义 Terraform 配置

将以下 Terraform 代码段复制到您的 main.tf 文件中。或者,如需从 GitHub 复制整个代码示例,请在代码段的右上角依次点击 > 在 GitHub 上查看

启用 API

如需启用应用 Terraform 配置所需的 API,请使用 google_project_service Terraform 资源:

# Enable Cloud Run API
resource "google_project_service" "run" {
  service            = "run.googleapis.com"
  disable_on_destroy = false
}

# Enable Eventarc API
resource "google_project_service" "eventarc" {
  service            = "eventarc.googleapis.com"
  disable_on_destroy = false
}

# Enable Pub/Sub API
resource "google_project_service" "pubsub" {
  service            = "pubsub.googleapis.com"
  disable_on_destroy = false
}

创建服务账号

每个 Eventarc 触发器都与一个 IAM 服务账号相关联。如需创建专用服务账号以用于测试,请使用 google_service_account Terraform 资源:

# Create a dedicated service account
resource "google_service_account" "eventarc" {
  account_id   = "eventarc-trigger-sa"
  display_name = "Eventarc trigger service account"
}

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

resource "google_project_iam_member" "tokencreator" {
  project  = data.google_project.project.id
  role     = "roles/iam.serviceAccountTokenCreator"
  member   = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-pubsub.iam.gserviceaccount.com"
}

创建 Pub/Sub 主题作为事件提供方

如需创建 Pub/Sub 主题,请使用 google_pubsub_topic Terraform 资源。如需在主题级层向服务账号授予 Pub/Sub 发布者角色 (roles/pubsub.publisher),请使用 google_pubsub_topic_iam_member Terraform 资源:

# Create a Pub/Sub topic
resource "google_pubsub_topic" "default" {
  name = "pubsub_topic"
}

# Grant permission to publish messages to a Pub/Sub topic
resource "google_pubsub_topic_iam_member" "pubsubpublisher" {
  project    = google_pubsub_topic.default.project
  topic      = google_pubsub_topic.default.name
  member     = "serviceAccount:${google_service_account.eventarc.email}"
  role       = "roles/pubsub.publisher"
  depends_on = [google_pubsub_topic.default]
}

将事件接收器部署到 Cloud Run

如需创建 Cloud Run 服务作为事件目标,请使用 google_cloud_run_v2_service Terraform 资源。如需在服务级别向服务账号授予 Cloud Run Invoker 角色 (roles/run.invoker),请使用 google_cloud_run_v2_service_iam_member Terraform 资源:

# Deploy a Cloud Run service
resource "google_cloud_run_v2_service" "default" {
  name     = "hello-events"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      # This sample container listens to HTTP requests and logs received events
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    service_account = google_service_account.eventarc.email
  }

  depends_on = [google_project_service.run]
}

# Grant permission to invoke Cloud Run services
resource "google_cloud_run_v2_service_iam_member" "runinvoker" {
  project    = google_cloud_run_v2_service.default.project
  location   = google_cloud_run_v2_service.default.location
  name       = google_cloud_run_v2_service.default.name
  role       = "roles/run.invoker"
  member     = "serviceAccount:${google_service_account.eventarc.email}"
  depends_on = [google_cloud_run_v2_service.default]
}

创建 Eventarc 触发器

如需创建 Eventarc 触发器来监听 Pub/Sub 消息,请使用 google_eventarc_trigger Terraform 资源:

# Create an Eventarc trigger, routing Pub/Sub events to Cloud Run
resource "google_eventarc_trigger" "default" {
  name     = "trigger-pubsub-cloudrun-tf"
  location = google_cloud_run_v2_service.default.location

  # Capture messages published to a Pub/Sub topic
  matching_criteria {
    attribute = "type"
    value     = "google.cloud.pubsub.topic.v1.messagePublished"
  }

  # Send events to Cloud Run
  destination {
    cloud_run_service {
      service = google_cloud_run_v2_service.default.name
      region  = google_cloud_run_v2_service.default.location
    }
  }

  transport {
    pubsub {
      topic = google_pubsub_topic.default.id
    }
  }

  service_account = google_service_account.eventarc.email
  depends_on = [
    google_project_service.eventarc,
    google_pubsub_topic_iam_member.pubsubpublisher
  ]
}

应用 Terraform 配置

使用 Terraform CLI 基于配置文件预配基础设施。如需了解详情,请参阅基本 Terraform 命令

  1. 初始化 Terraform。您只需为每个目录执行一次此操作。

    terraform init

    (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade 选项:

    terraform init -upgrade
  2. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:

    terraform plan

    根据需要更正配置。

  3. 通过运行以下命令并在提示符处输入 yes 来应用 Terraform 配置:

    terraform apply

    通常,您会一次性应用整个配置。不过,您也可以指定特定资源。例如:

    terraform apply -target="google_eventarc_trigger.default"

    启用 API 后,可能需要等待几分钟,让操作传播完毕,然后才能部署任何其他资源。如果您遇到问题,请尝试再次应用 Terraform 配置。

    等待 Terraform 显示“应用完成!”消息。

验证资源的创建

  1. 确认 Cloud Run 服务已创建:

    gcloud run services list --region us-central1
    

    输出应类似如下所示:

    SERVICE: hello-events
    REGION: us-central1
    URL: https://hello-events-13335919645.us-central1.run.app
    LAST DEPLOYED BY: ...
    LAST DEPLOYED AT: 2024-12-16T15:00:52.606160Z
    
  2. 确认 Eventarc 触发器已创建:

    gcloud eventarc triggers list --location us-central1
    

    输出应类似如下所示:

    NAME: trigger-pubsub-cloudrun-tf
    TYPE: google.cloud.pubsub.topic.v1.messagePublished
    DESTINATION: Cloud Run service: hello-events
    ACTIVE: Yes
    LOCATION: us-central1
    

生成并查看 Pub/Sub 主题事件

您可以通过向 Pub/Sub 主题发布消息来生成事件。Eventarc 触发器会将消息路由到部署在 Cloud Run 上的事件接收器服务,而该服务会记录事件消息。

  1. 查找 Pub/Sub 主题并将其设置为环境变量:

    gcloud config set eventarc/location us-central1
    export RUN_TOPIC=$(gcloud eventarc triggers describe trigger-pubsub-cloudrun-tf \
        --format='value(transport.pubsub.topic)')
    
  2. 如需生成事件,请向 Pub/Sub 主题发布消息:

    gcloud pubsub topics publish $RUN_TOPIC --message "Hello World!"
    

    事件会被路由到 Cloud Run 服务,该服务会记录事件消息。

  3. 过滤服务创建的日志条目:

    gcloud logging read 'jsonPayload.message: "Received event of type google.cloud.pubsub.topic.v1.messagePublished"'
    
  4. 查找如下日志条目:

    jsonPayload:
    ...
    message: 'Received event of type google.cloud.pubsub.topic.v1.messagePublished.
        Event data: Hello World!'
    

您已成功使用 Terraform 将事件接收器服务部署到 Cloud Run 并创建 Eventarc 触发器。在 Pub/Sub 中生成事件后,您可以在 Cloud Run 日志中查看该事件。

清理

完成此快速入门中描述的任务后,您可以通过删除所创建的资源来避免继续计费。

通过运行以下命令并在提示符处输入 yes,移除之前使用 Terraform 配置应用的资源:

terraform destroy

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

删除 Google Cloud 项目:

gcloud projects delete PROJECT_ID

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

后续步骤