開始使用事件導向 Cloud Run 函式

1. 簡介

總覽

Cloud Run 函式可讓您使用熟悉的 GCF 事件模式和函式簽章來部署工作負載。Cloud Run 函式可讓您直接控管在 Cloud Run 建立的基礎服務,而不是使用我們專屬的建構程序和部署設定。

藉由 Cloud Run 函式,您可以輕鬆享有 Cloud Run 來源部署的簡單使用者體驗,讓開發人員使用 Cloud Run 設定,全面控管工作負載。

在本節中,您將瞭解如何在節點中部署事件導向函式。您將部署在 Google Cloud Storage 值區中完成物件時觸發的函式。

本程式碼研究室會在以下範例中使用 Nodejs 範例。不過,您也能以您選擇的語言使用 Cloud Functions (第 2 代) 程式碼範例:

課程內容

  • 如何部署以事件為準的 Cloud Run 函式,該函式會在每次物件上傳至 GCS 值區時觸發
  • 如何建立具備適當角色的服務帳戶,以接收 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. 建立 Storage 值區和服務帳戶

建立儲存空間值區

您可以執行下列指令來建立 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. 建立及部署函式

首先,建立原始碼的目錄,並以 cd 指向該目錄。

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 將函式建構為可執行的容器型服務
  • 新服務的進入點是用於將新服務的進入點設為您要叫用的函式簽章
  • (選用) 防止您的函式可公開叫用

如要查看新服務 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 服務名稱
  • ,請勿在值區名稱中使用「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 控制台網頁介面或 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 Cloud 控制台 (https://console.cloud.google.com/run/),然後刪除您在本程式碼研究室中建立的 crf-event-codelab 服務。

如果選擇刪除整個專案,請前往 https://console.cloud.google.com/cloud-resource-manager,選取您在步驟 2 建立的專案,然後選擇「刪除」。如果刪除專案,您必須變更 Cloud SDK 中的專案。您可以執行 gcloud projects list 來查看可用專案的清單。