1. 簡介
總覽
Cloud Run 函式是一種新方法,可使用熟悉的 GCF 事件模式和函式簽章來部署工作負載。您可以直接控管在 Cloud Run 上建立的基礎服務,而非使用我們的建構程序和部署設定。
透過 Cloud Run 函式,我們提供簡單的 Cloud Run 原始碼部署使用者體驗,讓開發人員可以透過 Cloud Run 設定完全控管工作負載。
在本節中,您將瞭解如何在 Node 中部署事件驅動函式。您將部署函式,只要 Google Cloud Storage 值區中的物件完成,就會觸發這項函式。
本程式碼研究室在下列範例中使用 nodejs 範例。不過,您可以使用自己偏好的語言,使用 Cloud Functions 第 2 代程式碼範例:
課程內容
- 如何部署事件驅動的 Cloud Run 函式,以便在物件上傳至 GCS bucket 時觸發
- 如何建立具有適當角色的服務帳戶,以便接收 Cloud Storage 事件並叫用 Cloud Run 函式
2. 設定環境變數並啟用 API
更新 gcloud CLI
這個程式碼研究室需要安裝最新版本的 gcloud CLI。您可以執行以下命令來更新 CLI:
gcloud components update
啟用 API
您必須先啟用幾個 API,才能開始使用本程式碼研究室。本程式碼研究室需要使用下列 API。您可以執行下列指令來啟用這些 API:
gcloud services enable run.googleapis.com \ cloudbuild.googleapis.com \ storage.googleapis.com \ artifactregistry.googleapis.com
設定環境變數
您可以設定在本程式碼研究室中使用的環境變數。
PROJECT_ID=<YOUR_PROJECT_ID> REGION=<YOUR_REGION, e.g. us-central1> gcloud config set project $PROJECT_ID SERVICE_NAME=crf-event-codelab BUCKET_NAME=$PROJECT_ID-$SERVICE_NAME TRIGGER_NAME=$SERVICE_NAME-trigger
3. 建立儲存空間值區和服務帳戶
建立儲存空間值區
您可以執行下列指令來建立 Cloud Storage 值區:
gsutil mb -l us-central1 gs://$BUCKET_NAME
建立服務帳戶
在這個範例中,您將建立服務帳戶,並授予必要的 Eventarc 權限和 Cloud Run 叫用者角色,以便接收 Cloud Storage 中的事件,並叫用 Cloud Run 函式。
首先,請建立服務帳戶。
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)') SERVICE_ACCOUNT="cloud-run-functions" SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name="Cloud Run functions Eventarc service account"
接著,將專案中的 Eventarc 事件接收者角色 (roles/eventarc.eventReceiver) 授予與 Eventarc 觸發條件相關聯的服務帳戶,讓觸發條件能夠接收事件供應者的事件。
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/eventarc.eventReceiver
接著,將 Cloud Run 叫用者角色授予服務帳戶,讓服務帳戶能夠叫用函式。
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/run.invoker
4. 建立及部署函式
首先,請建立原始碼目錄,然後切換至該目錄。
mkdir ../$SERVICE_NAME && cd $_
接著,請使用以下內容建立 package.json
檔案:
{ "dependencies": { "@google-cloud/functions-framework": "^3.0.0" } }
接著,請使用以下內容建立 index.js
檔案:
const functions = require("@google-cloud/functions-framework"); // Register a CloudEvent callback with the Functions Framework that will // be triggered by Cloud Storage. functions.cloudEvent("helloGCS", (cloudEvent) => { console.log(`Event ID: ${cloudEvent.id}`); console.log(`Event Type: ${cloudEvent.type}`); const file = cloudEvent.data; console.log(`Bucket: ${file.bucket}`); console.log(`File: ${file.name}`); console.log(`Metageneration: ${file.metageneration}`); console.log(`Created: ${file.timeCreated}`); console.log(`Updated: ${file.updated}`); });
您現在可以執行下列指令,部署 Cloud Run 函式:
gcloud beta run deploy $SERVICE_NAME \ --source . \ --function helloGCS \ --region $REGION \ --no-allow-unauthenticated
請注意下列事項:
- –source 標記可用於告知 Cloud Run 將函式建構為可執行的容器型服務
- –function 標記 (new) 可用來將新服務的進入點設為要叫用的函式簽章
- (選用) 使用 –no-allow-unauthenticated 可防止函式公開叫用
您可以執行下列指令,查看新的服務 crf-nodejs-event
:
gcloud beta run services describe $SERVICE_NAME
5. 建立事件
我們可以建立 Eventarc 觸發條件,在 Google Cloud Storage 中完成物件時,向函式傳送訊息:
BUCKET_REGION=$REGION gcloud eventarc triggers create $TRIGGER_NAME \ --location=$REGION \ --destination-run-service=crf-nodejs-event \ --destination-run-region=$BUCKET_REGION \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=$BUCKET_NAME" \ --service-account=$SERVICE_ACCOUNT_ADDRESS
請注意下列事項:
- gcs-function-trigger 是觸發條件的名稱
- crf-nodejs-event 是部署函式的 Cloud Run 服務名稱
- 請勿在值區名稱中使用 –event-filters 標記的 gs:// 前置字串。
如要瞭解如何使用 Eventarc 設定 Cloud Storage 的觸發事件服務,請參閱 Cloud Run 說明文件:https://cloud.google.com/run/docs/tutorials/eventarc
6. 測試函式
部署完成後,您會看到服務網址。如要叫用函式,您必須傳送已驗證的要求,其中包含您的身分權杖或具有 Cloud Run 叫用者角色的實體身分權杖,如下所示:
# get the Service URL SERVICE_URL="$(gcloud run services describe crf-nodejs-event --region us-central1 --format 'value(status.url)')" # invoke the service curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL
函式已部署,觸發條件也已建立,現在可以叫用函式了。
建立檔案並上傳至 Cloud Storage 值區。您可以透過 Cloud Console 網頁介面或 gsutil CLI 工具執行這項操作,例如:
echo "hello world" > test.txt gsutil cp test gs://$BUCKET_NAME
檔案上傳成功後,系統會產生事件,函式也會列印物件的基本資訊,例如檔案名稱。您可以在 Cloud 控制台的函式記錄項目中找到這項輸出內容。或者,您也可以使用 gcloud CLI 查詢這項輸出內容:
gcloud logging read "resource.labels.service_name=crf-nodejs-event AND textPayload: File" --format=json
您應該會看到下列輸出內容
"textPayload": "File: test.txt"
7. 恭喜!
恭喜您完成程式碼研究室!
建議您參考 Cloud Run 函式的說明文件
涵蓋內容
- 如何部署事件驅動的 Cloud Run 函式,以便在物件上傳至 GCS 儲存桶時觸發
- 如何建立具有適當角色的服務帳戶,以便接收 Cloud Storage 事件並叫用 Cloud Run 函式
8. 清理
為避免產生意外費用 (例如,如果這個 Cloud Run 服務不小心叫用次數超過 免費等級的 Cloud Run 叫用次數配額),您可以刪除 Cloud Run 服務,或刪除在步驟 2 中建立的專案。
如要刪除 Cloud Run 服務,請前往 Cloud Run 雲端控制台 (網址:https://console.cloud.google.com/run/),然後刪除您在本程式碼研究室中建立的 crf-event-codelab
服務。
如果您選擇刪除整個專案,可以前往 https://console.cloud.google.com/cloud-resource-manager,選取您在步驟 2 中建立的專案,然後選擇「Delete」(刪除)。如果您刪除專案,就必須在 Cloud SDK 中變更專案。您可以執行 gcloud projects list
來查看所有可用專案的清單。