使用 Cloud Scheduler 觸發 Cloud Run 工作

1. 總覽

在本實驗室中,您將建立 Cloud Run 工作,並設定 Cloud Scheduler 工作。您將使用設定指令碼部署 Cymbal Eats Menu Service。您將建立 Cloud Run 工作,向 Cymbal Eats Menu Service 發出 API 呼叫。您將使用 Google Cloud CLI 執行作業,並為作業設定排程。您將查看記錄並對 Menu Service 進行 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 未使用的字元字串。你隨時可以更新該位置資訊。
  • 專案 ID 在所有 Google Cloud 專案中都是不重複的,而且設定後即無法變更。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

使用設定指令碼將 Menu 服務部署至 Cloud Run。Menu 服務是以 Java 為基礎的微服務,採用 Quarkus 架構建構而成,並使用 Cloud SQL PostgreSQL 資料庫做為後端。您將在後續步驟中建立 Cloud Run 工作,而 Menu 服務是這項工作的執行階段依附元件。

./setup.sh

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

執行上述指令後,請繼續下一個步驟。

3. 探索 Cloud Run 工作程式碼

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

45f480cd1b9a995.png

前往包含清除服務的目錄,然後查看構成工作的檔案:

cd ~/cymbal-eats/cleanup-service

這個目錄中的 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 Eats 菜單服務網址。

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 分頁。執行下列指令來描述 Menu 服務,並將網址儲存至環境變數。這個環境變數將用於設定 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「JOBS」部分,然後查看建立的工作。

按一下工作,然後瀏覽可用的分頁標籤:「HISTORY」(記錄)、「LOGS」(記錄)、「CONFIGURATION」(設定) 和「YAML」。

b12c8e312de3b66.png

在控制台中查看作業的「CONFIGURATION」(設定) 部分,確認環境變數是否已設定:

724c2919d05349c8.png

(選用) 如要變更「Failed Item Age」或「Menu Service URL」變數,請在建立 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
 

切換至「記錄」分頁,查看工作輸出內容。記錄中應會顯示失敗的商品年齡和菜單服務網址。

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 Job 的 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 分鐘。如要刪除菜單項目,該項目必須存在 1 分鐘,這是由 FAILED_ITEM_AGE 參數設定。

您可以等待下次排定的執行時間,或從控制台強制執行工作。

您可以透過使用者介面或指令列,以多種方式觸發工作。

在本範例中,請在 Cloud Shell(選項 3) 中執行指令,觸發工作。

  1. 從「動作」選單中選取「強制執行工作」,即可透過 Cloud Scheduler 執行工作。

6c8cbeae6165ba4a.png

  1. 從「Cloud Run Job」(Cloud Run 工作) 點選「EXECUTE」(執行) 按鈕。

229c22288882b5c3.png

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

前往 Cloud Run JOBS 部分,開啟「LOGS」分頁,確認選單項目已刪除。

50829ae27b135b2d.png

篩選「刪除」關鍵字的記錄,找出相關記錄。

d94fb9e444b1c1b8.png

使用 Menu Service 端點,透過 REST 端點檢查現有菜單項目。

curl ${MENU_SERVICE_URL}/menu | jq

輸出內容:

您會在「Ready」狀態中看到 2 個選單項目。

7. 恭喜!

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

涵蓋內容:

  • 如何建立 Cloud Run 工作
  • 如何執行 Cloud Run 工作
  • 如何建立 Cloud Scheduler 工作
  • 如何驗證工作執行情況

後續步驟:

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

清除所用資源

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

刪除專案

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