使用经过身份验证的 Cloud Run 服务接收 Pub/Sub 事件

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

本教程介绍如何使用经过身份验证的 Cloud Run 服务来部署容器化应用,该服务负责接收使用 Pub/Sub 的事件。Pub/Sub 是一种全托管式实时消息传递服务,可让您在独立的应用之间发送和接收消息。

目标

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

  1. 将事件接收器服务部署到 Cloud Run(需要使用经过身份验证的调用)。

  2. 创建一个用于将 Pub/Sub 主题连接到 Cloud Run 服务的 Eventarc 触发器。

  3. 向 Pub/Sub 主题发布消息以生成事件。

  4. 在 Cloud Run 日志中查看该事件。

费用

本教程使用 Google Cloud 的以下收费组件:

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

准备工作

    如果您的组织将限制应用于您的 Google Cloud 环境,则本文档中的某些步骤可能无法正常工作。在这种情况下,您可能无法完成创建公共 IP 地址或服务帐号密钥等任务。如果您发出的请求会返回有关限制条件的错误,请参阅如何在受限的 Google Cloud 环境中开发应用

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

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能

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

    转到“项目选择器”

  5. 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能

  6. 安装并初始化 Google Cloud CLI。
  7. 更新 gcloud 组件:
    gcloud components update
  8. 使用您的帐号登录:
    gcloud auth login
  9. 启用 API:
    gcloud services enable run.googleapis.com \
      eventarc.googleapis.com \
      pubsub.googleapis.com \
      cloudbuild.googleapis.com
  10. 设置本教程中使用的配置变量:
    export REGION=us-central1
    gcloud config set project PROJECT_ID
    gcloud config set run/region ${REGION}
    gcloud config set run/platform managed
    gcloud config set eventarc/location ${REGION}
    
    PROJECT_ID 替换为您的 Google Cloud 项目 ID。
  11. 为项目创建服务帐号。例如:
    gcloud iam service-accounts create sample-service-account \
      --description="A sample service account" \
      --display-name="Sample service account"
    创建服务帐号后,最多可能需要 7 分钟才能使用该服务帐号。如果您在创建服务帐号后立即尝试使用该服务帐号,并且收到错误消息,请至少等待 60 秒再重试。
  12. 运行以下命令,确认 sample-service-account 已创建:
    gcloud iam service-accounts list
    输出应类似如下所示:
    DISPLAY NAME                     EMAIL                                                               DISABLED
    Default compute service account  PROJECT_NUMBER-compute@developer.gserviceaccount.com                False
    Sample service account           sample-service-account@PROJECT_ID.iam.gserviceaccount.com           False
  13. run.invoker 角色授予服务帐号:
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:SERVICE_ACCOUNT_EMAIL" \
      --role="roles/run.invoker"

    替换以下内容:

    • PROJECT_ID:项目 ID。
    • SERVICE_ACCOUNT_EMAIL:上一步中返回的服务帐号电子邮件地址。
  14. eventarc.admin 角色授予用户帐号:
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="user:USER_EMAIL" \
      --role='roles/eventarc.admin'

    替换以下值:

    • PROJECT_ID:Google Cloud 项目 ID。
    • USER_EMAIL:用户的电子邮件地址。

      示例:user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.comdomain:example.domain.com

  15. iam.serviceAccountUser 角色授予用户帐号:
    gcloud iam service-accounts add-iam-policy-binding \
      SERVICE_ACCOUNT_ID@PROJECT_ID.iam.gserviceaccount.com \
      --member="user:USER_EMAIL" \
      --role="roles/iam.serviceAccountUser"

    替换以下值:

    • PROJECT_ID:Google Cloud 项目 ID。
    • SERVICE_ACCOUNT_ID:服务帐号 ID;例如 sample-service-account
    • USER_EMAIL:用户的电子邮件地址。

      示例:user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.comdomain:example.domain.com

将事件接收器部署到 Cloud Run

部署记录事件内容的 Cloud Run 服务。

  1. 克隆代码库:

    Node.js

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git

    或者,您也可以下载该示例的 zip 文件并将其解压缩。

    Python

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

    或者,您也可以下载该示例的 zip 文件并将其解压缩。

    Go

    git clone https://github.com/GoogleCloudPlatform/golang-samples.git

    或者,您也可以下载该示例的 zip 文件并将其解压缩。

    Java

    git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git

    或者,您也可以下载该示例的 zip 文件并将其解压缩。

    Ruby

    git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.git

    或者,您也可以下载该示例的 zip 文件并将其解压缩。

    C#

    git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git

    或者,您也可以下载该示例的 zip 文件并将其解压缩。

  2. 切换到包含 Cloud Run 示例代码的目录:

    Node.js

    cd nodejs-docs-samples/eventarc/pubsub/

    Python

    cd python-docs-samples/eventarc/pubsub/

    Go

    cd golang-samples/eventarc/pubsub/

    Java

    cd java-docs-samples/eventarc/pubsub/

    Ruby

    cd ruby-docs-samples/eventarc/pubsub/

    C#

    cd dotnet-docs-samples/eventarc/pubsub/
  3. 为 Cloud Run 服务构建容器:

    export PROJECT_ID=$(gcloud config get-value project)
    export SERVICE_NAME=trigger-pubsub
    gcloud builds submit --tag gcr.io/${PROJECT_ID}/${SERVICE_NAME}
    
  4. 将容器映像部署到 Cloud Run:

    gcloud run deploy ${SERVICE_NAME} \
      --image gcr.io/${PROJECT_ID}/${SERVICE_NAME} \
      --region=${REGION}
    
  5. 在出现是否允许未经身份验证的调用触发 pubsub (y/N)? 提示时,回复 n 表示“否”。

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

创建 Eventarc 触发器

当消息发布到 Pub/Sub 主题时,该事件会触发 Cloud Run 服务。该服务需要进行身份验证,并且事件必须由拥有包含必需 IAM 角色和权限的服务帐号的调用方触发,才能使用资源。

  1. 创建一个触发器来监听 Pub/Sub 消息:

    新建 Pub/Sub 主题

      gcloud eventarc triggers create ${SERVICE_NAME} \
        --destination-run-service=${SERVICE_NAME} \
        --destination-run-region=${REGION} \
        --location=${REGION} \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --service-account=SERVICE_ACCOUNT_USER_EMAIL
    

    SERVICE_ACCOUNT_EMAIL 替换为服务帐号的电子邮件地址。
    这会创建一个新的 Pub/Sub 主题和一个名为 trigger-pubsub 的触发器。

    现有 Pub/Sub 主题

      gcloud eventarc triggers create ${SERVICE_NAME} \
        --destination-run-service=${SERVICE_NAME} \
        --destination-run-region=${REGION} \
        --location=${REGION} \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --transport-topic=projects/PROJECT_ID/topics/TOPIC_ID \
        --service-account=SERVICE_ACCOUNT_EMAIL
    

    请替换以下内容:

    • PROJECT_ID 是您的 Google Cloud 项目 ID。
    • TOPIC_ID 是现有 Pub/Sub 主题的 ID。
    • SERVICE_ACCOUNT_EMAIL 是服务帐号的电子邮件地址。

      这将为现有 Pub/Sub 主题创建一个名为 trigger-pubsub 的触发器。

  2. 确认触发器已成功创建:

      gcloud eventarc triggers list --location=us-central1
    

    返回的触发器状态应为 ACTIVE: Yes

生成并查看事件

向 Pub/Sub 主题发布消息以生成事件并触发 Cloud Run 服务。Cloud Run 服务会记录服务日志中的消息。

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

    export TOPIC_ID=$(basename $(gcloud eventarc triggers describe ${SERVICE_NAME} \
      --format='value(transport.pubsub.topic)'))
    
  2. 向 Pub/Sub 主题发送消息以生成事件:

    gcloud pubsub topics publish $TOPIC_ID --message "Hello there"
    

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

  3. 如需查看服务创建的与事件相关的日志条目,请运行以下命令:

    gcloud logging read 'textPayload: "Hello there!"'

    该日志条目应如下所示:

    textPayload: 'Hello, Hello there!'

您可能需要等待一些时间才能看到日志。如果您没有立即看到日志,请稍等片刻,然后再检查一次。

清理

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

删除项目

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

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

  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 替换为您的触发器的名称。

    • 从 Container Registry 中删除名为 gcr.io/PROJECT_ID/trigger-pubsub容器映像

后续步骤