LoginSignup
2
4

More than 3 years have passed since last update.

【Linux】【AWS Lambda】Cron形式の設定マニュアル

Posted at

背景

WEBサイトのクローリング、サーバーの死活監視データベースのバックアップ など、ものごとを定期的に行なう際に、スケジュール実行を可能とするCron形式について、Linuxでの設定方法・設定例と、AWS Lambdaにおける設定方法や設定例をまとめます。

先人たちの知恵をお借りするなどして解決できたことを、この場をお借りして感謝するとともに、大変恐縮ですが自分のメモとしても、こちらへまとめておきます。

環境

  • AWS EC2 (Amazon Linux 2)
  • AWS Lambda
  • Python 3.7.9    ※2020/12/10時点のAmazon Linux2でのデフォルト
  • Django 3.1.3
  • PostgreSQL 11.5  ※同上
  • Nginx 1.12     ※同上
  • Gunicorn
  • PuTTY 0.74

1. Linux における設定方法・設定例

1-1. 形式

<分> <時> <日> <月> <曜日> <コマンド>

1-2. パラメータ

  • すべてのパラメータが必須です。
  • タイムゾーンはUTC(協定世界時)のみで変更不可。JST(日本標準時)として指定するには、UTCに対して「-9時間」とする(9時間を差し引く)必要があります。
  • 分未満(秒単位)の指定はサポートされていません。
No. フィールド ワイルドカード
1 0~59 「/」(スラッシュ)、「*」(アスタリスク)「-」(ハイフン)、「,」(カンマ)
2 0~23 「/」(スラッシュ)、「*」(アスタリスク)「-」(ハイフン)、「,」(カンマ)
3 1~31 「/」(スラッシュ)、「*」(アスタリスク)「-」(ハイフン)、「,」(カンマ)
4 1~12 または JAN~DEC 「/」(スラッシュ)、「*」(アスタリスク)「-」(ハイフン)、「,」(カンマ)
5 曜日 1~7 または SUN~SAT 「/」(スラッシュ)、「*」(アスタリスク)「-」(ハイフン)、「,」(カンマ)
6 コマンド 任意のコマンド (なし)

1-3. ワイルドカード

  • 分未満(秒単位)の指定はサポートされていません。
  • 実際に指定する際に、ワイルドカードに「」は記述不要です。
No. 文字 定義 設定例
1 「/」(スラッシュ) 増分を指定する <分>フィールドの0/10は、10分ごとに実行が発生する。5/15は、5・20・35・50分などを意味する。
2 「*」(アスタリスク) すべての値を指定する <日>フィールドで使用した場合、その月のすべての日が設定される。
3 「-」(ハイフン) 範囲を指定する 8-10 は、8・9および10が設定される。
4 「,」(カンマ) 追加の値を指定する SUN・MON・TUEは、それぞれ日曜日・月曜日・火曜日が設定される。

1-4. 設定例

crontab
# 毎日午前8時(UTC)に'backup.py'を実行する
 0 8 * * * source ~/venv_<プロジェクト名>/bin/activate; cd ~/venv_<プロジェクト名>/<プロジェクト名>; python manage.py backup > ~/cron.log 2>&1

# 毎日午後11時45分(UTC)にNginxをリロードする
 45 23 * * * sudo systemctl reload nginx.service

# 毎月1日の17時30分(UTC)にLet's EncryptのSSL証明書を更新する
 30 17 1 * * /home/<スーパーユーザー>/certbot/certbot-auto renew -q --renew-hook "/usr/bin/sysytemctl reload nginx.service"
# または
 30 17 1 * * /home/<スーパーユーザー>/certbot/certbot-auto renew -q --renew-hook "/usr/bin/sysytemctl reload nginx.service"

# 月曜~金曜(UTC)は5分ごとに固定IPへのpingを実行する
 0/5 * * MON-FRI * ping <Elastic IP>
# または
 0/5 * * 2-6 * ping <Elastic IP>

2. AWS Lambda における設定方法・設定例

2-1. 形式

cron <分> <時> <日> <月> <曜日> <年>

2-2. パラメータ

  • すべてのパラメータが必須です。
  • タイムゾーンはUTC(協定世界時)のみで変更不可。JST(日本標準時)として指定するには、UTCに対して「-9時間」とする(9時間を差し引く)必要があります。
  • 分未満(秒単位)の指定はサポートされていません。
  • 実際に指定する際に、ワイルドカードに「」は記述不要です。
No. フィールド ワイルドカード
1 0~59 「/」(スラッシュ)、「*」(アスタリスク)、「-」(ハイフン)、「,」(カンマ)
2 0~23 「W」、「L」、「/」(スラッシュ)、「?」(クエスチョンマーク)、「*」(アスタリスク)、「-(ハイフン)、「,」(カンマ)
3 1~31 「/」(スラッシュ)、「*」(アスタリスク)、「-」(ハイフン)、「,」(カンマ)
4 1~12 または JAN~DEC 「/」(スラッシュ)、「*」(アスタリスク)、「-」(ハイフン)、「,」(カンマ)
5 曜日 1~7 または SUN~SAT 「#」(シャープ)、「L」、「/」(スラッシュ)、「?」(クエスチョンマーク)、「*」(アスタリスク)、「-」(ハイフン)、「,」(カンマ)
6 1970~2199 「/」(スラッシュ)、「*」(アスタリスク)、「-」(ハイフン)、「,」(カンマ)

2-3. ワイルドカード

  • 分未満(秒単位)の指定はサポートされていません。
  • 実際に指定する際に、ワイルドカードに「」は記述不要です。
  • 日または週のどちらかの値は、「?」(クエスチョンマーク)である必要があります。
No. 文字 定義 設定例
1 「/」(スラッシュ) 増分を指定する <分>フィールドの0/10は、10分ごとに実行が発生する。5/15は、5・20・35・50分などを意味する。
2 「L」 『最後』を指定する ①<日>フィールドに指定された場合は、その月の末日が設定される。②<週>フィールドに指定された場合は、その週の最後の曜日(=土曜日)が設定される。
3 「W」 平日を指定する 日付とともに指定した場合(例:3/Wなど)、その月の3日に最も近い平日が設定される。3日が土曜日の場合は、その前日の金曜日に実行される。3日が日曜日の場合は、その翌日の月曜日に実行される。
4 「#」(シャープ) その月のn番目の日を指定する 4#3と指定した場合は、その月の第3水曜日が設定される。(※水曜日=週7日のうち4番目の曜日)
5 「*」(アスタリスク) すべての値を指定する <日>フィールドで使用した場合、その月のすべての日が設定される。
6 「?」(クエスチョンマーク) 値を指定しない 指定した別の値とともに設定される。例として、ある特定の日付を指定したが、その日が何曜日であっても実行する場合。
7 「-」(ハイフン) 範囲を指定する 8-10 は、8・9および10が設定される。
8 「,」(カンマ) 追加の値を指定する SUN・MON・TUEは、それぞれ日曜日・月曜日・火曜日が設定される。

2-4. 設定例

# 毎日午前8時(UTC)に実行する
cron(0 8 * * ? *)

# 毎日午後12時45分(UTC)に実行する
cron(45 12 * * ? *)

# 月曜~金曜の午後5時30分(UTC)に実行する
cron(30 17 ? * MON-FRI *)
# または
cron(30 17 ? * 2-6 *)

# 月曜~金曜(UTC)は5分ごとに実行する
cron(0/5 * ? * MON-FRI *)
# または
cron(0/5 * ? * 2-6 *)

(参考)

AWS公式サイト(Lambda):
Rate または Cron を使用したスケジュール式
ルールのスケジュール式 (英語)


(編集後記)

ついつい、JSTとUTCとの時差(▲9時間)を忘れがちです。
月末の夜間に動かしたいにも関わらず、月初の昼間に動いてしまってアラートが挙がる!といったことの無いよう、設定する際には必ずこのマニュアルを見ることにしました。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4