Amplify Gen 2 Scheduling Functionでハマった cron 式エラーと解決方法
はじめに
Amplify Gen 2 の Scheduling Function は、defineFunction
に schedule
プロパティを追加するだけで「定期実行」の Lambda を簡単に作れます。ところが “いつもの cron 感覚” で書いた式が、デプロイ時にビルドで失敗。(実際にはコードレビューのときに気付けずApproveしてしまいました...)
この記事では 「なぜ?」と「どう直す?」 をまとめます。みなさんの参考になれば幸いです。
現象 ── レビューでも見落とした cron 記法ミス
// 誤ったコード(毎時 5 分と 35 分に動かすつもりだった)
import { defineFunction } from "@aws-amplify/backend";
export const remindMe = defineFunction({
name: "some-scheduling-function",
schedule: [
"5,35 * * * *", // ← 典型的な Linux cron
],
});
Amplify のビルド中に次のようなエラーが発生します。
FunctionScheduleInitializationError: Failed to instantiate schedule for nodejs function
Cause: Cron expressions cannot have both day-of-month and day-of-week defined, you must use a ? in one of the fields
原因 ── EventBridge の cron 仕様の認識漏れ
Amplify Gen 2 の Scheduling Function は裏で Amazon EventBridge の “スケジュール付きルール” を利用しています。そのため、cron 式も EventBridge 仕様 に従う必要があるのです。EventBridge では下記の公式ドキュメントに以下のの記載がありました。
You can't specify the Day-of-month and Day-of-week fields in the same cron expression. If you specify a value or a * (asterisk) in one of the fields, you must use a ? (question mark) in the other.
日本語にすると
同じ cron 式で「月の日にち (Day-of-month)」と「曜日の日にち (Day-of-week)」の両方のフィールドを指定することはできません。いずれかのフィールドで値または * (アスタリスク) を指定する場合は、もう一方のフィールドで ? (疑問符) を使用する必要があります。
Linux cron と違って 6 フィールド(もしくは 7 フィールド) 構成で、
分 時 日 月 曜日 年
のうち 日(Day-of-month) と 曜日(Day-of-week) が同時指定禁止、というルールです。
ちなみにAmplifyの方のScheduling Functionのドキュメントにはサラッと?が使われていて解説はありません。
?
を入れて EventBridge 仕様に合わせる
解決策 ── // 修正後のコード
import { defineFunction } from "@aws-amplify/backend";
export const remindMe = defineFunction({
name: "some-scheduling-function",
schedule: [
// 毎時 5 分と 35 分に実行
"5,35 * * * ? *", // ← Day-of-week を ? に
],
});
ポイントは 5 つ目のフィールド(曜日)に ?
を置くこと。これで *「日付を (毎日)にする代わりに、曜日は指定しない」 という意味になります。
?
が必要なのか
どうして - EventBridge は「どの日付か」「どの曜日か」を 同時に評価できない 仕様
- そのため、一方を固定値(または )にしたら、もう一方は 「評価しない」 という
?
が必須
Linux cron では ?
の概念がなく 両方 で成立するの引っ張られてしまいました。
まとめ
- 「Amplify の cron = EventBridge の cron」
- 3つ目か5つ目のフィールドを?にする必要あり
Discussion