使用 Python 2 版 Cron 安排工作時間表

您可以透過 App Engine Cron 服務安排依定義的次數或規律間隔定期運作的工作。通常稱為「Cron 工作」。是由 App Engine Cron Service 自動觸發。舉例來說,您可以使用 Cron 工作每天傳送一次電子郵件報表,或是每 10 分鐘更新某些快取資料,也可以每小時重新整理一次摘要資訊。

Cron 工作會按照排程對已設定 Cron 工作所在應用程式中的指定端點發出 HTTP GET 要求。該端點的處理常式會在收到呼叫時執行邏輯。

App Engine Cron 服務無法用於呼叫 App Engine 主機應用程式以外的網頁端點。此外,也無法用於呼叫主機應用程式以外的其他應用程式 App Engine 端點。

Cron 工作要求和推送工作佇列遵循一樣的限制。

事前準備

如要部署或更新排程,您的帳戶需要下列其中一種 IAM 角色:

  • 擁有者
  • 編輯者

您可以在 Google Cloud 控制台的「IAM」頁面中設定權限。

建立 Cron 工作

  1. 在應用程式的根目錄中建立 cron.yaml 檔案 (以及 app.yaml)。
  2. 在檔案中新增一或多個 <cron> 項目,然後定義工作的必要元素 (包括不可或缺的 <url><schedule> 元素)。如要進一步瞭解 cron.yaml 檔案的元素,請查看 cron.yaml 語法和選項

    以下範例會建立一個每天執行的基本 Cron 工作:

    cron:
    - description: "daily summary job"
      url: /tasks/summary
      target: beta
      schedule: every 24 hours
    

    目標規格是服務/版本的名稱,填或不填均可。如果指定目標,就會在應用程式的主機名稱前面加上目標,將工作轉送到該服務/版本。如不指定目標,則這項工作會在已經完成流量設定的 default 服務版本中執行。

  3. 建立 Cron 工作網址的處理常式。此處理常式應執行您要排程的任何工作。並回應代表成功的 HTTP 狀態碼,這個狀態碼介於 200 和 299 (含首尾) 之間。可能會傳回其他狀態碼,也可以使用這些狀態碼重試 Cron 工作

在開發伺服器中測試 Cron 工作

本機開發伺服器不會自動執行您的 Cron 工作。您可以直接對 Cron 工作的網址發出要求以測試功能。您可以使用 curl 或類似的工具,以本機 Cron 或排程工作的介面觸發工作網址。

您可以使用本機開發伺服器的管理員介面,在 http://localhost:8000/cron 中查看 Cron 工作。

重試失敗的 Cron 工作

如果 Cron 工作要求處理常式傳回的 HTTP 狀態碼不在 200–299 (含首尾) 範圍內,則 App Engine 會將工作視為失敗。根據預設,除非傳回的狀態代碼是 503,否則一律不重試失敗的工作,若傳回 503,則會每分鐘重試一次,直到工作成功或傳回介於 200-299 這個範圍內的狀態代碼。

如要設定重試失敗的工作:

  1. cron.yaml 檔案中加入 retry_parameters 區塊。
  2. retry_parameters 區塊中選擇並設定重試參數

    例如,以下 cron.yaml 範例檔包含一項 Cron 工作,這項工作的設定是最多重試五次 (預設值),開始輪詢時間是 2.5 秒,每次加倍。

    cron:
    - description: "retry demo"
      url: /retry
      schedule: every 10 mins
      retry_parameters:
        min_backoff_seconds: 2.5
        max_doublings: 5
    

深入瞭解 Cron 重試選項。

部署 Cron 工作

如要部署 cron.yaml 設定檔中指定的 Cron 工作,請執行以下指令:

gcloud app deploy cron.yaml

刪除所有 Cron 工作

如要刪除所有 Cron 工作:

  1. cron.yaml 檔案的內容編輯為:

    cron:
    
  2. cron.yaml 檔案部署至 App Engine。

設定 Cron 網址安全性

Cron 處理常式單純是在 app.yaml 中定義的一般處理常式。如要避免使用者存取排程工作所使用的網址,可以限制只有管理員帳戶才有存取權。已排程工作可以存取只限管理員存取的網址。您可以在 app.yaml 的處理常式設定中新增 login: admin,藉此限制網址。

app.yaml 中的範例可能會像這樣:

runtime: python27
api_version: 1

handlers:
- url: /report/weekly
  script: reports.app
  login: admin
詳情請參閱 app.yaml 參考資料,瞭解如何要求登入或管理員狀態。

如要測試 Cron 工作,請以管理員身分登入,並透過瀏覽器造訪處理常式的網址。

來自 Cron 服務的要求也會包含 HTTP 標頭:

X-Appengine-Cron: true

X-Appengine-Cron 標頭是由 App Engine 在內部設定的。若您的要求處理常式找到這個標頭,處理常式即可信任這項要求是 Cron 要求。若外部使用者對應用程式發出的要求出現此標頭,將會移除此標頭,除非這是應用程式登入管理員發出的要求,因為只有登入管理員能夠針對測試目的設定標頭。

App Engine 會從 IP 位址 0.1.0.2 發出 Cron 要求。如果是使用舊版 gcloud (326.0.0 之前的版本) 建立的 Cron 工作,Cron 要求會來自 0.1.0.1

呼叫 Google Cloud Endpoints

您無法在 Cron 工作的 url 欄位中指定 Google Cloud 端點。如果要讓 Cron 工作呼叫 Google Cloud 端點,請針對應用程式中由處理常式提供的目標發出要求,並使用處理常式程式碼呼叫端點類別及方法。

在 Google Cloud 控制台中查看 Cron 工作

您可以在 Cloud SchedulerApp Engine Cron 工作分頁中查看已排程的 Cron 工作。

您也可以在記錄頁面查看之前新增或移除 Cron 工作的時間。

瞭解詳情

如要進一步瞭解如何定義 Cron 工作,請參閱 cron.yaml 參考資料