こんにちはGMOアドマーケティングのy.yです。
App EngineのCronの設定と注意点の記事になります
引用参考URL
https://cloud.google.com/appengine/docs/standard/go/scheduling-jobs-with-cron-yaml?hl=ja
https://cloud.google.com/sdk/gcloud/reference/app/deploy?hl=ja
概要
- タスク上限について
- タスク設定について
- App Engineからのリクエスト検証について
- gcloud app deployのFlagについて
- 注意点
タスク設定上限
- 無料アプリケーション:最大20個
- 有料アプリケーション:最大250個
タスク設定
App Engineのタスクスケジュールはcron.yamlファイルを使用して構成され、Cronサービスの呼び出しはHTTP GET リクエストで実行されます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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 retry_parameters: min_backoff_seconds: 2.5 max_doublings: 5 target: beta |
各ブロックの説明
- url
- 必須
- ジョブの実行URL
- schedule
- ジョブの実行スケジュール
- 書式
- schedule: [TYPE] [INTERVAL_VALUE] [INTERVAL_SCOPE]
- deccription
- ジョブの説明
- timezone
- ジョブスケジュールに使用するタイムゾーン
- target
- アプリ内の具体的なサービス名
- retry_parameters
- 再試行の指定
- job_retry_limit
- 再試行回数の最大値。最小値0最大値5
- job_age_limit
- 再試行する制限時間。単位はsが秒mが分hが時間dが日
- min_backouff_seconds
- 再試行するまでの最小待機時間(秒)
- max_backouff_seconds
- 再試行するまでの最大待機時間(秒)
- max_doublings
- 再試行されるまでの感覚が埋蔵する最大回数
- job_retry_limit
- 再試行の指定
Cronサービスのスケジューリング例
- 毎分実行の例
- 毎日0:00に実行を開始し1分間隔で実行
- schedule: every 1 minutes
- 毎日10:00〜14:00に5分間隔で実行
- schedule: every 5 minutes from 10:00 to 14:00
- 毎日0:00に実行を開始し1分間隔で実行
- 毎時実行の例
- 毎日0:00〜23:00に1時間ごとに実行
- schedule: every 1 hours from 00:00 to 23:00
- 毎日0:00を起点に1時間ごとに実行
- schedule: every 1 hours synchronized
- 毎日0:00〜23:00に1時間ごとに実行
- 日時実行の例
- 毎日1:00に実行
- schedule: every day 01:00
- 毎日1:00に実行
- 曜日実行の例
- 毎週月曜1:00に実行
- schedule: every monday 01:00
- 曜日指定
- monday or mon
- tuesday or tue
- wednesday or wed
- thursday or thu
- friday or fri
- saturday or sat
- sunday or sun
- 全ての曜日を指定するにはdayを使用
- 毎週月曜1:00に実行
- 月実行の例
- 9、10、11月の最初の1週の月曜日の09:00に1回ずつ実行
- schedule: 1st monday of sep,oct,nov 09:00
- 月指定
- january or jan
- february or feb
- march or mar
- april or apr
- may
- june or jun
- july or jul
- august or aug
- september or sep
- october or oct
- november or nov
- december or dec
- 9、10、11月の最初の1週の月曜日の09:00に1回ずつ実行
- その他例
- 毎日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リクエストの検証
URLに対するリクエストがApp Engineから発生したものであることを確認する場合、HTTPヘッダーと送信元IPアドレスで検証することができます
- HTTPヘッダー
- X-Appengine-Cron: true※クライアントがこのヘッダーを送信するとリクエストから削除されます
- IP
- 0.1.0.2
- 10.0.0.1
example(golang)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
func isCronRequest(r *http.Request) bool { ip := getIP(r) if ip[0:7] == "0.1.0.2" || ip[0:8] == "10.0.0.1" { return true } h := r.Header["X-Appengine-Cron"] if len(h) == 0 { return false } if h[0] != "true" { return false } else { true } return true } func getIP(r *http.Request) string { fowarded := r.Header.Get("X-FORWARDED-FOR") if fowarded != "" { return fowarded } return r.RemoteAddr } |
gcloud app deployのFlag
- –appyaml=APPYAML
- 特定のapp.yamlを指定
- –bucket=BUCKET
- デプロイに関連付けられたファイルをステージングするために使用されるGoogleCloudStorageバケット
- –no-cache
- ビルドステップ中にキャッシュされた依存関係を使用しない
- –ignore-file=IGNORE_FILE
- 指定されたignorefileを使用
- –image-url=IMAGE_URL
- 特定のDocker imageを指定
- –promote
- デプロイされたバージョンをプロモートして、すべてのトラフィックを受信
- –stop-previous-version
- すべてのトラフィックを受信する新しいバージョンを展開するときは、以前に実行していたバージョンを停止
- –no–stop-previous-version
- すべてのトラフィックを受信する新しいバージョンを展開するときは、以前に実行していたバージョンを停止しない
- –version=VERSION
- このデプロイメントによって作成または置換されるアプリのバージョン
注意点
- ジョブの開始時刻に前のジョブが未完了の場合スキップされる
- deploy時に実行中のジョブは停止される。但し、–no-stop-previous-version flagをつけgcloud app deploy することによって停止させないことが可能
- ステータスコード200〜299以外を返した場合ジョブが失敗したものとされる
- リトライはretry_parametersブロックでジョブを再試行。デフォルトではリトライはされない