App Engine Cron サービスを使用すると、指定した時刻または一定間隔で動作する定期スケジュール タスクを構成できます。これらのタスクは、一般的に cron ジョブと呼ばれています。cron ジョブは App Engine Cron Service によって自動的にトリガーされます。たとえば、cron ジョブを使用して、レポートメールを毎日送信できます。また、キャッシュ データを 10 分ごとに更新する、概要情報を 1 時間に 1 回更新する、などの処理を行うこともできます。
cron ジョブは、cron ジョブが構成されているものと同じアプリ内の指定されたエンドポイントに、スケジュールされた HTTP GET
リクエストを行います。そのエンドポイントのハンドラは、呼び出されたときにロジックを実行します。
App Engine Cron Service を使用して、App Engine ホストアプリ外のウェブ エンドポイントを呼び出すことはできません。ホストアプリ以外のアプリから App Engine エンドポイントを呼び出すために使用することはできません。
cron ジョブ リクエストには、push タスクキューと同じ制限が適用されます。
始める前に
スケジュールをデプロイまたは更新するには、アカウントに次のいずれかの IAM 役割が必要です。
- オーナー
- 編集者
Google Cloud Console の IAM ページで権限を設定できます。
cron ジョブを作成する
- アプリケーションのルート ディレクトリに(
app.yaml
と一緒に)cron.yaml
ファイルを作成します。 1 つ以上の
<cron>
エントリをファイルに追加し、必要な<url>
要素と<schedule>
要素などを含めたジョブに必要な要素を定義します。cron.yaml
ファイルの要素の詳細については、cron.yaml の構文とオプションを確認するをご覧ください。次の例では、毎日 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 ジョブを再試行できます。
web.xml
でのサーブレット URL マッピングは、cron ジョブ URL と同じにする必要があります。開発サーバーで cron ジョブをテストする
ローカルの開発用サーバーでは、cron ジョブは自動的には実行されません。機能をテストするには、cron ジョブの URL に対して直接リクエストを行います。ローカルの cron やスケジュールされたタスクのインターフェースを使用すると、curl や同様のツールでジョブの URL をトリガーできます。
失敗した cron ジョブを再試行する
cron ジョブのリクエスト ハンドラが 200~299 の範囲にないステータス コードを返した場合、App Engine はジョブが失敗したものとみなします。デフォルトでは、503 のステータス コードが返されない限り、失敗したジョブは再試行されません。この場合、成功する、つまり 200~299 のステータス コードが返されるまで 1 分ごとに再試行されます。
失敗したジョブの再試行を設定するには:
cron.yaml
ファイルにretry_parameters
ブロックを追加します。retry_parameters
ブロックで、再試行パラメータを選択して設定します。たとえば、次の
cron.yaml
ファイルの例には、cron ジョブが 1 つあり、再試行を最大 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
Maven
mvn appengine:deployCron cron.yaml
Gradle
gradle appengineDeployCron cron.yaml
IDE
IntelliJ または Eclipse を使用する場合は、デプロイメント フォームを使用して、デプロイ対象の個々の構成ファイルを選択します。
すべての cron ジョブを削除する
すべての cron ジョブを削除するには:
cron.yaml
ファイルの内容を次のように編集します。cron:
cron.yaml
ファイルを App Engine にデプロイします。
cron 用 URL を保護する
cron ハンドラは、app.yaml
で定義される通常のハンドラです。スケジュールされたタスクで使われる URL にユーザーがアクセスできないようにするには、アクセスを管理者アカウントに限定できます。スケジュール設定されたタスクは、管理者専用の URL にアクセスできます。URL を制限するには、app.yaml
のハンドラ構成に login: admin
を追加します。
たとえば、app.yaml
では次のようになります。
application: hello-cron
version: 1
runtime: java
api_version: 1
handlers:
- url: /report/weekly
servlet: mysite.server.CronServlet
login: admin
cron ジョブをテストするには、管理者としてログインし、ブラウザでハンドラの URL にアクセスします。
Cron サービスからのリクエストには、次の HTTP ヘッダーも含まれます。
X-Appengine-Cron: true
X-Appengine-Cron
ヘッダーは、App Engine によって内部で設定されます。リクエスト ハンドラがこのヘッダーを検出した場合、そのリクエストが cron リクエストであると判断できます。アプリへの外部ユーザー リクエストにこのヘッダーが含まれる場合は、削除されます。ただしログイン済みのアプリケーション管理者からのリクエストは例外で、テストの目的でこのヘッダーを設定することを許可されます。
App Engine は、cron リクエストを IP アドレス 0.1.0.2
から発行します。古い gcloud バージョン(326.0.0 より前)で作成された cron ジョブの場合、cron リクエストは 0.1.0.1
から送信されます。
Google Cloud Endpoints を呼び出す
cron ジョブの url
フィールドに Google Cloud Endpoint を指定することはできません。cron ジョブで Google Cloud Endpoints を呼び出せるようにするには、アプリのハンドラで提供されるターゲットへのリクエストを発行し、エンドポイントのクラスとメソッドをハンドラコードから呼び出します。
Google Cloud コンソールで cron ジョブを表示する
スケジュールされた cron ジョブは、Cloud Scheduler の [APP ENGINE の CRON ジョブ] タブで確認できます。
cron ジョブが追加または削除された時期を確認するために、ログを表示することもできます。
詳細
cron ジョブの定義に関する詳細については、cron.yaml リファレンスをご覧ください。