1. 簡介
Eventarc 可讓您輕鬆連結 Cloud Run 服務與各種來源的事件。Kubernetes 可讓您建構事件導向的架構,其中微服務的鬆耦合和分佈情形很低。可以為您處理事件擷取、提交、安全性、授權和錯誤處理等工作。
Workflows 是全代管的自動化調度管理平台,可按照您定義的順序執行服務:工作流程。這些工作流程可以結合託管於 Cloud Run 或 Cloud Functions 的服務、Google Cloud 服務 (例如 Cloud Vision AI 和 BigQuery),以及任何以 HTTP 為基礎的 API。
在本程式碼研究室中,您將建立事件導向的微服務自動化調度管理作業,藉此處理圖片。您會使用 Workflows 自動調度 4 張圖片處理 Cloud Functions 的順序、輸入和輸出內容。接著啟用自動化調度管理功能,在 Eventarc 中以鬆耦合的方式回應 Cloud Storage 事件。
課程最後,您最終會採用以結構靈活又有彈性的無伺服器架構來處理映像檔。
課程內容
- Eventarc 和 Workflows 總覽
- 如何部署 Cloud Functions 服務
- 如何使用 Workflows 自動化調度管理服務
- 如何讓 Workflows 透過 Eventarc 回應 Cloud Storage 事件
2. 設定和需求
自修環境設定
- 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。
- 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。您隨時可以更新這項資訊。
- 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為
PROJECT_ID
)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。此外,您也可以自行嘗試,看看系統是否提供該付款方式。在完成這個步驟後就無法變更,而且在專案期間仍會保持有效。 - 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件。
- 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行這個程式碼研究室並不會產生任何費用,如果有的話。如要關閉資源,以免系統產生本教學課程結束後產生的費用,您可以刪除自己建立的資源,或刪除整個專案。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。
啟動 Cloud Shell
雖然 Google Cloud 可以從筆記型電腦遠端操作,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。
在 Google Cloud 控制台,按一下右上方的工具列上的 Cloud Shell 圖示:
佈建並連線至環境的作業只需幾分鐘的時間。完成後,您應該會看到類似下方的內容:
這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。本程式碼研究室的所有工作都可以在瀏覽器中完成。不必安裝任何程式。
設定 gcloud
在 Cloud Shell 中設定專案 ID 和您要部署應用程式的區域。將其儲存為 PROJECT_ID
和 REGION
變數。如要查看可用的區域,請參閱 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. 架構總覽
應用程式的架構如下:
- 系統會將圖片儲存至產生 Cloud Storage 建立事件的輸入值區。
- Cloud Storage 建立事件會透過 Cloud Storage 觸發條件讀取,並做為 CloudEvent 傳送至 Eventarc。Eventarc
- 在工作流程的第一個步驟中,Cloud 函式服務 Filter 會使用 Vision API 判斷圖片是否安全。如果圖片安全,Workflows 會繼續執行後續步驟。
- 在工作流程的第二個步驟中,Cloud 函式服務 Labeler 會使用 Vision API 擷取圖片標籤,並將標籤儲存至輸出值區。
- 在第三個步驟中,另一個 Cloud 函式服務 Resizer 會使用 ImageSharp 調整圖片大小,並將調整後的圖片儲存至輸出值區。
- 在最後一個步驟中,另一個 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 函式:
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
幾秒後,您應該會在控制台中看到部署的工作流程:
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 專區中查看觸發條件已建立完成:
11. 測試管道
圖片處理管道已準備好接收 Cloud Storage 的事件。如要測試管道,請將圖片上傳至輸入值區:
gsutil cp beach.jpg gs://$BUCKET1
上傳圖片後,您應該會看到處於啟用狀態的工作流程執行程序:
大約一分鐘後,您應該會看到執行成功。您也可以查看工作流程的輸入內容和輸出內容:
如果您列出輸出值區的內容,應該會看到大小經過調整的圖片、經過調整且有浮水印的圖片,以及圖片的標籤:
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
如要再次確認,你可以開啟調整大小後和浮水印的圖片來查看結果:
12. 恭喜
恭喜,您已完成程式碼研究室!
涵蓋內容
- Eventarc 和 Workflows 總覽
- 如何部署 Cloud Functions 服務
- 如何使用 Workflows 自動化調度管理服務
- 如何讓 Workflows 透過 Eventarc 回應 Cloud Storage 事件