本教程介绍如何通过 Pub/Sub 推送订阅编写、部署和调用 Cloud Run 服务。
设置 gcloud 默认值
要配置您的 Cloud Run 服务的 gcloud 默认值,请执行以下操作:
- 设置默认项目: - gcloud config set project PROJECT_ID - 将 PROJECT_ID 替换为您在本教程中创建的项目的名称。 
- 为您选择的区域配置 gcloud: - gcloud config set run/region REGION - 将 REGION 替换为您选择的受支持的 Cloud Run 区域。 
Cloud Run 位置
Cloud Run 是区域级的,这意味着运行 Cloud Run 服务的基础架构位于特定区域,并且由 Google 代管,以便在该区域内的所有可用区以冗余方式提供。
选择用于运行 Cloud Run 服务的区域时,主要考虑该区域能否满足您的延迟时间、可用性或耐用性要求。通常,您可以选择距离用户最近的区域,但除此之外,您还应该考虑 Cloud Run 服务使用的其他 Google Cloud产品的位置。跨多个位置使用 Google Cloud 产品可能会影响服务的延迟时间和费用。
Cloud Run 可在以下区域使用:
基于层级 1 价格
- asia-east1(台湾)
- asia-northeast1(东京)
- asia-northeast2(大阪)
- asia-south1(印度孟买)
- europe-north1(芬兰)- 二氧化碳排放量低 
- europe-north2(斯德哥尔摩)- 二氧化碳排放量低 
- europe-southwest1(马德里)- 二氧化碳排放量低 
- europe-west1(比利时)- 二氧化碳排放量低 
- europe-west4(荷兰)- 二氧化碳排放量低 
- europe-west8(米兰)
- europe-west9(巴黎)- 二氧化碳排放量低 
- me-west1(特拉维夫)
- northamerica-south1(墨西哥)
- us-central1(爱荷华)- 二氧化碳排放量低 
- us-east1(南卡罗来纳)
- us-east4(北弗吉尼亚)
- us-east5(哥伦布)
- us-south1(达拉斯)- 二氧化碳排放量低 
- us-west1(俄勒冈)- 二氧化碳排放量低 
基于层级 2 价格
- africa-south1(约翰内斯堡)
- asia-east2(香港)
- asia-northeast3(韩国首尔)
- asia-southeast1(新加坡)
- asia-southeast2(雅加达)
- asia-south2(印度德里)
- australia-southeast1(悉尼)
- australia-southeast2(墨尔本)
- europe-central2(波兰,华沙)
- europe-west10(柏林)
- europe-west12(都灵)
- europe-west2(英国伦敦)- 二氧化碳排放量低 
- europe-west3(德国法兰克福)
- europe-west6(瑞士苏黎世)- 二氧化碳排放量低 
- me-central1(多哈)
- me-central2(达曼)
- northamerica-northeast1(蒙特利尔)- 二氧化碳排放量低 
- northamerica-northeast2(多伦多)- 二氧化碳排放量低 
- southamerica-east1(巴西圣保罗)- 二氧化碳排放量低 
- southamerica-west1(智利圣地亚哥)- 二氧化碳排放量低 
- us-west2(洛杉矶)
- us-west3(盐湖城)
- us-west4(拉斯维加斯)
如果您已创建 Cloud Run 服务,可在Google Cloud 控制台的 Cloud Run 信息中心内查看区域。
创建 Artifact Registry 标准制品库
创建 Artifact Registry 标准制品库以存储您的容器映像:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=REGION
您需要进行如下替换:
- 将 REPOSITORY 替换为制品库的唯一名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
创建 Pub/Sub 主题
示例服务由发布到 Pub/Sub 主题的消息触发,因此您需要在 Pub/Sub 中创建主题。
gcloud
如需创建新的 Pub/Sub 主题,请使用以下命令:
gcloud pubsub topics create myRunTopic
您可以使用 myRunTopic 或将其替换为 Google Cloud 项目中唯一的主题名称。
Terraform
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
要创建 Pub/Sub 主题,请将以下内容添加到现有的 main.tf 文件中:
您可以使用 Cloud 项目中唯一的主题名称。
检索代码示例
如需检索可用的代码示例,请执行以下操作:
- 将示例应用代码库克隆到本地机器: - 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 文件并将其解压缩。 - C#- git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git - 或者,您也可以下载该示例的 zip 文件并将其解压缩。 
- 切换到包含 Cloud Run 示例代码的目录: - Node.js- cd nodejs-docs-samples/run/pubsub/ - Python- cd python-docs-samples/run/pubsub/ - Go- cd golang-samples/run/pubsub/ - Java- cd java-docs-samples/run/pubsub/ - C#- cd dotnet-docs-samples/run/Run.Samples.Pubsub.MinimalApi/ 
查看代码
本教程中使用的代码包含以下部分:
- 处理传入请求的服务器。 - Node.js- 为了便于测试 Node.js 服务,服务器配置与服务器启动是相互独立的。 - Node.js Web 服务器在 - app.js中设置。- 网络服务器在 - index.js中启动:- Python- Go- Java- C#
- 用于处理 Pub/Sub 消息并记录问候语的处理程序。 - Node.js- Python- Go- Java- C#- 您必须对该服务进行编码,使其返回准确的 HTTP 响应代码。如果返回成功代码(例如 HTTP - 200或- 204),则指示 Pub/Sub 消息处理已完成。如果返回错误代码(如 HTTP- 400或- 500),则指示将重试该消息(请参阅“通过推送方式接收消息”指南。
- 用于定义服务的操作环境的 - Dockerfile。- Dockerfile的内容因语言而异。- Node.js- Python- Go- Java- 此示例使用 Jib 利用常见 Java 工具构建 Docker 映像。无需编写 Dockerfile 或安装 Docker,Jib 便可以优化容器构建。详细了解如何使用 Jib 构建 Java 容器。 - C#
如需详细了解如何对 Pub/Sub 请求的来源进行身份验证,请参阅与 Pub/Sub 集成。
交付代码
交付代码包括三个步骤:使用 Cloud Build 构建容器映像、将容器映像上传到 Artifact Registry,以及将容器映像部署到 Cloud Run。
如需交付代码,请执行以下操作:
- 
      构建容器并将其发布到 Artifact Registry 上: Node.jsgcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub - 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
 pubsub是映像名称。成功完成后,您应该会看到一条包含 ID、创建时间和映像名称的 SUCCESS 消息。该映像存储在 Artifact Registry 中,并可根据需要重复使用。 Pythongcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub - 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
 pubsub是映像名称。成功完成后,您应该会看到一条包含 ID、创建时间和映像名称的 SUCCESS 消息。该映像存储在 Artifact Registry 中,并可根据需要重复使用。 Gogcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub - 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
 pubsub是映像名称。成功完成后,您应该会看到一条包含 ID、创建时间和映像名称的 SUCCESS 消息。该映像存储在 Artifact Registry 中,并可根据需要重复使用。 Java- 
               使用 gcloud CLI 凭据帮助程序,授权 Docker 推送到您的 Artifact Registry。
               gcloud auth configure-docker 
- 
               使用 Jib Maven 插件来构建容器并将其推送到 Artifact Registry。
               mvn compile jib:build -D image=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub - 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
 pubsub是映像名称。成功后,您会看到一条 BUILD SUCCESS 消息。该映像存储在 Artifact Registry 中,并可根据需要重复使用。 
 C#gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub - 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
 pubsub是映像名称。成功完成后,您应该会看到一条包含 ID、创建时间和映像名称的 SUCCESS 消息。该映像存储在 Artifact Registry 中,并可根据需要重复使用。 
- 
      部署应用: 命令行- 
                  运行以下命令来部署您的应用: gcloud run deploy pubsub-tutorial --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub --no-allow-unauthenticated - 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
 pubsub是映像名称,pubsub-tutorial是服务名称。请注意,容器映像会部署到您之前在设置 gcloud 下配置的服务和区域--no-allow-unauthenticated标志限制对服务未经身份验证的访问。通过将该服务保留为不公开状态,您可以依赖 Cloud Run 的自动 Pub/Sub 集成功能对请求进行身份验证。如需详细了解如何进行此项配置,请参阅与 Pub/Sub 集成。如需详细了解基于 Identity and Access Management (IAM) 的身份验证,请参阅使用 IAM 管理访问权限。等待部署完成,这可能需要半分钟左右的时间。 成功完成时,命令行会显示服务网址。此网址用于配置 Pub/Sub 订阅。 
- 
                  如果要将代码更新部署到该服务,请重复执行上述步骤。向服务执行的每次部署都会创建一个新的修订版本,该修订版本准备就绪后会自动开始处理流量。 
 Terraform如需创建 Cloud Run 服务,请将以下内容添加到现有 .tf文件中。resource "google_project_service" "cloudrun_api" { service = "run.googleapis.com" disable_on_destroy = false } resource "google_cloud_run_v2_service" "default" { name = "pubsub-tutorial" location = "REGION" template { containers { image = "IMAGE_URL" } } depends_on = [google_project_service.cloudrun_api] } -  将 IMAGE_URL 替换为您的图片网址:REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
 
- 
                  
与 Pub/Sub 集成
如需将该服务与 Pub/Sub 集成,请执行以下操作:
gcloud
- 创建或选择一个服务账号,用于表示 Pub/Sub 订阅身份。 - gcloud iam service-accounts create cloud-run-pubsub-invoker \ --display-name "Cloud Run Pub/Sub Invoker" - 您可以使用 - cloud-run-pubsub-invoker,或将其替换为 Google Cloud 项目内唯一的名称。
- 使用该服务账号创建 Pub/Sub 订阅: - 为调用方服务账号授予调用您的 - pubsub-tutorial服务的权限:- gcloud run services add-iam-policy-binding pubsub-tutorial \ --member=serviceAccount:cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/run.invoker - IAM 更改可能需要几分钟时间才能完成传播。在此期间,您可能会在服务日志中看到 - HTTP 403错误。
- 允许 Pub/Sub 在您的项目中创建身份验证令牌: - gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator - 您需要进行如下替换: - 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。
 - Google Cloud 控制台中与您项目对应的“项目信息”面板中列出了项目 ID 和项目编号。 
- 使用该服务账号创建 Pub/Sub 订阅: - gcloud pubsub subscriptions create myRunSubscription --topic myRunTopic \ --ack-deadline=600 \ --push-endpoint=SERVICE-URL/ \ --push-auth-service-account=cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com - 您需要进行如下替换: - 将 myRunTopic 替换为之前创建的主题。
- 将 SERVICE-URL 替换为在部署服务时提供的 HTTPS 网址。即使您还添加了网域映射,此网址仍然有效。
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
 - --push-auth-service-account标志激活 Pub/Sub 推送功能,以进行身份验证和授权。- 您的 Cloud Run 服务网域会自动注册用于 Pub/Sub 订阅。 - 仅适用于 Cloud Run,可以对令牌是否有效进行内置身份验证检查,以及对服务账号是否有权调用 Cloud Run 服务进行授权检查。 
 
您的服务现已与 Pub/Sub 全面集成。
Terraform
- 创建或选择一个服务账号,用于表示 Pub/Sub 订阅身份。 
- 使用该服务账号创建 Pub/Sub 订阅: - 为调用方服务账号授予调用您的 - pubsub-tutorial服务的权限:
- 允许 Pub/Sub 在您的项目中创建身份验证令牌: 
- 使用该服务账号创建 Pub/Sub 订阅: 
 
您的服务现已与 Pub/Sub 全面集成。
试试看
如需测试端到端解决方案,请按如下所述操作:
- 向该主题发送一条 Pub/Sub 消息: - gcloud pubsub topics publish myRunTopic --message "Runner" - 除了使用命令行(如本教程中所示),您还可以编程方式发布消息。如需了解详情,请参阅发布消息。 
- 进入服务日志: - 前往 Google Cloud 控制台
- 点击 pubsub-tutorial服务。
- 选择日志标签页。 - 您可能需要等待一些时间才能看到日志。如果您没有立即看到日志,请稍等片刻再检查一次。 
 
- 查找“Hello Runner!”消息。