本教學課程說明如何編寫及部署 Cloud Run 服務,並透過 Pub/Sub 推送訂閱項目呼叫這類服務。
目標
- 編寫、建構服務並部署至 Cloud Run
- 將訊息發布至 Pub/Sub 主題,藉此呼叫服務。
費用
在本文件中,您會使用下列 Google Cloud計費元件:
您可以使用 Pricing Calculator,根據預測用量估算費用。
事前準備
- 登入 Google Cloud 帳戶。如果您未曾使用過 Google Cloud,歡迎 建立帳戶,親自體驗實際使用我們產品的成效。新客戶還能獲得價值 $300 美元的免費抵免額,用於執行、測試及部署工作負載。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
啟用 Artifact Registry、Cloud Build、Pub/Sub 和 Cloud Run API (如有尚未啟用的 API)。
啟用 API 所需的角色
您必須具備
serviceusage.services.enable權限,才能啟用 API。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「Service Usage 管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。- 安裝並初始化 gcloud CLI。
- 更新元件:
gcloud components update
必要的角色
如要取得完成教學課程所需的權限,請要求管理員在專案中授予您下列 IAM 角色:
- Cloud Build 編輯者 (
roles/cloudbuild.builds.editor) - Cloud Run 管理員 (
roles/run.admin) - 建立服務帳戶 (
roles/iam.serviceAccountCreator) - 專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin) - Pub/Sub 編輯者 (
roles/pubsub.editor) - 服務帳戶使用者 (
roles/iam.serviceAccountUser) - 服務使用情形消費者 (
roles/serviceusage.serviceUsageConsumer) - 儲存空間管理員 (
roles/storage.admin)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
設定 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(印度孟買)asia-southeast3(曼谷)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 檔案中新增下列內容:
您可以使用雲端專案中不重複的主題名稱。
擷取程式碼範例
如要擷取要使用的程式碼範例:
將應用程式存放區範例複製到本機電腦中:
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 網路伺服器是在
app.js中設定。網路伺服器會在
index.js中啟動:Python
Go
Java
C#
處理 Pub/Sub 訊息並記錄問候語的處理常式。
Node.js
Python
Go
Java
C#
您必須為服務設定代碼,以傳回準確的 HTTP 回應代碼。成功代碼 (例如 HTTP
200或204) 表示 Pub/Sub 訊息已處理完畢。HTTP400或500等錯誤代碼表示系統會重試訊息,詳情請參閱使用推送指南接收訊息。與使用 Cloud Functions v2 API 建立的函式不同,您無法停用使用 Cloud Run Admin API 建立的函式的重試功能。詳情請參閱「設定事件導向函式重試功能」。Dockerfile:定義服務的運作環境。Dockerfile的內容會因語言而異。Node.js
Python
Go
Java
這個範例使用 Jib,透過常見的 Java 工具建構 Docker 映像檔。Jib 可最佳化容器建構作業,不需要 Dockerfile 或安裝 Docker。進一步瞭解如何使用 Jib 建構 Java 容器。
C#
如要進一步瞭解如何驗證 Pub/Sub 要求的來源,請參閱「與 Pub/Sub 整合」。
推送程式碼
推送程式碼包含三個步驟:使用 Cloud Build 建構容器映像檔、將容器映像檔上傳至 Artifact Registry,以及將容器映像檔部署至 Cloud Run。
如要推送程式碼:
-
建構容器並發布至 Artifact Registry:
Node.js
替換: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是映像檔名稱。成功後,您應該會看到「SUCCESS」訊息,其中包含 ID、建立時間和映像檔名稱。映像檔會儲存在 Artifact Registry 中,日後如有需要,可以重複使用。
Python
替換: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是映像檔名稱。成功後,您應該會看到「SUCCESS」訊息,其中包含 ID、建立時間和映像檔名稱。映像檔會儲存在 Artifact Registry 中,日後如有需要,可以重複使用。
Go
替換: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是映像檔名稱。成功後,您應該會看到「SUCCESS」訊息,其中包含 ID、建立時間和映像檔名稱。映像檔會儲存在 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是映像檔名稱。成功後,您應該會看到「SUCCESS」訊息,其中包含 ID、建立時間和映像檔名稱。映像檔會儲存在 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 專案編號。
專案 ID 和專案編號會列在Google Cloud 控制台的「Project info」(專案資訊) 面板中。
使用服務帳戶建立 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」服務。 選取 [Logs] (記錄) 分頁標籤。
記錄需要一些時間才會出現。如果您沒有立即看到記錄,請稍候片刻再查看一次。
尋找「Hello Runner!」訊息。
清除所用資源
如要進一步瞭解如何搭配使用 Cloud Run 和 Pub/Sub,請先略過清理步驟,繼續進行使用 Cloud Run 處理圖片教學課程。
為避免系統向您的 Google Cloud 帳戶收取額外費用,請刪除您在本教學課程中部署的所有資源。
刪除專案
如果您是為了這個教學課程建立新專案,請刪除專案。如果您使用現有專案,並想保留專案,但不要本教學課程新增的變更,請刪除為本教學課程建立的資源。
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
刪除專案的方法如下:
- 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。
刪除教學課程資源
刪除您在本教學課程中部署的 Cloud Run 服務。Cloud Run 服務在收到要求前不會產生費用。
如要刪除 Cloud Run 服務,請執行下列指令:
gcloud run services delete SERVICE-NAME
將 SERVICE-NAME 改為您的服務名稱。
您也可以從Google Cloud 控制台刪除 Cloud Run 服務。
移除您在教學課程設定期間新增的
gcloud預設區域設定:gcloud config unset run/region移除專案設定:
gcloud config unset project刪除在本教學課程中建立的其他 Google Cloud 資源:
- 刪除 Pub/Sub 主題
myRunTopic - 刪除 Pub/Sub 訂閱項目
myRunSubscription - 從 Artifact Registry 刪除容器映像檔
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub。 - 刪除叫用者服務帳戶
cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com
- 刪除 Pub/Sub 主題
後續步驟
- 瞭解如何設定重試。
- 如要瞭解如何使用內部輸入控管機制限制輸入,進而提高正式環境安全性,請參閱「限制輸入」。
- 擴充本教學課程中部署的範例服務,新增圖片處理功能,修改上傳至 Cloud Storage 的圖片。
- 進一步瞭解主題在 Pub/Sub 架構中的角色,以及如何管理主題
- 如要進一步瞭解 Pub/Sub 訂閱項目,請參閱「管理訂閱項目」。
- 查看 Google Cloud 的參考架構、圖表和最佳做法。歡迎瀏覽 Cloud Architecture Center。