依排程執行服務

您可以使用 Cloud Scheduler,按照時間表安全地觸發 Cloud Run 服務,使用方式則與 Cron 工作相近。

可能的用途包括:

  • 按時執行備份
  • 執行定期管理工作,例如:
    • 重新產生 Sitemap
    • 刪除舊資料、內容、設定或修訂版本
    • 在資料系統之間同步處理內容
    • 處理每日電子郵件通知
    • 驗證及回報下游服務的存取權
  • 產生帳單等文件

本頁面說明如何在同一項 Google Cloud 專案中,安全地搭配使用 Cloud Scheduler 與 Cloud Run。

事前準備

在您使用的專案中啟用 Cloud Scheduler API

建立及部署服務

如要建立及部署:

  1. 在服務中實作要依排程執行的工作。

  2. 請注意,服務預期從哪種要求類型接收工作要求,例如 GETPOST。建立會叫用服務的排程工作時,您必須指定相符的 HTTP 方法。

  3. 部署您在 Cloud Scheduler 中使用的服務時,請務必「不」允許未經驗證的叫用作業。

以下範例說明如何使用 Terraform 部署 Cloud Run 服務:

resource "google_cloud_run_v2_service" "default" {
  name     = "my-scheduled-service"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
  }

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.run_api
  ]
}

us-docker.pkg.dev/cloudrun/container/hello 替換為您自己的容器映像檔參照。

為 Cloud Scheduler 建立服務帳戶

您需要建立服務帳戶來與 Cloud Scheduler 建立關聯,並授予該服務帳戶叫用 Cloud Run 服務的權限。您可以使用現有的服務帳戶代表 Cloud Scheduler,也可以建立新的服務帳戶。

如要建立服務帳戶並授予其叫用 Cloud Run 服務的權限,請按照下列步驟操作:

控制台

  1. 前往 Google Cloud 控制台的「Service Accounts」頁面。

    前往「Service Accounts」(服務帳戶)

  2. 選取專案。

  3. 輸入要顯示在 Google Cloud 控制台的服務帳戶名稱。

    Google Cloud 控制台會根據這個名稱產生服務帳戶 ID。請視需要編輯 ID,ID 設定後即無法變更。

  4. 選用:輸入服務帳戶的說明。

  5. 按一下「建立並繼續」

  6. 選用步驟:按一下「請選擇角色」欄位。

  7. 依序選取「Cloud Run」 >「Cloud Run 叫用者」

  8. 按一下 [完成]

指令列

  1. 建立服務帳戶:

    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
       --display-name "DISPLAYED_SERVICE_ACCOUNT_NAME"

    取代

    • SERVICE_ACCOUNT_NAME小寫名稱,且名稱在 Google Cloud 專案中不重複,例如 my-invoker-service-account-name
    • DISPLAYED_SERVICE_ACCOUNT_NAME 與您要為此服務帳戶顯示的名稱,例如在控制台中顯示的名稱,例如 My Invoker Service Account
  2. 若您使用 Cloud Run,請授予服務帳戶的權限,以便叫用您的服務:

    gcloud run services add-iam-policy-binding SERVICE \
       --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --role=roles/run.invoker

    取代

    • SERVICE 與您希望 Cloud Scheduler 叫用的服務名稱。
    • SERVICE_ACCOUNT_NAME 改為服務帳戶名稱。
    • PROJECT_ID 改成您的 Google Cloud 專案 ID。
  3. 將專案存取權授予服務帳戶,讓服務帳戶有權限對專案中的資源完成特定動作:

    gcloud projects add-iam-policy-binding RESOURCE_ID \
       --member=PRINCIPAL --role=roles/run.invoker

    取代

    • RESOURCE_ID:您的 Google Cloud 專案 ID。

    • PRINCIPAL:主要對象或成員的 ID,通常為以下格式:PRINCIPAL_TYPE:ID。例如 user:my-user@example.com。如需 PRINCIPAL 可用的完整值清單,請參閱 政策繫結參考資料

Terraform

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

如要使用 Terraform 建立服務帳戶,請按照下列指示操作:

resource "google_service_account" "default" {
  account_id   = "scheduler-sa"
  description  = "Cloud Scheduler service account; used to trigger scheduled Cloud Run jobs."
  display_name = "scheduler-sa"

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.iam_api
  ]
}

resource "google_cloud_run_service_iam_member" "default" {
  location = google_cloud_run_v2_service.default.location
  service  = google_cloud_run_v2_service.default.name
  role     = "roles/run.invoker"
  member   = "serviceAccount:${google_service_account.default.email}"
}

建立 Cloud Scheduler 工作

您必須建立工作,才能在指定時間叫用服務。您可以使用主控台或指令列:

您可以使用主控台或 gcloud 指令列建立工作。按一下適當的分頁標籤:

主控台

  1. 前往「Cloud Scheduler」主控台頁面。

    前往 Cloud Scheduler

  2. 按一下「Create job」(建立工作)

    螢幕截圖

  3. 提供工作名稱。

  4. 使用設定字串指定頻率或工作間隔,工作將會按照這個頻率執行。例如,0 */3 * * * 字串每隔 3 小時會執行一次工作。您在這裡提供的字串可以是任何與 crontab 相容的字串。

    詳情請參閱設定工作時間表一文。

  5. 從下拉式清單中選擇工作頻率要使用的時區。

  6. HTTP 指定為目標:

    1. 指定服務的完整網址,例如 https://myservice-abcdef-uc.a.run.app。工作會將要求傳送至這個網址。

    2. 指定 HTTP 方法:方法必須符合先前部署的 Cloud Run 服務所預期的。預設值為 POST

    3. 或者指定要傳送至目標的資料。如果選擇 POSTPUT HTTP 方法,這個資料會在要求主體中傳送。

    4. 按一下「更多」即可顯示驗證設定。

    5. 在下拉式選單中選取「Add OIDC token」

    6. 在「服務帳戶」欄位中,複製先前建立的服務帳戶的服務帳戶電子郵件地址。

    7. 在「Audience」欄位中,複製服務的完整網址。

  7. 按一下「建立」即可建立並儲存工作。

指令列

您必須使用 OIDC 驗證機制,才能透過 Cloud Scheduler 存取經過驗證的 Cloud Run 服務。OIDC 驗證包含服務帳戶和目標對象標記。詳情請參閱「為 HTTP 目標使用驗證」。

如要建立 Cloud Scheduler 工作,請按照下列步驟操作:

gcloud scheduler jobs create http test-job --schedule "5 * * * *" 
--http-method=HTTP-METHOD
--uri=SERVICE-URL
--oidc-service-account-email=SERVICE-ACCOUNT-EMAIL
--oidc-token-audience=SERVICE-URL

取代

  • HTTP-METHOD 與 HTTP 方法 (例如 GET、POST、PUT 等)。
  • SERVICE-URL 改為您的服務網址。
  • SERVICE-ACCOUNT-EMAIL 換成服務帳戶電子郵件地址。

Terraform

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

如要為 Cloud Run 服務建立 Cloud Scheduler 工作,請按照下列步驟操作:

resource "google_cloud_scheduler_job" "default" {
  name             = "scheduled-cloud-run-job"
  region           = "us-central1"
  description      = "Invoke a Cloud Run container on a schedule."
  schedule         = "*/8 * * * *"
  time_zone        = "America/New_York"
  attempt_deadline = "320s"

  retry_config {
    retry_count = 1
  }

  http_target {
    http_method = "POST"
    uri         = google_cloud_run_v2_service.default.uri

    oidc_token {
      service_account_email = google_service_account.default.email
    }
  }

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.scheduler_api
  ]
}

Cloud Run 服務會在您定義的頻率,透過 Cloud Scheduler 工作要求觸發。您可以查看這項服務的記錄,確認及監控這項情況。

後續步驟