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 ジョブを作成する
- アプリケーションのルート ディレクトリに(
app.yaml
と一緒に)cron.yaml
ファイルを作成します。 1 つ以上の
<cron>
エントリをファイルに追加し、必要な<url>
要素と<schedule>
要素などを含めたジョブに必要な要素を定義します。次の例では、毎日 1 回実行される基本的な cron ジョブを作成しています。
cron: - description: "daily summary job" url: /tasks/summary target: beta schedule: every 24 hours
target の指定は任意です。ここではサービス / バージョンの名前を指定します。target の指定がある場合、この文字列がアプリのホスト名の先頭に追加され、ジョブがそのサービス / バージョンにルーティングされるようになります。target が指定されていない場合、ジョブはトラフィック用に構成された
default
サービスのバージョンで実行されます。cron ジョブの URL のハンドラを作成します。ハンドラは、スケジュール設定したタスクをすべて実行します。成功した場合、ハンドラは 200~299 の値の HTTP ステータス コードを返します。他のステータス コードが返された場合は、そのコードを使用して cron ジョブを再試行できます。
開発サーバーで cron ジョブをテストする
ローカルの開発用サーバーでは、cron ジョブは自動的には実行されません。機能をテストするには、cron ジョブの URL に対して直接リクエストを行います。ローカルの cron やスケジュールされたタスクのインターフェースを使用すると、curl や同様のツールでジョブの URL をトリガーできます。
ローカル開発用サーバーの管理インターフェースを使用すると、http://localhost:8000/cron
で cron ジョブを確認できます。
失敗した cron ジョブを再試行する
cron ジョブのリクエスト ハンドラが 200~299 の範囲にないステータス コードを返した場合、App Engine はジョブが失敗したものとみなします。デフォルトでは、503 のステータス コードが返されない限り、失敗したジョブは再試行されません。この場合、成功する、つまり 200~299 のステータス コードが返されるまで 1 分ごとに再試行されます。
失敗したジョブの再試行を設定するには:
cron.yaml
ファイルにretry_parameters
ブロックを追加します。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 ジョブを削除するには:
cron.yaml
ファイルの内容を次のように編集します。cron:
cron.yaml
ファイルを App Engine にデプロイします。
cron 用 URL を保護する
cron ハンドラは、app.yaml
で定義される通常のハンドラです。スケジュールされたタスクで使われる URL にユーザーがアクセスできないようにするには、アクセスを管理者アカウントに限定できます。スケジュール設定されたタスクは、管理者専用の URL にアクセスできます。URL を制限するには、app.yaml
のハンドラ構成に login: admin
を追加します。
たとえば、app.yaml
では次のようになります。
runtime: php55
api_version: 1
handlers:
- url: /report/weekly
script: weekly.php
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 リファレンスをご覧ください。