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