【AWS】EventBridge SchedulerでLambdaを定期実行する方法

当ページのリンクには広告が含まれています。
いずみ

こんな悩みを解決できる記事を書きました!

僕は現役フリーランスエンジニア(歴年)で、資格は個保有しています。

EventBridge SchedulerでLambdaを定期的に動かしたい」とお考えではありませんか?

決まった時刻や一定間隔でLambda関数を呼び出したい方へ。

EventBridge Schedulerを使えば、1つのスケジュールリソースだけでcron実行やrate実行をまとめて管理できます

いずみ

サクッと解説します。

ということで、本記事ではEventBridge SchedulerでLambdaを定期実行する方法を解説します。

いずみ

すぐ読み終わるので、ぜひ最後まで読んでくださいませ。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
執筆者/監修者
  • フリーランスエンジニア(保有資格個、企業と直接契約
  • ブログ・アフィリエイト歴7年(2018年〜)
  • ブランドせどりで月利50万円⇨脱サラ
  • 投資(仮想通貨・FX)歴7年(2018年〜)
  • X(旧Twitter)フォロワー約1,900人
  • 運営者情報はこちら
いずみです
目次

【AWS】EventBridge SchedulerでLambdaを定期実行する

早速ですが、EventBridge SchedulerでLambdaを定期実行する手順を見ていきます。

EventBridge Schedulerとは

EventBridge Schedulerは、cron式やrate式でターゲットを定期的に呼び出すための専用サービスです。

以前はEventBridgeルール(旧CloudWatch Events)のスケジュール実行でLambdaを動かす方法が一般的でした。

EventBridgeルールのスケジュール実行と比べると、EventBridge Schedulerには次のような違いがあります。

  • スケジュールが独立した1リソースになり、イベントバスを消費しない
  • 270以上のAWSサービス・6000以上のAPIをターゲットに指定できる
  • タイムゾーン指定つきのcron式が使える
  • リトライ回数・デッドレターキュー・実行時刻の許容幅(フレキシブルタイムウィンドウ)を標準で設定できる
  • at式による1回限りの実行を指定できる

新しくスケジュール実行を組む場合、AWSはEventBridge Schedulerの利用を推奨しています。

いずみ

旧EventBridgeルールでも定期実行はできますが、新規に作るならEventBridge Schedulerのほうが素直です。

事前準備(Lambda関数とIAMロール)

まずはターゲットになるLambda関数と、EventBridge Schedulerが使うIAMロールを用意します。

STEP
実行対象のLambda関数を用意する

定期実行したい処理を持つLambda関数を作成しておきます。

関数のARNは後でスケジュールのターゲットに指定するので控えておきます。

STEP
Scheduler用のIAMロールを作成する

EventBridge SchedulerがLambdaを呼び出すためのIAMロールを作ります。

信頼ポリシーのプリンシパルにはscheduler.amazonaws.comを指定します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "Service": "scheduler.amazonaws.com" },
      "Action": "sts:AssumeRole"
    }
  ]
}

許可ポリシーには対象関数へのlambda:InvokeFunctionを付与します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:my-batch"
    }
  ]
}

EventBridgeルールのスケジュール実行と違い、EventBridge SchedulerではLambda側のリソースベースポリシー(add-permission)は不要です。

呼び出し権限は、スケジュールに渡したIAMロールで判定されます。

いずみ

ロールの信頼先をlambda.amazonaws.comにしてしまう事故が多いので注意です。

正しい信頼先はscheduler.amazonaws.comです。

マネジメントコンソールでスケジュールを作成する

STEP
スケジュールの詳細を入力する

EventBridge Schedulerのコンソールを開き、スケジュールを作成を選びます。

名前を入力し、必要ならスケジュールグループを指定します。

STEP
実行パターンを設定する

定期的なスケジュールを選び、rate式またはcron式を入力します。

cron式の場合はタイムゾーンをAsia/Tokyoに設定できます。

実行時刻を厳密にしたい場合、フレキシブルタイムウィンドウはオフにします。

STEP
ターゲットにLambdaを指定する

ターゲットのAPIとしてAWS Lambdaの関数呼び出しを選びます。

対象のLambda関数と、渡すペイロード(JSON)を指定します。

実行ロールには、先ほど作成したIAMロールを選択します。

いずみ

フレキシブルタイムウィンドウをオンにすると、指定した範囲内でばらけて実行されます。

負荷を分散したいバッチ向けの設定です。

AWS CLIでスケジュールを作成する

コンソールと同じ設定は、AWS CLIでも作成できます。

aws scheduler create-schedule \
  --name invoke-lambda-hourly \
  --schedule-expression 'rate(1 hour)' \
  --flexible-time-window '{"Mode": "OFF"}' \
  --target '{"Arn":"arn:aws:lambda:ap-northeast-1:123456789012:function:my-batch","RoleArn":"arn:aws:iam::123456789012:role/scheduler-invoke-lambda"}'

schedule-expressionにcron式を使う場合は、schedule-expression-timezoneでタイムゾーンを指定します。

aws scheduler create-schedule \
  --name invoke-lambda-0900-jst \
  --schedule-expression 'cron(0 9 * * ? *)' \
  --schedule-expression-timezone 'Asia/Tokyo' \
  --flexible-time-window '{"Mode": "OFF"}' \
  --target '{"Arn":"arn:aws:lambda:ap-northeast-1:123456789012:function:my-batch","RoleArn":"arn:aws:iam::123456789012:role/scheduler-invoke-lambda"}'

boto3(Python)でスケジュールを作成する

Pythonから作成する場合は、boto3のschedulerクライアントを使います。

import boto3

client = boto3.client("scheduler", region_name="ap-northeast-1")

client.create_schedule(
    Name="invoke-lambda-0900-jst",
    GroupName="default",
    ScheduleExpression="cron(0 9 * * ? *)",
    ScheduleExpressionTimezone="Asia/Tokyo",
    FlexibleTimeWindow={"Mode": "OFF"},
    Target={
        "Arn": "arn:aws:lambda:ap-northeast-1:123456789012:function:my-batch",
        "RoleArn": "arn:aws:iam::123456789012:role/scheduler-invoke-lambda",
        "Input": '{"job": "daily"}',
        "RetryPolicy": {
            "MaximumRetryAttempts": 3,
            "MaximumEventAgeInSeconds": 3600,
        },
        "DeadLetterConfig": {
            "Arn": "arn:aws:sqs:ap-northeast-1:123456789012:scheduler-dlq"
        },
    },
)

一時的に止めたい場合は、update_scheduleでStateをDISABLEDに変更します。

不要になったスケジュールはdelete_scheduleで削除できます。

いずみ

create_scheduleはFlexibleTimeWindowが必須項目です。

使わない場合もMode: OFFを明示的に渡します。

cron式とrate式の使い分け

単純な間隔で回すだけなら、rate式のほうが読みやすいです。

rate式は「正の整数 + 単位」で書き、rate(1 hour)やrate(15 minutes)のように指定します。

単位は数値が1のとき単数形、2以上のとき複数形にする決まりがあります。

毎日9時など時刻を固定したい場合はcron式を使います。

cron式は6フィールド(分・時・日・月・曜日・年)で、日か曜日のどちらかを?にします。

cron(0 9 * * ? *)は毎日9時、cron(0/30 * * * ? *)は30分ごとの実行になります。

リトライとデッドレターキューを設定する

ターゲット呼び出しが失敗したときの挙動は、TargetのRetryPolicyで制御します。

MaximumRetryAttemptsは最大リトライ回数(0〜185)です。

MaximumEventAgeInSecondsは、再試行を続ける最大時間(60〜86400秒)です。

リトライを使い切っても失敗したイベントは、DeadLetterConfigに指定したSQSキューへ送られます。

デッドレターキューを監視しておくと、気付かないうちに定期実行が失敗し続ける事態を防げます。

いずみ

バッチが失敗しても静かにスキップされると気付けません。

デッドレターキューは早めに用意しておくと安心です。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式

【厳選】フリーランスエンジニアにおすすめなエージェント3選

フリーランスエンジニアになるにはエージェントから案件をもらう必要があります。

僕が実際に利用しているおすすめエージェントを紹介しますね。

いずみ

エージェントは必ず複数登録してください。

担当者によっては「全然案件紹介してくれない…」みたいなこともあるので…

僕は実際に5つのエージェントを使い回していますよ。

フリーランスを始めるなら「

案件数マージン率単価
約88,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 業界最大級の案件数。
  • 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
  • 案件参画中のフォローの充実。

※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。

は業界最大手のフリーランスエージェントです。

とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!

いずみ

僕もはじめてフリーランスの案件を貰ったのはです。

保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。

手厚い保障を重視したいなら「

案件数マージン率単価
約10,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 手厚い保障で正社員並みの安心感。
  • 還元率60%超え&単価公開でクリアな契約。
  • 給与保障制度(審査あり)。

は手厚い保障が特徴のフリーランスエージェントです。

フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。

いずみ

僕も何度か案件を紹介してもらいました。

自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。

週2〜3日の案件探しなら「

案件数マージン率単価
約5,000件非公開
初心者福利厚生申し込み
経験者向け無料
Good Point
  • IT案件に特化したフリーランスエージェント。
  • 週2〜3日の案件が豊富。
  • リモート案件が多く、直エンドなので単価も高い。

※詳細は「【週2・3案件】ITプロパートナーズとは?メリットや利用手順を解説!」を参照。

はIT案件に特化したフリーランスエージェントです。

週2〜3日から参画できる案件が豊富なので、起業したい人にもおすすめです。

いずみ

週2〜3日の案件はある程度スキルがないと紹介してもらえない印象です。

とはいえ、週5の案件ももちろんありますし、僕が利用した時は迅速・丁寧に対応していただきました!

よくある質問

従来のEventBridgeルール(cron)から移行すべきですか?

新規のスケジュール実行はEventBridge Schedulerが推奨されています。

既存のルールが問題なく動いているなら急いで移行する必要はありませんが、タイムゾーン指定やリトライ設定が欲しくなったタイミングで乗り換えると効果を感じやすいです。

LambdaにInvoke権限のリソースベースポリシーは必要ですか?

EventBridge Schedulerからの呼び出しでは不要です。

スケジュールに渡したIAMロールにlambda:InvokeFunctionが付いていれば動きます。

日本時間で実行するにはどうしますか?

cron式を使い、ScheduleExpressionTimezoneにAsia/Tokyoを指定します。

rate式は作成時刻からの相対間隔で動くため、タイムゾーンの指定はありません。

1回だけ実行したい場合はどうしますか?

at式(例: at(2026-01-01T09:00:00))を使うと単発実行になります。

ActionAfterCompletionにDELETEを指定すると、実行後にスケジュール自体を自動削除できます。

まとめ

今回は、EventBridge SchedulerでLambdaを定期実行する方法について解説しました。

以下が本記事のまとめになります。

まとめ
  • EventBridge Schedulerは、cron・rate・at式でLambdaを呼び出す専用サービス。
  • scheduler.amazonaws.comを信頼するIAMロールを用意すれば、Lambda側のリソースベースポリシーは不要。
  • create_scheduleではFlexibleTimeWindowが必須で、使わない場合もMode: OFFを渡す。
  • RetryPolicyとDeadLetterConfigで、失敗時の再試行と退避先を設定できる。
まとめ
いずみ

最後までお読みいただき、ありがとうございました!

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
  • クソおすすめ本
¥4,480 (2024/06/01 23:28時点 | Amazon調べ)
いずみ

海外のエンジニアがどういった思考で働いているかが理解できます。

海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。

この記事が気に入ったら
フォローしてね!

シェアしてね!
  • URLをコピーしました!
目次