Python 2 は、コミュニティでサポートを終了しました。Python 2 アプリを Python 3 に移行することをおすすめします。

Python 2 用 cron によるタスクのスケジューリング

App Engine Cron サービスを使用すると、指定した時刻または一定間隔で動作する定期スケジュール タスクを構成できます。これらのタスクは、一般的に cron ジョブと呼ばれます。cron ジョブは App Engine Cron サービスによって自動的にトリガーされます。たとえば cron ジョブを使用して、レポートメールを毎日送信したり、キャッシュ データを 10 分ごとに更新したり、概要情報を 1 時間に 1 回更新したりすることができます。

cron ジョブは、スケジュールされたとおりに URL に対して HTTP GET リクエストを行います。その URL のハンドラは、呼び出されたときにロジックを実行します。 cron ジョブ リクエストには、push タスクキューと同じ制限が適用されます。

始める前に

スケジュールをデプロイまたは更新するには、アカウントに次のいずれかの IAM 役割が必要です。

  • オーナー
  • 編集者

Google Cloud Console の IAM ページで権限を設定できます。

cron ジョブを作成する

  1. アプリケーションのルート ディレクトリに(app.yaml と一緒に)cron.yaml ファイルを作成します。
  2. 1 つ以上の <cron> エントリをファイルに追加し、必要な <url> 要素と <schedule> 要素などを含めたジョブに必要な要素を定義します。

    次の例では、毎日 1 回実行される基本的な cron ジョブを作成しています。

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

    target の指定はオプションです。ここではサービス / バージョンの名前を指定します。 target の指定がある場合、この文字列がアプリのホスト名の先頭に追加され、ジョブがそのサービス / バージョンにルーティングされるようになります。 target が指定されていない場合、ジョブはトラフィック用に構成された default サービスのバージョンで実行されます。

  3. cron ジョブの URL のハンドラを作成します。ハンドラは、スケジュール設定したタスクをすべて実行します。成功した場合、ハンドラは 200~299 の値の HTTP ステータス コードを返します。他のステータス コードが返された場合は、そのコードを使用して cron ジョブを再試行できます。

cron.yaml の構文とオプションの詳細については、こちらをご覧ください

開発サーバーで cron ジョブをテストする

ローカルの開発用サーバーでは、cron ジョブは自動的には実行されません。機能をテストするには、cron ジョブの URL に対して直接リクエストを行います。ローカルの cron やスケジュールされたタスクのインターフェースを使用すると、curl や同様のツールでジョブの URL をトリガーできます。

ローカル開発用サーバーの管理インターフェースを使用すれば、http://localhost:8000/cron で cron ジョブを確認できます。

失敗した cron ジョブを再試行する

cron ジョブのリクエスト ハンドラが 200~299 の範囲にないステータス コードを返した場合、App Engine はジョブが失敗したものとみなします。デフォルトでは、503 のステータス コードが返されない限り、失敗したジョブは再試行されません。この場合、成功する、つまり 200~299 のステータス コードが返されるまで 1 分ごとに再試行されます。

失敗したジョブの再試行を設定するには:

  1. cron.yaml ファイルの retry_parameters ブロックを追加します。
  2. retry_parameters ブロックで、再試行パラメータを選択して設定します。

    たとえば、以下の cron.yaml ファイルの例には 1 つの cron ジョブがあります。このジョブは再試行を最大で 5 回(デフォルト)実行するよう構成されています。バックオフの初期値は 2.5 秒で、試行ごとに 2 倍になります。

    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

gcloud app deploy cron.yaml

appcfg

元の App Engine SDK を使用している場合は、次のコマンドを実行します。

appcfg.py update_cron [YOUR_APP_DIR]

すべての cron ジョブを削除する

すべての cron ジョブを削除するには:

  1. cron.yaml ファイルの内容を次のように編集します。

    cron:
    
  2. cron.yaml ファイルを App Engine にデプロイします。

cron 用 URL を保護する

cron ハンドラは、app.yaml で定義される通常のハンドラです。スケジュールされたタスクで使われる URL にユーザーがアクセスできないようにするには、アクセスを管理者アカウントに限定できます。スケジュール設定されたタスクは、管理者専用の URL にアクセスできます。URL を制限するには、app.yaml のハンドラ構成に login: admin を追加します。

たとえば、app.yaml では次のようになります。

runtime: python27
api_version: 1

handlers:
- url: /report/weekly
  script: reports.app
  login: admin
詳細については、app.yaml リファレンスでログインまたは管理状態の要求方法についての説明をご覧ください。

cron ジョブをテストするには、管理者としてログインし、ブラウザでハンドラの URL にアクセスします。

Cron サービスからのリクエストには、次の HTTP ヘッダーも含まれます。

X-Appengine-Cron: true

X-Appengine-Cron ヘッダーは、Google App Engine によって内部で設定されています。リクエスト ハンドラがこのヘッダーを検出した場合、そのリクエストが cron リクエストであると判断できます。アプリケーションへの外部ユーザー リクエストにこのヘッダーが含まれる場合は、削除されます。ただしログイン済みのアプリケーション管理者からのリクエストは例外で、テストの目的でこのヘッダーを設定することを許可されます。

Google App Engine は cron リクエストを IP アドレス 0.1.0.1 から発行します。

Google Cloud Endpoints を呼び出す

cron ジョブの url フィールドに Google Cloud Endpoint を指定することはできません。cron ジョブで Google Cloud Endpoints を呼び出せるようにするには、アプリのハンドラで提供されるターゲットへのリクエストを発行し、エンドポイントのクラスとメソッドをハンドラコードから呼び出します。

Cloud Console で cron ジョブを表示する

スケジュールされた cron ジョブは、Cloud Console の [cron ジョブ] ページで確認できます。

cron ジョブが追加または削除された時期を確認するために、ログを表示することもできます。

詳細

cron ジョブの定義に関する詳細については、cron.yaml リファレンスをご覧ください。