使用 Cloud Scheduler 觸發 Cloud Run 工作

1. 總覽

在本實驗室中,您將建立 Cloud Run 工作,並設定 Cloud Scheduler 工作。您將使用設定指令碼部署 Cymbal Eats 菜單服務。您將建立 Cloud Run 工作,以便向 Cymbal Eats 菜單服務發出 API 呼叫。您將使用 Google Cloud CLI 執行工作,並設定工作排程。您可以查看記錄檔,並向 Menu Service 發出 API 呼叫,確認已刪除選單項目,藉此驗證執行作業。

什麼是 Cloud Run 工作?

Cloud Run 工作會執行容器,該容器不會提供網路要求,而是執行營運工作或資料處理作業。容器會執行工作,並在完成後結束。

Cleanup service job

清理服務工作會擷取處於「失敗」狀態的選單項目,並予以刪除。建立新菜單項目時,系統會使用 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

  • 「Project name」是這個專案參與者的顯示名稱。這是 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 中執行下列指令,從 this 存放區複製應用程式程式碼,然後前往含有選單服務的目錄:

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

使用設定指令碼將 Menu 服務部署至 Cloud Run。Menu 服務是採用 Quarkus 架構建構的 Java 程式碼微服務,後端使用 Cloud SQL Postgres 資料庫。您將在後續步驟中建立 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"]

實際的清理指令碼 (如下所列) 包含指令,可取得失敗狀態的選單項目清單,並透過對 Menu 服務的 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

在主控台中查看工作中的「設定」部分,確認是否已設定環境變數:

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 工作

使用 Menu Service 端點查看現有菜單項目及其狀態:

curl ${MENU_SERVICE_URL}/menu | jq

輸出:

您會看到 Ready 狀態中的 3 個選單項目。

將選單項目 #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. 按一下「EXECUTE」(執行) 按鈕,即可從 Cloud Run 工作中執行工作。

229c22288882b5c3.png

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

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

50829ae27b135b2d.png

篩選「deleting」關鍵字的記錄檔,即可找到記錄檔。

d94fb9e444b1c1b8.png

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

curl ${MENU_SERVICE_URL}/menu | jq

輸出:

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

7. 恭喜!

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

課程內容:

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

下一步:

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

清除所用資源

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

刪除專案

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