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 Platform 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 にアクセスできます。app.yaml のハンドラ構成に login: admin を追加することで、URL を制限できます。

たとえば、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 を呼び出せるようにするには、アプリのハンドラで提供されるターゲットへのリクエストを発行し、エンドポイントのクラスとメソッドをハンドラコードから呼び出します。

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

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

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

詳細

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

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Python 2 の App Engine スタンダード環境