本教學課程將示範如何使用 Pub/Sub 觸發條件編寫及觸發以事件為準的 Cloud Run 函式。
您可以為 Eventarc 觸發條件指定篩選器,藉此設定事件路由,包括事件來源和事件目標。在本教學課程的範例中,將訊息發布至 Pub/Sub 主題會觸發事件,並以 HTTP 要求的形式將要求傳送至函式。
如果您是 Pub/Sub 新手,且想進一步瞭解相關資訊,請參閱 Pub/Sub 說明文件,瞭解快速入門課程和重要參考資料。
目標
在這個教學課程中,您將執行下列操作:
費用
在本文件中,您會使用 Google Cloud的下列計費元件:
您可以使用 Pricing Calculator 根據預測用量產生預估費用。
事前準備
貴機構定義的安全性限制,可能會導致您無法完成下列步驟。如需疑難排解資訊,請參閱「在受限的 Google Cloud 環境中開發應用程式」。
- 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.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
- 如果您未使用 Cloud Shell,請更新 Google Cloud CLI 元件,並使用您的帳戶登入:
gcloud components update gcloud auth login
- 啟用 API:
gcloud services enable artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ eventarc.googleapis.com \ run.googleapis.com \ logging.googleapis.com \ pubsub.googleapis.com
- 設定本教學課程中使用的設定變數:
export REGION=us-central1 gcloud config set run/region ${REGION} gcloud config set run/platform managed gcloud config set eventarc/location ${REGION}
- 建立服務帳戶:
SERVICE_ACCOUNT=eventarc-trigger-sa gcloud iam service-accounts create $SERVICE_ACCOUNT
必要的角色
您或管理員必須為部署者帳戶、觸發器身分,以及 Pub/Sub 服務代理人和 Cloud Storage 服務代理人授予下列 IAM 角色 (選用)。
部署者帳戶的必要角色
-
如果您是專案建立者,系統會授予您基本擁有者角色 (
roles/owner
)。根據預設,這個身分與存取權管理 (IAM) 角色會包含完整存取大部分 Google Cloud資源所需的權限,因此您可以略過這個步驟。如果您不是專案建立者,則必須將必要權限授予專案中的適當實體。舉例來說,主體可以是 Google 帳戶 (適用於使用者),也可以是服務帳戶 (適用於應用程式和運算工作負載)。詳情請參閱活動目的地的角色和權限頁面。
如要取得完成本教學課程所需的權限,請要求管理員為您授予專案的下列 IAM 角色:
-
Cloud Run 來源開發人員 (
roles/run.sourceDeveloper
) -
專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin
) -
服務帳戶使用者 (
roles/iam.serviceAccountUser
) -
服務使用情形管理員 (
roles/serviceusage.serviceUsageAdmin
) -
記錄檔檢視存取者 (
roles/logging.viewAccessor
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
請注意,根據預設,Cloud Build 權限包含上傳及下載 Artifact Registry 構件的權限。
-
Cloud Run 來源開發人員 (
觸發條件身分的必要角色
請記下 Compute Engine 預設服務帳戶,因為您會將其附加至 Eventarc 觸發事件,以便代表觸發事件的身分,用於測試用途。啟用或使用使用 Compute Engine 的 Google Cloud 服務後,系統會自動建立這個服務帳戶,且電子郵件格式如下:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
將
PROJECT_NUMBER
替換為您的 Google Cloud專案編號。您可以在 Google Cloud 控制台的「歡迎」頁面上找到專案編號,也可以執行下列指令:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
- 根據預設,只有專案擁有者、專案編輯者,以及 Cloud Run 管理員和叫用者可以叫用 Cloud Run 服務。您可以依服務控制存取權,但為了測試,請將 Google Cloud 專案的 Cloud Run 叫用者角色 (
run.invoker
) 授予 Compute Engine 服務帳戶。這樣一來,系統就會為專案中的所有 Cloud Run 服務和工作授予這個角色。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/run.invoker
請注意,如果您為經過驗證的 Cloud Run 服務建立觸發條件,但未授予 Cloud Run 叫用者角色,系統會成功建立觸發條件並啟用。不過,觸發條件無法正常運作,而且記錄中會顯示類似以下的訊息:
The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header.
- 將專案的 Eventarc 事件接收者角色 (
roles/eventarc.eventReceiver
) 授予 Compute Engine 預設服務帳戶,以便 Eventarc 觸發條件接收事件供應者的事件。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/eventarc.eventReceiver
Cloud Storage 服務代理的選用角色
- 為 Cloud Storage 的直接事件建立觸發條件之前,請先將 Pub/Sub 發布者角色 (
roles/pubsub.publisher
) 授予 Cloud Storage 服務代理:SERVICE_ACCOUNT="$(gcloud storage service-agent --project=PROJECT_ID)" gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role='roles/pubsub.publisher'
Pub/Sub 服務代理人的選用角色
- 如果您是在 2021 年 4 月 8 日當天或之前啟用 Cloud Pub/Sub 服務代理,以便支援經過驗證的 Pub/Sub 推送要求,請將 服務帳戶權杖建立者角色 (
roles/iam.serviceAccountTokenCreator
) 授予服務代理。否則,系統會預設授予這個角色:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
建立 Pub/Sub 主題
在 Cloud Run 中,部署函式時不會自動建立 Pub/Sub 主題。在部署函式之前,請將訊息發布至這個 Pub/Sub 主題,藉此觸發函式:
gcloud pubsub topics create YOUR_TOPIC_NAME
準備應用程式
將應用程式存放區範例複製到本機電腦中:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
.NET
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
Ruby
git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.git
PHP
git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git
變更為包含 Pub/Sub 存取範例程式碼的目錄:
Node.js
cd nodejs-docs-samples/functions/v2/helloPubSub/
Python
cd python-docs-samples/functions/v2/pubsub/
Go
cd golang-samples/functions/functionsv2/hellopubsub/
Java
cd java-docs-samples/functions/v2/pubsub/
.NET
cd dotnet-docs-samples/functions/helloworld/HelloPubSub/
Ruby
cd ruby-docs-samples/functions/helloworld/pubsub/
PHP
cd php-docs-samples/functions/helloworld_pubsub/
查看程式碼範例:
Node.js
Python
Go
Java
.NET
Ruby
PHP
部署事件導向函式
如要部署函式,請在包含範例程式碼的目錄中執行下列指令:
Node.js
gcloud run deploy FUNCTION \
--source . \
--function helloPubSub \
--base-image BASE_IMAGE \
取代:
- FUNCTION 改為您要部署的函式名稱。如果省略這個參數,系統會在您執行指令時提示您輸入名稱。
- BASE_IMAGE 搭配函式的基礎映像檔環境,例如
nodejs22
。如要進一步瞭解基礎映像檔和各個映像檔所包含的套件,請參閱「支援的語言執行階段和基礎映像檔」。
Python
gcloud run deploy FUNCTION \
--source . \
--function subscribe \
--base-image BASE_IMAGE \
取代:
- FUNCTION 改為您要部署的函式名稱。如果省略這個參數,系統會在您執行指令時提示您輸入名稱。
- BASE_IMAGE 搭配函式的基礎映像檔環境,例如
python313
。如要進一步瞭解基礎映像檔和各個映像檔所包含的套件,請參閱「支援的語言執行階段和基礎映像檔」。
Go
gcloud run deploy FUNCTION \
--source . \
--function HelloPubSub \
--base-image BASE_IMAGE \
取代:
- FUNCTION 替換為您要部署的函式名稱。如果省略這個參數,系統會在您執行指令時提示您輸入名稱。
- BASE_IMAGE 搭配函式的基礎映像檔環境,例如
go123
。如要進一步瞭解基礎映像檔和各個映像檔所包含的套件,請參閱「支援的語言執行階段和基礎映像檔」。
Java
gcloud run deploy FUNCTION \
--source . \
--function functions.SubscribeToTopic \
--base-image BASE_IMAGE \
取代:
- FUNCTION 改為您要部署的函式名稱。如果省略這個參數,系統會在您執行指令時提示您輸入名稱。
- BASE_IMAGE 搭配函式的基礎映像檔環境,例如
java21
。如要進一步瞭解基礎映像檔和各個映像檔所包含的套件,請參閱「支援的語言執行階段和基礎映像檔」。
.NET
gcloud run deploy FUNCTION \
--source . \
--function HelloPubSub.Function \
--base-image BASE_IMAGE \
取代:
- FUNCTION 替換為您要部署的函式名稱。如果省略這個參數,系統會在您執行指令時提示您輸入名稱。
- BASE_IMAGE 搭配函式的基礎映像檔環境,例如
dotnet8
。如要進一步瞭解基礎映像檔和各個映像檔所包含的套件,請參閱「支援的語言執行階段和基礎映像檔」。
Ruby
gcloud run deploy FUNCTION \
--source . \
--function hello_pubsub \
--base-image BASE_IMAGE \
取代:
- FUNCTION 替換為您要部署的函式名稱。如果省略這個參數,系統會在您執行指令時提示您輸入名稱。
- BASE_IMAGE 搭配函式的基礎映像檔環境,例如
ruby34
。如要進一步瞭解基礎映像檔和各個映像檔所包含的套件,請參閱「支援的語言執行階段和基礎映像檔」。
PHP
gcloud run deploy FUNCTION \
--source . \
--function helloworldPubsub \
--base-image BASE_IMAGE \
取代:
- FUNCTION 改為您要部署的函式名稱。如果省略這個參數,系統會在您執行指令時提示您輸入名稱。
- BASE_IMAGE 搭配函式的基礎映像檔環境,例如
php84
。如要進一步瞭解基礎映像檔和各個映像檔所包含的套件,請參閱「支援的語言執行階段和基礎映像檔」。
如果系統提示您在指定區域建立存放區,請按下 y
回應。部署完成後,Google Cloud CLI 會顯示服務執行的網址。
建立 Eventarc 觸發條件
如要使用 Pub/Sub 觸發條件部署函式,請在包含程式碼範例的目錄中執行下列指令:
建立 Eventarc Pub/Sub 觸發條件:
gcloud eventarc triggers create TRIGGER_NAME \ --location=${REGION} \ --destination-run-service=FUNCTION \ --destination-run-region=${REGION} \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
取代:
- TRIGGER_NAME 替換為觸發條件的名稱。
- FUNCTION 替換為函式名稱。
- PROJECT_NUMBER 換成您的 Google Cloud 專案編號。
請注意,在 Google Cloud 專案中首次建立 Eventarc 觸發條件時,Eventarc 服務代理程式可能會延遲佈建。您通常可以嘗試重新建立觸發條件來解決這個問題。詳情請參閱權限遭拒錯誤。
確認觸發條件是否已成功建立。請注意,雖然觸發條件會立即建立,但觸發條件最多可能需要兩分鐘才能完全運作。
gcloud eventarc triggers list --location=${REGION}
畫面會顯示如下的輸出內容:
NAME: helloworld-events TYPE: google.cloud.pubsub.topic.v1.messagePublished DESTINATION: Cloud Run service: helloworld-events ACTIVE: Yes LOCATION: us-central1
觸發函式
如要測試 Pub/Sub 函式,請按照下列步驟操作:
將主題指派給變數:
TOPIC_ID=$(gcloud eventarc triggers describe TRIGGER_NAME --location $REGION --format='value(transport.pubsub.topic)')
將訊息發布到主題:
gcloud pubsub topics publish $TOPIC_ID --message="Hello World"
Cloud Run 服務會記錄傳入訊息的內容。您可以在 Cloud Run 執行個體的「Logs」(記錄) 部分查看這項資訊:
- 前往 Google Cloud 控制台。
- 按一下函式。
選取 [Logs] (記錄) 分頁標籤。
記錄需要一些時間才會出現。如果您沒有立即看到記錄,請稍候片刻再查看一次。
尋找「Hello World!」訊息。
清除所用資源
如果您是為了這個教學課程建立新專案,請刪除專案。如果您使用現有的專案,且想保留該專案而不採用本教學課程中的變更,請刪除為教學課程建立的資源。
刪除專案
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
如要刪除專案:
- 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 CLI 預設設定。
例如:
gcloud config unset run/region
或
gcloud config unset project
刪除本教學課程中建立的其他 Google Cloud 資源:
- 刪除 Eventarc 觸發條件:
請將gcloud eventarc triggers delete TRIGGER_NAME
TRIGGER_NAME
替換為觸發條件名稱。
- 刪除 Eventarc 觸發條件: