アプリケーションにスケジュール設定されるタスクを定義するには、cron.yaml
ファイルを使用します。
cron ジョブをテスト、デプロイ、削除する方法など、スケジュール設定タスクの詳細については、cron を使用してタスクのスケジュールを設定するをご覧ください。
例
cron.yaml
ファイルの例を次に示します。
cron:
- description: "daily summary job"
url: /tasks/summary
schedule: every 24 hours
- description: "monday morning mailout"
url: /mail/weekly
schedule: every monday 09:00
timezone: Australia/NSW
- description: "new daily summary job"
url: /tasks/summary
schedule: every 24 hours
target: beta
構文
cron.yaml
ファイルは、app.yaml
とともに、アプリケーションのルート ディレクトリにあります。cron.yaml
は、Java 8 アプリケーションのスケジュール タスクを構成します。
cron ジョブの定義
要素 | 説明 |
---|---|
description |
省略可。description は、Google Cloud コンソールと開発用サーバーの管理インターフェースに表示されます。 |
retry_parameters |
省略可。cron ジョブのリクエスト ハンドラが 200 未満、299 超の HTTP ステータス コードを返した場合、App Engine はジョブが失敗したものとみなします。デフォルトでは、失敗したジョブは再試行されません。構成ファイルに retry_parameters ブロックを追加すると、失敗したジョブを再試行するようにできます。 詳しくは、cron の再試行をご覧ください。 |
schedule |
必須。cron ジョブをいつ実行するかのスケジュールを定義します。以下の構文をご覧ください。 |
target |
|
timezone |
timezone は、標準の zoneinfo タイムゾーン名です。タイムゾーンを指定しない場合、ジョブは UTC(GMT)で実行されます。
|
url |
必須。url フィールドには、アプリケーション内の URL を指定します。この url 要素に XML 特殊文字(& 、< 、> 、' 、" )を使用する場合は、その文字をエスケープする必要があります。
|
cron ジョブの schedule
を定義する
cron ジョブは、一定の間隔で反復するようにスケジュールされ、英語に似た単純な構文で指定されます。スケジュールは、ジョブを 1 日に複数回実行するようにも、特定の月の特定の日付に実行するようにも定義できます。
- 1 日以内の間隔
反復するスケジュールでジョブを 1 日に複数回実行するには、1 日以内の間隔を使用します。その場合、終了時刻の間隔または開始時刻の間隔を定義できます。
終了時刻の間隔: ジョブの「終了時刻」から次のジョブが開始されるまでの時間を定義します。「終了時刻」とは、ジョブが完了した時刻またはタイムアウトした時刻のことです。この種の間隔の場合、Cron サービスでは、
00:00
を起点として 1 日 24 時間を通してジョブが実行され、各ジョブ間は指定された期間だけ待機します。例:
every 5 minutes
というスケジュールの場合、ジョブは毎日 5 分間隔で実行されます。たとえば、このスケジュールに従って実行されているジョブのインスタンスが 02:01 に完了したとすると、次回のジョブは 5 分間待機して 02:06 に開始されます。開始時刻の間隔: cron サービスによって各ジョブが開始される一定の時間間隔を定義します。終了時刻の間隔とは異なり、開始時刻の間隔では、前のジョブが完了またはタイムアウトした時刻に関係なく各ジョブが実行されます。ジョブを実行する時間範囲を設定することも、
00:00
から 1 日 24 時間、ジョブを実行するように設定することもできます。ジョブの開始時刻が厳密に決まっているので、ジョブ インスタンスの実行時間が定義された時間間隔よりも長くなった場合、cron サービスはジョブをスキップすることがあります。つまり、前のジョブが完了もタイムアウトもしなかった場合、その時間の範囲に含まれる開始時刻はスキップされます。
例:
every 5 minutes from 10:00 to 14:00
というスケジュールの場合、最初のジョブは10:00
に開始され、以後 5 分おきにジョブが実行されます。ただし、最初のジョブの実行に 7 分かかったとすると、10:05
のジョブはスキップされ、cron サービスは10:10
までこのジョブの次のインスタンスを実行しません。
- カスタムの間隔
カスタムの間隔を使用してスケジュールを定義することもできます。この場合、1 つ以上の日付と 1 つ以上の月を選択してジョブを 1 日に 1 回実行できます。カスタムの間隔のスケジュールに従って実行されるジョブは、年間を通じて、選択した日付および月の特定の時刻にのみ実行されます。
例:
1,2,3 of month 07:00
というスケジュールの場合、各月の 1~3 日の07:00
に 1 回ジョブが実行されます。
schedule
に関する重要な考慮事項:
- 設定する間隔を、1 日以内の間隔とカスタムの間隔のどちらにするかを決める必要があります。タイプの異なる間隔の要素を組み合わせて使用することはできません。たとえば、
<schedule>every 6 hours mon,wed,fri</schedule>
というスケジュールの定義は無効です。 - ある時点で実行するジョブのインスタンスは 1 つのみにする必要があります。cron サービスは、「少なくとも 1 回」を基本に処理を行うよう設計されています。つまり、ジョブがスケジュールされると、App Engine はそのジョブのリクエストを少なくとも 1 回は送信します。まれに、同じジョブの複数のインスタンスがリクエストされる可能性があるため、使用するリクエスト ハンドラはべき等性を備えていること、また、そのような状況が発生した場合にも有害な副作用がないようにコードを記述することが大切です。
schedule
の書式
ジョブが実行される時期を指定するには、以下の構文を使用して schedule
要素を定義する必要があります。
<schedule>[TYPE] [INTERVAL_VALUE] [INTERVAL_SCOPE]</schedule>
間隔のタイプを選択して、schedule
要素を定義します。
- [TYPE]: 毎日実行する間隔には
every
接頭辞を含める必要があります。例:
<schedule>every 12 hours</schedule>
- [INTERVAL_VALUE]: 整数値とそれに対応する時間の単位。有効な時間の単位は次のとおりです。
minutes
またはmins
hours
- [INTERVAL_SCOPE]: 該当しません。ジョブを実行する特定の開始時刻または時間範囲を設定するには、開始時刻の間隔またはカスタムの間隔の構文をご覧ください。
- 終了時刻の間隔の例
- 終了時刻の間隔を使用するジョブのスケジュールの定義方法の理解には、以下の例が参考になります。
- 毎日 00:00 に実行を開始し、次回のジョブ実行まで 5 分間待機する場合。各ジョブが終了すると、cron サービスは 5 分間待機してから次のジョブを実行します。
<schedule>every 5 minutes</schedule>
- 毎日 00:00 に実行を開始し、次回のジョブ実行まで 30 分間待機する場合。各ジョブが終了すると、cron サービスは 30 分間待機してから次のジョブを実行します。
<schedule>every 30 mins</schedule>
- 毎日 00:00 に実行を開始し、次回のジョブ実行まで 5 分間待機する場合。各ジョブが終了すると、cron サービスは 5 分間待機してから次のジョブを実行します。
- [TYPE]: 毎日実行する間隔には
every
接頭辞を含める必要があります。例:
<schedule>every 12 hours</schedule>
- [INTERVAL_VALUE]: 整数値とそれに対応する時間の単位。有効な時間の単位は次のとおりです。
minutes
またはmins
hours
- [INTERVAL_SCOPE]: [INTERVAL_VALUE] に対応する句を指定します。カスタム時間範囲を定義するか、24 時間の
synchronized
オプションを使用できます。from [HH:MM] to [HH:MM]
句を含めて、ジョブを実行する特定の開始時刻と範囲を定義します。時刻の値を 24 時間形式の
HH:MM
で指定します。ここで、HH
は00
から23
までの整数です。MM
は00
から59
までの整数です。
- 24 時間の時間範囲(
from 00:00 to 23:59
)を指定し、それを [INTERVAL_VALUE] の値で均等に分割する場合は、synchronized
を使用します。重要: [INTERVAL_VALUE] に指定する値は 24 の約数でなければなりません。そうでないと、エラーが発生します。つまり [INTERVAL_VALUE] の有効な値は、
1
、2
、3
、4
、6
、8
、12
、24
です。
- 開始時刻の間隔の例
- 開始時刻の間隔を使用してジョブのスケジュールを定義する場合は、以下の例を参考にしてください。
- 毎日 10:00~14:00 に 5 分間隔で実行する:
<schedule>every 5 minutes from 10:00 to 14:00</schedule>
- 毎日 08:00~16:00 に 1 時間ごとに実行する:
<schedule>every 1 hours from 08:00 to 16:00</schedule>
- 毎日 00:00 を起点として 2 時間ごとに実行する:
<schedule>every 2 hours synchronized</schedule>
- 毎日 10:00~14:00 に 5 分間隔で実行する:
- [TYPE]: カスタムの間隔では、
every
接頭辞を含めて繰り返しの間隔を定義するか、月の日付の明細リストを定義できます。- 繰り返しの間隔を定義するには、
every
接頭辞を使用します。例:
<schedule>every day 00:00</schedule> <schedule>every monday 09:00</schedule>
- 具体的な日付を定義する場合は、序数を使用する必要があります。有効な値は、月の初日からその月の最終日を表す値までです。たとえば、次のようになります。
1st
またはfirst
2nd
またはsecond
3rd
またはthird
- 最大値:
31st
またはthirtyfirst
例:
<schedule>1st,3rd tuesday</schedule> <schedule>2nd,third wednesday of month 09:00</schedule>
- 繰り返しの間隔を定義するには、
- [INTERVAL_VALUE]: カスタムの間隔には、ジョブを実行する具体的な日付や曜日を含めることができます。リストはカンマ区切りで定義する必要があり、以下のいずれかの値を含めることができます。
- その月の日付を表す整数値で、最大 31 日まで。たとえば、次のようになります。
1
2
3
- 最大
31
- 曜日名を表す次の長い名前または短縮形の任意の組み合わせ:
monday
またはmon
tuesday
またはtue
wednesday
またはwed
thursday
またはthu
friday
またはfri
saturday
またはsat
sunday
またはsun
- すべての曜日を指定するには、
day
を使用します。
例:
<schedule>2nd monday,thu</schedule> <schedule>1,8,15,22 of month 09:00</schedule> <schedule>1st mon,wednesday,thu of sep,oct,nov 17:00</schedule>
- その月の日付を表す整数値で、最大 31 日まで。たとえば、次のようになります。
- [INTERVAL_SCOPE]: 指定した [INTERVAL_VALUE] に対応する句を指定します。カスタムの間隔には、年内の特定のひと月または複数の月のカンマ区切りのリストを指定する
of [MONTH]
句を指定できます。また、ジョブを実行する具体的な時刻をof [MONTH] [HH:MM]
のように定義する必要があります。of
句を省略した場合のデフォルトでは、カスタムの間隔は毎月実行されます。- [MONTH]: 複数月はカンマ区切りのリストで指定します。月の値には以下の長い名前と短縮形を混在させることができます。
january
またはjan
february
またはfeb
march
またはmar
april
またはapr
may
june
またはjun
july
またはjul
august
またはaug
september
またはsep
october
またはoct
november
またはnov
december
またはdec
- すべての月を指定するには、
month
を使用します。
- [HH:MM]: 時刻の値を 24 時間形式の
HH:MM
で指定する必要があります。HH
は00
から23
までの整数です。MM
は00
から59
までの整数です。
例:
<schedule>1st monday of sep,oct,nov 09:00</schedule> <schedule>1 of jan,april,july,oct 00:00</schedule>
- [MONTH]: 複数月はカンマ区切りのリストで指定します。月の値には以下の長い名前と短縮形を混在させることができます。
- カスタムの間隔の例
- カスタムの間隔を使用してジョブのスケジュールを定義する場合は、以下の例を参考にしてください。
- 毎日 00:00 に実行する:
<schedule>every day 00:00</schedule>
- 毎週月曜日の 09:00 に実行する:
<schedule>every monday 09:00</schedule>
- 3 月の第 2 水曜日の 17:00 に 1 回だけ実行する:
<schedule>2nd wednesday of march 17:00</schedule>
- 5 月の最初の 2 週の月曜日、水曜日、金曜日の 10:00 に 1 回ずつ、つまり合計で 6 回実行する:
<schedule>1st,second mon,wed,fri of may 10:00</schedule>
- 1 週間に 1 回実行する。毎月 1 日を起点として 7 日ごとの 09:00 に 1 回実行する:
<schedule>1,8,15,22 of month 09:00</schedule>
- 隔週で実行する。毎月第 1 および第 3 月曜日の 04:00 に 1 回実行する:
<schedule>1st,third monday of month 04:00</schedule>
- 毎年 3 回実行する。9 月、10 月、11 月の第 1 月曜日の 09:00 に 1 回実行する:
<schedule>1st monday of sep,oct,nov 09:00</schedule>
- 四半期ごとに 1 回実行する。1 月、4 月、7 月、10 月の初日の 00:00 に 1 回実行する:
<schedule>1 of jan,april,july,oct 00:00</schedule>
- 毎日 00:00 に実行する:
cron の再試行
cron ジョブのリクエスト ハンドラが 200~299 の範囲にないステータス コードを返した場合、App Engine はジョブが失敗したものとみなします。デフォルトでは、失敗したジョブは再試行されません。構成ファイルに
ブロックを追加すると、失敗したジョブを再試行できます。retry_parameters
cron.xml
ファイルの例を示します。ここでは、1 つの cron ジョブを最大 5 回(デフォルト)まで再試行し、その際にバックオフの間隔を 2.5 秒から始めて、再試行ごとに 2 倍ずつ長くしていきます。
<cronentries>
<cron>
<url>/retry</url>
<description>Retry on jsdk</description>
<schedule>every 10 minutes</schedule>
<retry-parameters>
<min-backoff-seconds>2.5</min-backoff-seconds>
<max-doublings>5</max-doublings>
</retry-parameters>
</cron>
</cronentries>
cron 再試行構文
次の表で、再試行パラメータを説明します。
要素 | 説明 |
---|---|
job_retry_limit |
失敗した cron ジョブの再試行回数の最大値(5 回以下)。 とともに指定した場合、App Engine は両方の上限に達するまで cron ジョブを再試行します。このパラメータを省略すると、上限はデフォルトで 5 回に設定されます。
|
job_age_limit |
失敗した cron ジョブを再試行する制限時間。cron ジョブを最初に実行した時点から計測されます。値は数値の後に時間の単位を付けたものです。単位は、s が秒、m が分、h が時間、d が日を表します。たとえば、5d という値は、cron ジョブの実行の初回試行時から 5 日後までという制限を指定します。job_retry_limit とともに指定した場合、App Engine は両方の上限に達するまで cron ジョブを再試行します。 |
min_backoff_seconds |
cron ジョブの失敗後、再試行するまで待機する最小時間(秒)。 |
max_backoff_seconds |
cron ジョブの失敗後、再試行するまで待機する最大時間(秒)。 |
max_doublings |
cron ジョブが失敗して再試行されるまでの間隔が倍増する最大回数。その後、再試行間隔は一定になります。定数は、2**(max_doublings - 1) * min_backoff です。 |
cron リクエスト
リクエスト ヘッダー
cron サービスからのリクエストには次の HTTP ヘッダーが含まれます。
X-Appengine-Cron: true
このヘッダーとその他のヘッダーは、App Engine によって内部的に設定されます。クライアントがこれらのヘッダーを送信すると、リクエストから削除されます。以前のアプリの管理者がログインしてリクエストした場合は例外で、テストするために、このヘッダーを設定できます。
発行元の IP アドレス
App Engine は、cron リクエストを IP アドレス 0.1.0.2
から発行します。古い gcloud バージョン(326.0.0 より前)で作成された cron ジョブの場合、cron リクエストは 0.1.0.1
から送信されます。
リクエストのタイムアウト
cron リクエストのタイムアウトは、アプリに構成されているスケーリング タイプによって異なります。
- 自動スケーリング
- リクエストのタイムアウト(10 分)。
- 基本スケーリング、手動スケーリング
- リクエストのタイムアウト(24 時間)。
詳細については、インスタンスの管理方法をご覧ください。
上限
無料アプリケーションの場合、最大 20 個のタスクのスケジュールを設定できます。有料アプリケーションの場合、最大 250 個のタスクのスケジュールを設定できます。
開発サーバーにおける cron のサポート
開発サーバーでは、cron ジョブは自動的には実行されません。ローカル デスクトップの cron やスケジュール設定されたタスクのインターフェースを使用すると、curl や同様のツールでジョブの URL をトリガーできます。
cron ジョブのデプロイ
gcloud CLI を使用して、cron ジョブを App Engine にデプロイできます。
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 にデプロイします。
Google Cloud コンソールでの cron のサポート
Google Cloud コンソールの [タスクキュー] ページタブには、cron ジョブを実行しているタスクが表示されます。
また、[ログ] ページでは、cron ジョブがいつ追加または削除されたかを確認できます。