背景
EventBridge + Lambdaの定期バッチをAWS SAMで構築しました。テンプレート1ファイルでスケジュール設定からIAM権限まで完結する構成です。
1. テンプレート全体
Resources:
BatchFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: src/
Handler: app.lambda_handler
Events:
ScheduleEvent:
Type: Schedule
Properties:
Schedule: rate(1 minute)
Name: !Sub "${AWS::StackName}-schedule"
Enabled: true
Type: Scheduleの1行で、EventBridgeルールの作成・Lambdaへのターゲット設定・リソースベースポリシーの付与までがまとめて完結します。
2. rate式とcron式の使い分け
Schedule: rate(1 minute) # シンプルな繰り返し
Schedule: cron(0 0 * * ? *) # 複雑なスケジュール(UTC基準)
cron式はUTC基準な点に注意が必要です。日本時間(JST=UTC+9)の朝9時は、UTCでは0時なのでcron(0 0 * * ? *)と書きます。単純な「X分ごと」ならrate式の方が圧倒的にシンプルです。
3. event.get("source", "manual")で実行元を判別する
result = {
"triggeredBy": event.get("source", "manual"), # EventBridgeからは "aws.scheduler"
}
EventBridgeからの呼び出し時はevent["source"]に"aws.scheduler"が自動的に入ります。Lambdaコンソールから手動テスト実行した場合はeventが空になるため、デフォルト値の"manual"にフォールバックします。この値をログに出すだけで、自動実行かどうかの切り分けができます。
4. samconfig.tomlの配置場所とgitignore
samconfig.tomlはリージョンやスタック名など環境固有の設定を含むため.gitignore対象にし、プロジェクトルート直下に手動作成します。別のフォルダに置くと以下のエラーになります。
Error: Missing option '--stack-name', 'sam deploy --guided' can be used to...
初回はsam deploy --guidedで対話式に設定すると、samconfig.tomlが自動生成されて以降はsam deployだけで済みます。
5. rate(1 minute)は削除を忘れると地味にログが溜まる
1分ごとに実行される設定のため、放置するとCloudWatch Logsが際限なく蓄積します。検証が終わったらsam deleteで速やかに片付けるのが安全です。
sam delete --stack-name eventbridge-lambda-batch-stack --region ap-northeast-1
sam deleteはLambda・EventBridgeルール・IAMロールを一括削除しますが、CloudWatch Logsのロググループだけは残るので、不要ならaws logs delete-log-groupで個別に消します。
まとめ
Type: Scheduleという1行の裏には、EventBridgeルール作成・ターゲット設定・IAM権限付与という複数の処理が隠れています。コンソールで同じ構成を手動構築した記録は別記事にまとめています。