本教學課程說明如何撰寫、部署 Cloud Run 服務,並透過 Pub/Sub 推送訂閱呼叫這類服務。
目標
- 撰寫、建構及部署至 Cloud Run 的服務
- 將訊息發布至 Pub/Sub 主題,藉此叫用服務。
費用
在本文件中,您將使用 Google Cloud的下列計費元件:
您可以使用 Pricing Calculator 根據預測用量產生預估費用。
事前準備
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure 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.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Pub/Sub and Cloud Run APIs.
- 安裝並初始化 gcloud CLI。
- 更新元件:
gcloud components update
-
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
)
必要的角色
如要取得完成本教學課程所需的權限,請要求管理員為您授予專案的下列 IAM 角色:
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
設定 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 網路伺服器是在
app.js
中設定。網路伺服器會在
index.js
中啟動:Python
Go
Java
C#
處理 Pub/Sub 訊息並記錄問候語的處理常式。
Node.js
Python
Go
Java
C#
您必須為服務設定代碼,以傳回準確的 HTTP 回應代碼。成功代碼 (例如 HTTP
200
或204
) 可確認 Pub/Sub 訊息完成處理。錯誤代碼 (例如 HTTP400
或500
) 表示系統會重新嘗試處理訊息。詳細資訊請參閱「利用推送功能接收訊息」指南。定義服務作業環境的
Dockerfile
。Dockerfile
的內容依程式語言而有所不同。Node.js
Python
Go
Java
這個範例使用 Jib 建構 Docker 映像檔,並使用常見的 Java 工具。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
是映像檔名稱。若成功執行,您應會看到包含 ID、建立時間和映像檔名稱的「SUCCESS」(成功) 訊息。映像檔會儲存在 Artifact Registry 中,日後如有需要,可以重複使用。
Python
Replace: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 中,日後如有需要,可以重複使用。
Go
Replace: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 中,日後如有需要,可以重複使用。
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 整合」一節。如要進一步瞭解以身分與存取權管理 (IAM) 為基礎的驗證機制,請參閱「使用 IAM 管理存取權」。請等待部署完成,這可能需要半分鐘的時間。 成功完成後,指令列會顯示服務網址。這個網址用於設定 Pub/Sub 訂閱。
-
如果您要將程式碼更新部署到服務,請重複上述步驟。每次部署到服務都會建立一個新的修訂版本,並會在就緒時自動開始處理流量。
Terraform
如要建立 Cloud Run 服務,請在現有的
.tf
檔案中新增下列內容。將
image
的值替換為圖片網址:REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
。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 = "us-central1" template { containers { image = "us-docker.pkg.dev/cloudrun/container/hello" # Replace with newly created image gcr.io/
/pubsub } } depends_on = [google_project_service.cloudrun_api] } -
整合 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 處理圖片教學課程。
如果您是為了這個教學課程建立新專案,請刪除專案。如果您使用現有專案,且希望保留該專案而不採用本教學課程中新增的變更,請刪除為教學課程建立的資源。
刪除專案
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
如要刪除專案:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
刪除教學課程資源
刪除您在本教學課程中部署的 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 資源:
後續步驟
- 如要瞭解如何透過內部入站控制項限制入站,進而提升實際工作環境的安全性,請參閱「限制入站」一文。
- 擴充本教學課程中部署的範例服務,以新增可修改上傳至 Cloud Storage 的圖片的圖片處理功能。
- 進一步瞭解主題在 Pub/Sub 架構中的運作方式,以及如何管理主題
- 如要進一步瞭解 Pub/Sub 訂閱項目,請參閱「管理訂閱項目」。
- 探索 Google Cloud 的參考架構、圖表和最佳做法。歡迎瀏覽我們的雲端架構中心。