Amplify Gen 2 Scheduling Functionでハマった cron 式エラーと解決方法

に公開

はじめに

Amplify Gen 2 の Scheduling Function は、defineFunctionschedule プロパティを追加するだけで「定期実行」の 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 では下記の公式ドキュメントに以下のの記載がありました。

https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-scheduled-rule-pattern.html

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のドキュメントにはサラッと?が使われていて解説はありません。
https://docs.amplify.aws/react/build-a-backend/functions/scheduling-functions/?utm_source=chatgpt.com

解決策 ── ? を入れて 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 では ? の概念がなく 両方 で成立するの引っ張られてしまいました。

まとめ

  1. 「Amplify の cron = EventBridge の cron」
  2. 3つ目か5つ目のフィールドを?にする必要あり

Discussion