📚

Amazon EventBridge SchedulerでLambda関数を1回だけ実行するスケジュールを登録する

2024/07/04に公開

AWSのサーバーレスアーキテクチャを使用する際、特定の時間に1回だけLambda関数を実行したいケースがあります。
例えば、データ移行やバッチ処理、一時的なリソースのクリーンアップなどが考えられます。

この記事では、Amazon EventBridge Schedulerを使用して、Lambda関数を1回だけ実行するスケジュールの登録方法を紹介します。

EventBridge Schedulerとは

Amazon EventBridge Schedulerは、AWSのマネージドサービスの1つで、アプリケーションやAWSサービスのスケジュール実行を簡単に設定できます。
cron式や固定レート、特定の日時を指定してタスクをスケジュールすることができます。

Amazon EventBridge スケジューラとは - EventBridge スケジューラ

やり方

ここでは Python + boto3 を使ってEventBridge Schedulerにスケジュールを登録する方法を記載します。マネジメントコンソールやCLIを使った登録方法は記載しません。

boto3.client('scheduler').create_schedule を使うことでEventBridge Schedulerにスケジュールを登録することができます。

import boto3
import json

scheduler = boto3.client('scheduler')

input_data = {
    "foo": "bar"
}

response = scheduler.create_schedule(
    Name=f"InvokeLambdaOneTime",
    ScheduleExpression="2024-07-01T09:00:00",
    ScheduleExpressionTimezone="Asia/Tokyo",
    FlexibleTimeWindow={'Mode': 'OFF'},
    ActionAfterCompletion='DELETE',
    State="ENABLED",
    Target={
        "Arn": "<実行したいLambda関数Arn>",
        "RoleArn": "<Lambda関数をInvokeするRole>",
        "Input": json.dumps(input_data),
    }
)

create_scheduleに指定するパラメータは以下のとおりです。

  • Name: EventBridge Schedulerに登録するスケジュールの名前を指定します。
  • ScheduleExpression: スケジュール実行日時を指定します。この例では2024年7月1日9時に設定しています。cron式での指定も可能です。
  • ScheduleExpressionTimezone: タイムゾーンを指定します。この例では日本時間(Asia/Tokyo)に設定しています。
  • FlexibleTimeWindow: OFFに設定することで、指定した時間通りに実行されます。FLEXIBLEを設定した場合は、MaximumWindowInMinuteに指定された時間枠内でスケジュールが実行されます。
  • ActionAfterCompletion: DELETEを指定することで、実行後にスケジュールが自動的に削除されます。
  • State: ENABLEDに設定することで、スケジュールがすぐに有効になります。
  • Target: 実行するLambda関数の詳細を指定します。
    • (必須)Arn: 実行するLambda関数のArnを指定します。
    • (必須)RoleArn: EventBridge SchedulerがLambda関数を呼び出すために使用するIAM RoleのArnを指定します。このロールにはPrincipalに scheduler.amazonaws.com が設定されているIAMポリシーを割り当てておく必要があります。また lambda:InvokeFunction の権限も必要です。
    • (オプション)Input: Lambda関数にわたすデータをJSON形式で指定します。
    • その他、RetryPolicy DeadLetterConfig といったオプションが存在しますが割愛します。

また以下の点に注意する必要があります。

  • Lambda関数をInvokeするIAMロールには、適切な権限が付与されていることを確認してください。
  • スケジュールの実行時間は、UTCではなく指定したタイムゾーンに基づいて設定されます。

まとめ

Amazon EventBridge Schedulerを使用することで、Lambda関数を特定の時間に1回だけ実行する設定が簡単にできます。
ActionAfterCompletionDELETE にすることで、登録したスケジュールの実行完了後に自動的に削除され、ゴミが残りません。
この方法は、一時的なタスクや定期的ではない処理に非常に便利です。

Discussion