開始使用事件驅動型 Cloud Run 函式

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 來查看所有可用專案的清單。