使用 Cloud Scheduler 觸發 Cloud Run 工作

1. 總覽

在這個研究室中,您將建立 Cloud Run 工作並設定 Cloud Scheduler 工作。您將使用設定指令碼部署 Cymbal Eats Menu 服務。您將建立 Cloud Run 工作,向 Cymbal Eats Menu 服務發出 API 呼叫。您將使用 Google Cloud CLI 執行工作,並設定工作排程。您可以查看記錄並向選單服務發出 API 呼叫,確認選單項目是否已刪除,藉此確認執行結果。

什麼是 Cloud Run 工作?

Cloud Run 工作會執行的容器不會處理網路要求,而是執行作業任務或資料處理。容器將執行工作並結束。

清理服務工作

清理服務工作會擷取「失敗」狀態的選單項目並加以刪除。建立新的菜單項目時,可以透過 Vision API 分析圖片,偵測圖片是否為食物品。若是未通過這項驗證的映像檔,選單項目狀態會更新為「失敗」,並由清理工作刪除。

d74200f0bd14d350.png

學習目標

在本研究室中,您將瞭解如何執行下列操作:

  • 建立 Cloud Run 工作
  • 執行 Cloud Run 工作
  • 建立 Cloud Scheduler 工作
  • 驗證工作執行作業

必要條件

  • 本研究室假設您熟悉 Cloud 控制台和殼層環境。
  • 具備使用 Cloud Run 和 Cloud Scheduler 的經驗很有幫助,但並非必要。

2. 設定和需求

Cloud 專案設定

  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,請按一下搜尋列右側的圖示。

eb0157a992f16fa3.png

在 Cloud Shell 中執行下列指令,從「這個」存放區複製應用程式程式碼,然後前往包含選單服務的目錄:

git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service

使用設定指令碼將選單服務部署至 Cloud Run。Menu 服務是採用 Quarkus 架構建構的 Java 微服務,針對後端使用 Cloud SQL Postgres 資料庫。選單服務是您將在下列步驟中建立的 Cloud Run 工作的執行階段依附元件。

./setup.sh

部署作業建立所有必要元件約需 10 分鐘。

執行上述指令後,請繼續進行後續步驟。

3. 探索 Cloud Run 工作程式碼

在 Cloud Shell 中點選加號圖示,開啟新分頁。

45f480cd1b9a995.png

前往包含清理服務的目錄,查看組成工作的檔案:

cd ~/cymbal-eats/cleanup-service

這個目錄中的清理服務含有 Dockerfile,用於定義包含必要依附元件(httpie、jq) 的清理服務工作的容器映像檔。

Dockerfile

FROM ubuntu:latest 
RUN apt-get update && apt-get install -y httpie jq && apt-get clean
COPY script.sh /
RUN chmod +x /script.sh
CMD ["/script.sh"]
ENTRYPOINT ["/bin/bash"]

實際清理指令碼包含的指令,可用於取得失敗狀態的選單項目清單,並向選單服務發出 API 呼叫,藉此刪除選單項目。

script.sh

echo "FAILED_ITEM_AGE=$FAILED_ITEM_AGE"
echo "MENU_SERVICE_URL=$MENU_SERVICE_URL"
# Failed items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/failed | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber) )| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

# Processing items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/processing | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber))| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

請注意下列指令碼相關事項:

  • 系統會在部署期間設定 FAILED_ITEM_AGEMENU_SERVICE_URL 環境變數,並由 Cloud Run 工作傳遞。
  • FAILED_ITEM_AGE - 刪除失敗項目前的分鐘數。
  • MENU_SERVICE_URL - Cymbal 大餐菜單服務網址。

4. 建立 Cloud Run 工作

接著,請建構容器映像檔並發布至 Artifact Registry。

這個容器映像檔可用來建立 Cloud Run 工作。

啟用服務 API:

gcloud services enable \
    run.googleapis.com \
    artifactregistry.googleapis.com \
    cloudscheduler.googleapis.com \
    --quiet

設定環境變數:

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service

建立新的 Artifact Registry 存放區來儲存 Docker 映像檔,以便執行清理工作:

gcloud artifacts repositories create cymbal-eats --repository-format=docker --location=$REGION

使用 Cloud Build 建構容器映像檔,並使用單一指令將其推送至 Artifact Registry:

gcloud builds submit -t $REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest

輸出內容範例:

DURATION: 35S
SOURCE: gs://cymbal-eats-14906-569_cloudbuild/source/1657126400.933586-dc3e91ec85934a55bb6d2f7012611365.tgz
IMAGES: us-east1-docker.pkg.dev/cymbal-eats-14906-569/cymbal-eats/cleanup-service (+1 more)
STATUS: SUCCESS

發布完成後,請前往 Artifact Registry 並查看已發布的映像檔:

fb95ae38baa7c543.png

切換回第二個 Cloud Shell 分頁。執行下列指令來描述菜單服務,並將網址儲存至環境變數。這個環境變數會用來設定 Cloud Run 工作。

MENU_SERVICE_URL=$(gcloud run services describe $MENU_SERVICE_NAME \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")

建立 Cloud Run 工作,清除超過 1 分鐘的失敗選單項目 [由 FAILED_ITEM_AGE 設定]。

gcloud beta run jobs create cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

輸出內容範例:

Creating Cloud Run job [cleanup-service] in project [cymbal-eats] region [us-east1]
OK Creating job... Done.
Done.
Job [cleanup-service] has successfully been created.

前往控制台的 Cloud Run 工作專區,查看已建立的工作。

點選工作,然後查看可用分頁:「記錄」、「記錄」、「設定」和「YAML」。

b12c8e312de3b66.png

在主控台中查看工作的 CONFIGURATION 區段,確認環境變數已設定:

724c2919d05349c8.png

(選用) Cloud Run 工作建立完成後,如果您想變更失敗項目存在時間或選單服務的網址變數,可以使用更新指令:

gcloud beta run jobs update cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

如要驗證工作,請執行下列指令來執行 Cloud Run 工作:

gcloud beta run jobs execute cleanup-service --region=$REGION

輸出內容範例:

OK Creating execution... Done.                                   
  OK Provisioning resources...
Done.
Execution [cleanup-service-rlxs4] has successfully started running.

View details about this execution by running:
gcloud beta run jobs executions describe cleanup-service-rlxs4
 

切換至「LOGS」(記錄) 分頁,查看工作的輸出內容。您應該會在記錄中看到「失敗的項目年齡」與「菜單服務」網址。

518cb00036a2561f.png

5. 設定 Cloud Run 工作的排程

Cloud Scheduler 是全代管的企業級 Cron 工作排程器。無論是批次處理、大數據工作,還是雲端基礎架構的相關作業等,幾乎所有工作都能排程。

使用 Cloud Scheduler 工作時,其中一項安全性最佳做法是使用個別憑證執行每項工作。在這個步驟中,系統會建立用於清除排程器工作的服務帳戶。

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

Cloud Scheduler 工作需要權限,才能呼叫 Cloud Run 工作。

Cloud Run Invoker 角色授予在 Cloud Scheduler 工作中使用的服務帳戶:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member="serviceAccount:${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/run.invoker"

接下來,請設定執行清理服務工作的時間表。

Cloud Scheduler 有多個目標類型

  • HTTP
  • Pub/Sub
  • App Engine HTTP

您將使用 HTTP 目標類型建立排程器工作。

為了進行示範,您可以將測試頻率設為每 5 分鐘執行一次。

gcloud scheduler jobs create http cleanup-schedule \
    --location $REGION \
    --schedule="*/5 * * * *" \
    --uri="https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/cleanup-service:run" \
    --http-method POST \
    --oauth-service-account-email ${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com

查看用於呼叫 Cloud Run 工作的 uri 參數:

  • REGIONPROJECT_ID - 已部署清理服務工作的 Cloud Run 區域和專案 ID
  • cleanup-service - Cloud Run 工作名稱

前往控制台中的「Cloud Scheduler」,查看已建立的排程器工作:

3bc9120df7fc6ed.png

查看「動作」選單下方的可用選項。

7945908025dd2f2b.png

6. 測試 Cloud Run 工作

使用選單服務端點,查看現有的選單項目及其狀態:

curl ${MENU_SERVICE_URL}/menu | jq

輸出:

您會看到 3 個選單項目處於 Ready 狀態。

將選單項目 #1 的狀態變更為「Failed」:

curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Failed"}' | jq

等待 1 分鐘。如 FAILED_ITEM_AGE 參數的設定,選單項目已存在超過 1 分鐘才會刪除。

您可以等待下一次排定的執行作業,或是透過控制台強制執行工作。

您可以透過 UI 或指令列觸發工作的方法有很多種。

在這個範例中,在 Cloud Shell(選項 #3) 中執行指令即可觸發工作。

  1. Cloud Scheduler 選取「強制執行工作」使用「動作」選單

6c8cbeae6165ba4a.png

  1. 在「Cloud Run Job」中按一下「EXECUTE」按鈕。

229c22288882b5c3.png

  1. 透過在 Cloud Shell 執行下列指令:
gcloud beta run jobs execute cleanup-service --region=$REGION

前往 Cloud Run 工作專區,開啟「LOGS」(記錄) 分頁標籤,確認選單項目已刪除。

50829ae27b135b2d.png

篩選記錄並「刪除」才能找到記錄。

d94fb9e444b1c1b8.png

使用選單服務端點,透過 REST 端點查看現有的選單項目。

curl ${MENU_SERVICE_URL}/menu | jq

輸出:

您會看到 2 個選單項目處於 Ready 狀態。

7. 恭喜!

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

本文涵蓋的內容:

  • 如何建立 Cloud Run 工作
  • 如何執行 Cloud Run 工作
  • 如何建立 Cloud Scheduler 工作
  • 如何確認工作執行作業

下一步:

探索其他 Cymbal Eats 程式碼研究室:

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

刪除專案

如要避免付費,最簡單的方法就是刪除您針對教學課程建立的專案。