使用 Eventarc 和 Workflows 建立事件導向的自動化調度管理

1. 簡介

cb762f29e9183a3f.png 1c05e3d0c2bd2b45.png a03f943ca09ac4c.png

Eventarc 可讓您輕鬆連結 Cloud Run 服務與各種來源的事件。Kubernetes 可讓您建構事件導向的架構,其中微服務的鬆耦合和分佈情形很低。可以為您處理事件擷取、提交、安全性、授權和錯誤處理等工作。

Workflows 是全代管的自動化調度管理平台,可按照您定義的順序執行服務:工作流程。這些工作流程可以結合託管於 Cloud Run 或 Cloud Functions 的服務、Google Cloud 服務 (例如 Cloud Vision AI 和 BigQuery),以及任何以 HTTP 為基礎的 API。

在本程式碼研究室中,您將建立事件導向的微服務自動化調度管理作業,藉此處理圖片。您會使用 Workflows 自動調度 4 張圖片處理 Cloud Functions 的順序、輸入和輸出內容。接著啟用自動化調度管理功能,在 Eventarc 中以鬆耦合的方式回應 Cloud Storage 事件。

課程最後,您最終會採用以結構靈活又有彈性的無伺服器架構來處理映像檔。

e372ceed8c26c5fb.png

課程內容

  • Eventarc 和 Workflows 總覽
  • 如何部署 Cloud Functions 服務
  • 如何使用 Workflows 自動化調度管理服務
  • 如何讓 Workflows 透過 Eventarc 回應 Cloud Storage 事件

2. 設定和需求

自修環境設定

  1. 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。您隨時可以更新這項資訊。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為 PROJECT_ID)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。此外,您也可以自行嘗試,看看系統是否提供該付款方式。在完成這個步驟後就無法變更,而且在專案期間仍會保持有效。
  • 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行這個程式碼研究室並不會產生任何費用,如果有的話。如要關閉資源,以免系統產生本教學課程結束後產生的費用,您可以刪除自己建立的資源,或刪除整個專案。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。

啟動 Cloud Shell

雖然 Google Cloud 可以從筆記型電腦遠端操作,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。

Google Cloud 控制台,按一下右上方的工具列上的 Cloud Shell 圖示:

55efc1aaa7a4d3ad.png

佈建並連線至環境的作業只需幾分鐘的時間。完成後,您應該會看到類似下方的內容:

7ffe5cbb04455448.png

這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。本程式碼研究室的所有工作都可以在瀏覽器中完成。不必安裝任何程式。

設定 gcloud

在 Cloud Shell 中設定專案 ID 和您要部署應用程式的區域。將其儲存為 PROJECT_IDREGION 變數。如要查看可用的區域,請參閱 Cloud Functions 位置

PROJECT_ID=your-project-id
gcloud config set project $PROJECT_ID

取得原始碼

應用程式的原始碼位於 eventarc-samples 存放區的 processing-pipelines 資料夾中。

複製存放區:

git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git

前往 eventarc-samples/processing-pipelines 資料夾:

cd eventarc-samples/processing-pipelines

3. 架構總覽

應用程式的架構如下:

6aa6fbc7721dd6b6.png

  1. 系統會將圖片儲存至產生 Cloud Storage 建立事件的輸入值區。
  2. Cloud Storage 建立事件會透過 Cloud Storage 觸發條件讀取,並做為 CloudEvent 傳送至 EventarcEventarc
  3. 在工作流程的第一個步驟中,Cloud 函式服務 Filter 會使用 Vision API 判斷圖片是否安全。如果圖片安全,Workflows 會繼續執行後續步驟。
  4. 在工作流程的第二個步驟中,Cloud 函式服務 Labeler 會使用 Vision API 擷取圖片標籤,並將標籤儲存至輸出值區。
  5. 在第三個步驟中,另一個 Cloud 函式服務 Resizer 會使用 ImageSharp 調整圖片大小,並將調整後的圖片儲存至輸出值區。
  6. 在最後一個步驟中,另一個 Cloud 函式服務 Watermarker 服務會使用 ImageSharp 在調整過大小的圖片中,為調整大小後的圖片新增浮水印,並將圖片儲存至輸出值區。

應用程式是由 Cloud Storage 事件觸發,因此為事件導向。圖片會在工作流程中進行處理,因此成為自動化調度管理作業。說到底,這項解決方案是以事件為核心,能讓系統透過結構化的彈性無伺服器架構來處理映像檔。

4. 建立值區

建立輸入值區,讓使用者將圖片上傳至,以及建立圖片處理管道的輸出值區,以便儲存處理過的圖片。

在 Cloud Shell 中執行下列指令:

REGION=us-central1
BUCKET1=$PROJECT_ID-images-input
BUCKET2=$PROJECT_ID-images-output

gsutil mb -l $REGION gs://$BUCKET1
gsutil mb -l $REGION gs://$BUCKET2

5. 部署篩選器服務

讓我們先部署第一項服務。這項 Cloud Functions 服務會接收值區和檔案資訊,藉此判斷圖片是否可透過 Vision API 確保安全,並傳回結果。

首先,請啟用 Cloud Functions gen2 和 Vision API 的必要服務:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  cloudfunctions.googleapis.com \
  run.googleapis.com \
  vision.googleapis.com

在頂層 processing-pipelines 資料夾中部署服務:

SERVICE_NAME=filter

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --entry-point Filter.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v3/filter/csharp

部署函式後,請在變數中設定服務網址,稍後需使用:

FILTER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

6. 部署標籤人員服務

第二項 Cloud Functions 服務接收值區和檔案資訊、使用 Vision API 擷取圖片標籤,並將標籤儲存至輸出值區。

在頂層 processing-pipelines 資料夾中部署服務:

SERVICE_NAME=labeler

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Labeler.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/labeler/csharp

部署函式後,請在變數中設定服務網址,稍後需使用:

LABELER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

7. 部署大小調整工具服務

這項 Cloud Functions 服務接收值區和檔案資訊,使用 ImageSharp 調整圖片大小,並將圖片儲存至輸出值區。

在頂層 processing-pipelines 資料夾中,部署服務:

SERVICE_NAME=resizer

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Resizer.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/resizer/csharp \
  --timeout=120s

請注意,timeout 值是 2 分鐘,讓調整器函式有更多時間進行處理。

部署函式後,請在變數中設定服務網址,稍後需使用:

RESIZER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

8. 部署浮水印服務

這項 Cloud Functions 服務會接收值區、檔案和標籤資訊、讀取檔案、使用 ImageSharp 將標籤新增為圖片浮水印,並將圖片儲存至輸出值區。

在頂層 processing-pipelines 資料夾中部署服務:

SERVICE_NAME=watermarker

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Watermarker.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/watermarker/csharp

部署函式後,請在變數中設定服務網址,稍後需使用:

WATERMARKER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

此時,應部署並執行這四個 Cloud 函式:

76a218568982c90c.png

9. 定義及部署工作流程

使用 Workflows 將篩選器、標籤人員、大小調整工具和浮水印服務整合到工作流程中。Workflows 會依據我們定義的參數來自動化調度管理服務呼叫這些服務。

首先,啟用 Workflows 的必要服務:

gcloud services enable \
  workflows.googleapis.com \
  workflowexecutions.googleapis.com

定義

工作流程接收 CloudEvent 做為參數。建立觸發條件後,擷取自 Eventarc。在前兩個步驟中,Workflows 會記錄事件,並從事件中擷取值區和檔案資訊:

main:
  params: [event]
  steps:
  - log_event:
      call: sys.log
      args:
          text: ${event}
          severity: INFO
  - extract_bucket_and_file:
      assign:
      - bucket: ${event.data.bucket}
      - file: ${event.data.name}

filter 步驟中,Workflows 會呼叫我們先前部署的篩選服務。接著記錄並檢查檔案安全:

  - filter:
      call: http.post
      args:
        url: FILTER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: filterResponse
  - log_safety:
      call: sys.log
      args:
          text: ${filterResponse.body.safe}
          severity: INFO
  - check_safety:
      switch:
        - condition: ${filterResponse.body.safe == true}
          next: label
      next: end

label 步驟中,Workflows 會向標籤人員服務發出呼叫並擷取回應 (前 3 大標籤):

  - label:
      call: http.post
      args:
        url: LABELER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: labelResponse

resize 步驟中,Workflows 會向調整工具服務發出呼叫,並擷取回應 (調整大小後圖片的值區和檔案):

  - resize:
      call: http.post
      args:
        url: RESIZER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: resizeResponse

watermark 步驟中,Workflows 會使用調整大小後的圖片和標籤呼叫浮水印服務,並擷取結果 (經過大小調整和加上浮水印的圖片):

  - watermark:
      call: http.post
      args:
        url: WATERMARKER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${resizeResponse.body.bucket}
            file: ${resizeResponse.body.file}
            labels: ${labelResponse.body.labels}
      result: watermarkResponse

final 步驟中,Workflows 會從標籤人員、大小調整器和浮水印服務服務傳回 HTTP 狀態碼:

  - final:
      return:
        label: ${labelResponse.code}
        resize: ${resizeResponse.code}
        watermark: ${watermarkResponse.code}

部署

部署工作流程之前,請務必手動或使用 sed,將服務網址替換為已部署函式的網址:

在頂層 processing-pipelines 資料夾中,前往 workflows.yaml 檔案所在的 image-v3 資料夾:

cd image-v3/

執行 sed,將預留位置網址替換為已部署服務的實際網址:

sed -i -e "s|FILTER_URL|${FILTER_URL}|" workflow.yaml
sed -i -e "s|LABELER_URL|${LABELER_URL}|" workflow.yaml
sed -i -e "s|RESIZER_URL|${RESIZER_URL}|" workflow.yaml
sed -i -e "s|WATERMARKER_URL|${WATERMARKER_URL}|" workflow.yaml

部署工作流程:

WORKFLOW_NAME=image-processing

gcloud workflows deploy $WORKFLOW_NAME \
    --source=workflow.yaml \
    --location=$REGION

幾秒後,您應該會在控制台中看到部署的工作流程:

92cf4e758bdc3dde.png

10. 建立觸發條件

工作流程部署完畢後,最後一步是使用 Eventarc 觸發條件連結至 Cloud Storage 事件。

一次性設定

首先,為 Eventarc 啟用必要服務:

gcloud services enable \
 eventarc.googleapis.com

建立要在 Eventarc 觸發條件中使用的服務帳戶。

SERVICE_ACCOUNT=eventarc-trigger-imageproc-sa

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Eventarc trigger image processing service account"

授予 workflows.invoker 角色,以便透過服務帳戶從 Eventarc 叫用 Workflows:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --role roles/workflows.invoker \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

授予 eventarc.eventReceiver 角色,服務帳戶才能用於

Cloud Storage 觸發條件:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --role roles/eventarc.eventReceiver \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

pubsub.publisher 角色授予 Cloud Storage 服務帳戶。以 Eventarc 的 Cloud Storage 觸發條件來說,您必須完成這項操作:

STORAGE_SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p $PROJECT_ID)"

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:$STORAGE_SERVICE_ACCOUNT \
    --role roles/pubsub.publisher

建立

執行下列指令來建立觸發條件。這項觸發條件會篩選輸入 Cloud Storage 值區中的新檔案建立事件,並將這些事件傳送至先前定義的工作流程:

TRIGGER_NAME=trigger-image-processing

gcloud eventarc triggers create $TRIGGER_NAME \
  --location=$REGION \
  --destination-workflow=$WORKFLOW_NAME \
  --destination-workflow-location=$REGION \
  --event-filters="type=google.cloud.storage.object.v1.finalized" \
  --event-filters="bucket=$BUCKET1" \
  --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

您可以在 Cloud 控制台的 Eventarc 專區中查看觸發條件已建立完成:

14330c4fa2451bc0.png

11. 測試管道

圖片處理管道已準備好接收 Cloud Storage 的事件。如要測試管道,請將圖片上傳至輸入值區:

gsutil cp beach.jpg gs://$BUCKET1

上傳圖片後,您應該會看到處於啟用狀態的工作流程執行程序:

36d07cb63c39e7d9.png

大約一分鐘後,您應該會看到執行成功。您也可以查看工作流程的輸入內容和輸出內容:

229200c79d989c25.png

如果您列出輸出值區的內容,應該會看到大小經過調整的圖片、經過調整且有浮水印的圖片,以及圖片的標籤:

gsutil ls gs://$BUCKET2

gs://$PROJECT_ID-images-output/beach-400x400-watermark.jpeg
gs://$PROJECT_ID-images-output/beach-400x400.png
gs://$PROJECT_ID-images-output/beach-labels.txt

如要再次確認,你可以開啟調整大小後和浮水印的圖片來查看結果:

75f3c0019ca842ce.jpeg

12. 恭喜

恭喜,您已完成程式碼研究室!

涵蓋內容

  • Eventarc 和 Workflows 總覽
  • 如何部署 Cloud Functions 服務
  • 如何使用 Workflows 自動化調度管理服務
  • 如何讓 Workflows 透過 Eventarc 回應 Cloud Storage 事件