使用 Pub/Sub 消息接收事件 (Terraform)
本快速入门介绍如何使用 Terraform 创建一个 Eventarc 触发器,该触发器可接收来自 Pub/Sub 的直接事件并将这些事件路由到 Cloud Run 服务。如需详细了解如何使用 Terraform 创建 Eventarc 触发器,请参阅使用 Terraform 创建触发器。
在本快速入门中,您将执行以下操作:
准备部署 Terraform。
定义一个执行以下操作的 Terraform 配置:
- 启用 API。
- 创建服务账号。
- 创建 Pub/Sub 主题作为事件提供方。
- 将服务部署到 Cloud Run 作为事件目标。
- 创建 Eventarc 触发器。
应用 Terraform 配置。
这样一来,您就可以通过向 Pub/Sub 主题发布消息来生成事件。Eventarc 触发器会将消息路由到部署在 Cloud Run 上的事件接收器服务,该服务会记录事件消息,从而为您提供一个简单的事件驱动型架构示例。
准备工作
您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用。
- 登录您的 Google Cloud 账号。如果您是 Google Cloud新手,请 创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
安装 Google Cloud CLI。
-
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init -
选择或创建项目所需的角色
- 选择项目:选择项目不需要特定的 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 项目名称。
启用 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 -
如果您使用的是本地 shell,请为您的用户账号创建本地身份验证凭证:
gcloud auth application-default login
如果您使用的是 Cloud Shell,则无需执行此操作。
如果系统返回身份验证错误,并且您使用的是外部身份提供方 (IdP),请确认您已 使用联合身份登录 gcloud CLI。
-
安装 Google Cloud CLI。
-
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init -
选择或创建项目所需的角色
- 选择项目:选择项目不需要特定的 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 项目名称。
启用 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 -
如果您使用的是本地 shell,请为您的用户账号创建本地身份验证凭证:
gcloud auth application-default login
如果您使用的是 Cloud Shell,则无需执行此操作。
如果系统返回身份验证错误,并且您使用的是外部身份提供方 (IdP),请确认您已 使用联合身份登录 gcloud CLI。
- 如果您要使用现有项目来完成本指南,请验证您是否拥有完成本指南所需的权限。如果您创建了新项目,则您已拥有所需的权限。
所需权限
如需获得完成本快速入门所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
- Cloud Run Admin (
roles/run.admin) - Eventarc Admin (
roles/eventarc.admin) - Logs View Accessor (
roles/logging.viewAccessor) - Project IAM Admin (
roles/resourcemanager.projectIamAdmin) - Pub/Sub Publisher (
roles/pubsub.publisher) - Service Account Admin (
roles/iam.serviceAccountAdmin) - Service Account User (
roles/iam.serviceAccountUser)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
- Cloud Run Admin (
准备部署 Terraform
在部署任何 Terraform 资源之前,您必须先创建 Terraform 配置文件。借助 Terraform 配置文件,您可以使用 Terraform 语法为基础设施定义自己偏好的最终状态。
如果您使用的是本地 shell,请安装 Terraform。
Terraform 已集成到 Cloud Shell 环境中,您可以使用 Cloud Shell 部署 Terraform 资源,而无需安装 Terraform。
在 Cloud Shell 或本地 shell 中,设置要应用 Terraform 配置的默认 Google Cloud 项目。您只需为每个项目运行一次以下命令,即可在任何目录中运行它:
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
将
PROJECT_ID替换为您的 Google Cloud 项目的 ID。请注意,如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。
每个 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 资源:
创建服务账号
每个 Eventarc 触发器都与一个 IAM 服务账号相关联。如需创建专用服务账号以用于测试,请使用 google_service_account Terraform 资源:
如果您在 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 资源:
将事件接收器部署到 Cloud Run
如需创建 Cloud Run 服务作为事件目标,请使用 google_cloud_run_v2_service Terraform 资源。如需在服务级别向服务账号授予 Cloud Run Invoker 角色 (roles/run.invoker),请使用 google_cloud_run_v2_service_iam_member Terraform 资源:
创建 Eventarc 触发器
如需创建 Eventarc 触发器来监听 Pub/Sub 消息,请使用 google_eventarc_trigger Terraform 资源:
应用 Terraform 配置
使用 Terraform CLI 基于配置文件预配基础设施。如需了解详情,请参阅基本 Terraform 命令。
初始化 Terraform。您只需为每个目录执行一次此操作。
terraform init
(可选)如需使用最新的 Google 提供程序版本,请添加
-upgrade选项:terraform init -upgrade
查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
terraform plan
根据需要更正配置。
通过运行以下命令并在提示符处输入
yes来应用 Terraform 配置:terraform apply
通常,您会一次性应用整个配置。不过,您也可以指定特定资源。例如:
terraform apply -target="google_eventarc_trigger.default"
启用 API 后,可能需要等待几分钟,让操作传播完毕,然后才能部署任何其他资源。如果您遇到问题,请尝试再次应用 Terraform 配置。
等待 Terraform 显示“应用完成!”消息。
验证资源的创建
确认 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确认 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 上的事件接收器服务,而该服务会记录事件消息。
查找 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)')如需生成事件,请向 Pub/Sub 主题发布消息:
gcloud pubsub topics publish $RUN_TOPIC --message "Hello World!"事件会被路由到 Cloud Run 服务,该服务会记录事件消息。
过滤服务创建的日志条目:
gcloud logging read 'jsonPayload.message: "Received event of type google.cloud.pubsub.topic.v1.messagePublished"'
查找如下日志条目:
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
如果您打算探索多个教程和快速入门,重复使用项目可以帮助您避免超出项目配额上限。