アプリケーションのスケジュール設定されたタスクを定義するには、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 は Python アプリケーションのスケジュール タスクを設定します。
YAML 形式について詳しくは YAML ウェブサイトをご覧ください。
cron ジョブの定義
| 要素 | 説明 |
|---|---|
description |
省略可。説明は GCP Console と開発サーバーの管理インターフェースに表示されます。この値は引用符で囲んでください。 |
retry_parameters |
省略可。cron ジョブのリクエスト ハンドラが 200 未満または 299 を超える HTTP ステータス コードを返した場合、App Engine はジョブが失敗したものとみなします。デフォルトでは、失敗したジョブは再試行されません。設定ファイルに retry_parameters ブロックを追加すると、失敗したジョブを再試行するようにできます。
詳しくは、cron の再試行をご覧ください。 |
schedule |
必須。cron ジョブの実行スケジュールを定義します。以下の構文を参照してください。 |
target |
ディスパッチ ファイルを使用すると、ジョブが再ルーティングされることがあります。たとえば、次のような # cron.yaml cron: - description: "test dispatch vs target" url: /tasks/hello_service2 schedule: every 1 mins target: service1 # dispatch.yaml: dispatch: - url: '*/tasks/hello_service2' service: service2 |
timezone |
timezone には、zoneinfo タイムゾーンの標準名を指定してください。タイムゾーンを指定しない場合、UTC(GMT)でスケジュールされます。
|
url |
必須。url フィールドには、cron サービスによって呼び出されるアプリケーション内の URL を指定します。詳しくは、cron の URL を保護するをご覧ください。
|
cron ジョブの schedule を定義する
cron ジョブは繰り返しの間隔に基づいてスケジュール設定し、簡単な英語のような形式を使用して指定します。ジョブは 1 日に複数回実行するようにスケジュール設定することも、具体的な月と日付に実行するようにスケジュール設定することもできます。
- 1 日未満の間隔
-
繰り返しのスケジュールに基づき、ジョブを 1 日に複数回実行するには、1 日未満の間隔を使用します。定義できるのは、終了時刻の間隔または開始時刻の間隔のいずれかです。
-
終了時刻の間隔: ジョブの「終了時刻」から次のジョブが開始されるまでの時間を定義します。「終了時刻」とは、ジョブが完了した時刻またはタイムアウトした時刻のことです。Cron サービスは、
00:00に開始して 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というスケジュールの定義は無効です。 - 任意のある時点で実行するジョブのインスタンスは 1 つのみにする必要があります。cron サービスは、「少なくとも 1 回」の処理を提供するように設計されています。つまり、ジョブがスケジュール設定されている場合、App Engine はそのジョブ リクエストを少なくとも 1 回送信します。まれに、同じジョブの複数のインスタンスがリクエストされる場合があるため、リクエスト ハンドラはべき等である必要があります。また、そのような状況が発生した場合でも有害な副作用がないようにコードを記述する必要があります。
schedule の書式
ジョブが実行される時期を指定するには、以下の構文を使用して schedule 要素を定義します。
schedule: [TYPE] [INTERVAL_VALUE] [INTERVAL_SCOPE]
schedule 要素を定義するには、間隔のタイプを選択します。
- [TYPE]: 毎日実行する間隔には
every接頭辞を含める必要があります。例:
schedule: every 12 hours - [INTERVAL_VALUE]: 整数値とそれに対応する時間の単位。有効な時間の単位は次のとおりです。
minutesまたはminshours
- [INTERVAL_SCOPE]: 該当しません。ジョブを実行する特定の開始時刻または範囲を設定するには、開始時刻の間隔またはカスタムの間隔の構文を確認してください。
- 終了時刻の間隔の例
- 終了時刻の間隔を使用してジョブのスケジュールを定義する方法を理解する場合は、次の例が役立ちます。
- 毎日 00:00 に実行を開始し、次回のジョブ実行まで 5 分間待機する。各ジョブが終了すると、cron サービスは 5 分間待機してから次のジョブを実行する。
schedule: every 5 minutes
- 毎日 00:00 に実行を開始し、次回のジョブ実行まで 30 分間待機する。各ジョブが終了すると、cron サービスは 30 分間待機してから次のジョブを実行する。
schedule: every 30 mins
- 毎日 00:00 に実行を開始し、次回のジョブ実行まで 5 分間待機する。各ジョブが終了すると、cron サービスは 5 分間待機してから次のジョブを実行する。
- [TYPE]: 毎日実行する間隔には
every接頭辞を含める必要があります。例:
schedule: every 12 hours - [INTERVAL_VALUE]: 整数値とそれに対応する時間の単位。有効な時間の単位は次のとおりです。
minutesまたはminshours
- [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
- 毎日 08:00~16:00 に 1 時間ごとに実行する:
schedule: every 1 hours from 08:00 to 16:00
- 毎日 00:00 を起点として 2 時間ごとに実行する:
schedule: every 2 hours synchronized
- 毎日 10:00~14:00 に 5 分間隔で実行する:
- [TYPE]: カスタムの間隔では、
every接頭辞を含めて繰り返しの間隔を定義するか、具体的な日付のリストを定義することができます。- 繰り返しの間隔を定義する場合は、
every接頭辞を使用できます。例:
schedule: every day 00:00 schedule: every monday 09:00
- 具体的な日付を定義する場合は、序数を使用する必要があります。有効な値は、月の初日からその月の最終日を表す値までです。たとえば、次のようになります。
1stまたはfirst2ndまたはsecond3rdまたはthird- 最大
31stまたはthirtyfirstまで
例:
schedule: 1st,3rd tuesday schedule: 2nd,third wednesday of month 09:00
- 繰り返しの間隔を定義する場合は、
- [INTERVAL_VALUE]: カスタムの間隔には、ジョブを実行する具体的な曜日を含めることができます。リストはカンマ区切りのリストで定義する必要があり、以下のいずれかの値を含めることができます。
- その月の日付を表す整数値で、最大 31 日まで。たとえば、次のようになります。
123- 最大
31まで
- 曜日名を表す次の長い値または省略値の任意の組み合わせ:
mondayまたはmontuesdayまたはtueswednesdayまたはwedthrusdayまたはthursfridayまたはfrisaturdayまたはsatsundayまたはsun- すべての曜日を指定するには、
dayを使用します。
例:
schedule: 2nd monday,thurs schedule: 1,8,15,22 of month 09:00 schedule: 1st mon,wednesday,thu of sep,oct,nov 17:00
- その月の日付を表す整数値で、最大 31 日まで。たとえば、次のようになります。
- [INTERVAL_SCOPE]: 指定した [INTERVAL_VALUE] に対応する句を指定します。カスタムの間隔には
of [MONTH]句を含め、単一の月または複数の月のカンマ区切りのリストを指定することができます。また、ジョブを実行する具体的な時刻も定義する必要があります。たとえば、of [MONTH] [HH:MM]のように定義します。of句が除外されている場合、デフォルトではカスタムの間隔が毎月実行されます。- [MONTH]: 月はカンマ区切りのリストで指定する必要があり、次の長い値または省略値の組み合わせを含めることができます。
januaryまたはjanfebruaryまたはfebmarchまたはmaraprilまたはaprmayjuneまたはjunjulyまたはjulaugustまたはaugseptemberまたはsepoctoberまたはoctnovemberまたはnovdecemberまたはdec- すべての月を指定するには、
monthを使用します。
- [HH:MM]: 時刻の値は 24 時間形式の
HH:MMで指定する必要があります。つまり、それぞれ次のようになります。HHは00から23までの整数です。MMは00から59までの整数です。
例:
schedule: 1st monday of sep,oct,nov 09:00 schedule: 1 of jan,april,july,oct 00:00
- [MONTH]: 月はカンマ区切りのリストで指定する必要があり、次の長い値または省略値の組み合わせを含めることができます。
- カスタムの間隔の例
- カスタムの間隔を使用してジョブのスケジュールを定義する方法を理解する場合は、次の例が役立ちます。
- 毎日 00:00 に実行する:
schedule: every day 00:00
- 毎週月曜日の 09:00 に実行する:
schedule: every monday 09:00
- 3 月の第 2 水曜日の 17:00 に 1 回だけ実行する:
schedule: 2nd wednesday of march 17:00
- 5 月の最初の 2 週の月曜日、水曜日、金曜日の 10:00 に 1 回ずつ、つまり合計で 6 回実行する:
schedule: 1st,second mon,wed,fri of may 10:00
- 1 週間に 1 回実行する。毎月 1 日を起点として 7 日ごとの 09:00 に 1 回実行する:
schedule: 1,8,15,22 of month 09:00
- 隔週で実行する。毎月第 1 および第 3 月曜日の 04:00 に 1 回実行する:
schedule: 1st,third Monday of month 04:00
- 毎年 3 回実行する。9 月、10 月、11 月の第 1 月曜日の 09:00 に 1 回実行する:
schedule: 1st monday of sep,oct,nov 09:00
- 四半期ごとに 1 回実行する。1 月、4 月、7 月、10 月の初日の 00:00 に 1 回実行する:
schedule: 1 of jan,april,july,oct 00:00
- 毎日 00:00 に実行する:
cron の再試行
cron ジョブのリクエスト ハンドラが 200 未満または 299 を超えるステータス コードを返した場合、App Engine はジョブが失敗したものとみなします。デフォルトでは、失敗したジョブは再試行されません。構成ファイルに ブロックを追加すると、失敗したジョブを再試行できます。retry_parameters
cron:
- description: "retry demo"
url: /retry
schedule: every 10 mins
retry_parameters:
min_backoff_seconds: 2.5
max_doublings: 5
cron 再試行構文
下の表で再試行パラメータを説明します。
| 要素 | 説明 |
|---|---|
job_retry_limit |
失敗した cron ジョブの再試行回数の最大値(5 回以下)。job_age_limit と共に指定すると、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
この X-Appengine-Cron ヘッダーは Google App Engine 内部で設定されます。リクエスト ハンドラでこのヘッダーを検出した場合は、リクエストが cron リクエストであると判断できます。このヘッダーが、外部ユーザーからアプリケーションへのリクエストに指定されていた場合は、削除されます。アプリケーションの管理者がログインしてリクエストした場合は例外で、テストするために、このヘッダーを設定することができます。
発行元の IP アドレス
Google App Engine は cron リクエストを IP アドレス 0.1.0.1 から発行します。
期限
cron のタイムアウト期限は、アプリに設定されているインスタンス クラスとスケーリング タイプによって異なります。
- 自動スケーリング
- 約 10 分でタイムアウトします。
- 基本スケーリング、手動スケーリング
- 24 時間以内にタイムアウトします。
詳しくは、スケーリング タイプとインスタンス クラスをご覧ください。
制限
無料アプリケーションの場合、最大 20 個のタスクのスケジュールを設定できます。有料アプリケーションの場合、最大 250 個のタスクのスケジュールを設定できます。


