はじめに
「定期的にデータを処理したい」「夜中に自動でバッチを動かしたい」と思ったことはありませんか?
AWSには、定期実行のための仕組みが標準で備わっています。Amazon EventBridgeのスケジュール機能を使えば、Linuxのcronと同じような感覚でLambda関数を自動実行できます。
この記事では、AWS SAM(Serverless Application Model) を使って、EventBridge + Lambdaの定期バッチ実行をゼロから構築するハンズオンを紹介します。
このハンズオンで実際に作るもの:
EventBridge スケジュールルール(rate: 1分ごと)
↓ イベント発火
Lambda(Python 3.12 / BatchFunction)
↓ ログ出力
CloudWatch Logsこの記事の特徴:
- Macユーザー向けの記事が多い中、Windows(VSCode)での実際の操作手順を詳細に解説
- SAMテンプレート1ファイルで完結するシンプルな構成
- ハンズオン完了後のリソース削除手順まで含めた完全ガイド
- rate式とcron式の違い、rateベースとcronベースの使い分けも解説
前提条件
以下のツールがインストール・設定済みであることを確認してください。
必要なツール
| ツール | 確認コマンド | 最低バージョン目安 |
|---|---|---|
| AWS CLI v2 | aws --version | 2.x |
| AWS SAM CLI | sam --version | 1.x |
| Python | python --version | 3.12推奨 |
| Git | git --version | - |
| VSCode | - | 最新版推奨 |
AWS認証の確認
aws sts get-caller-identityアカウントIDが表示されれば認証設定済みです。表示されない場合は aws configure で認証情報を設定してください。
アーキテクチャと使用サービス
使用するAWSサービス
| サービス | 役割 | 料金 |
|---|---|---|
| EventBridge | スケジュールルールによる定期実行トリガー | 100万イベント/$1.00(無料枠あり) |
| Lambda | バッチ処理本体(Python) | 100万リクエスト無料枠あり |
| CloudWatch Logs | Lambda実行ログの保存 | 5GBまで無料 |
| S3 | SAMのデプロイパッケージ置き場 | 自動作成・少量なのでほぼ無料 |
学習目的の短時間ハンズオンであれば、ほぼ無料枠内で収まります。
ただし、rate(1 minute)は毎分実行されるためログが蓄積し続けます。ハンズオン完了後は必ずリソースを削除してください。
Step 1: プロジェクトフォルダを開く
VSCodeでプロジェクトフォルダを開きます。
cd C:\my-aws\aws-learning-projects\eventbridge-lambda-batchフォルダ構造
eventbridge-lambda-batch/
├── template.yaml # SAMテンプレート(Lambda・EventBridgeルール定義)
├── samconfig.toml # デプロイ設定(gitignore対象・毎回手動作成が必要)
├── docs/
│ ├── 1_console.md # AWSコンソール版手順
│ └── 2_sam.md # SAM版手順
└── src/
└── app.py # Lambda関数(実行日時と処理件数をログ出力)Step 2: SAMテンプレートの確認(template.yaml)
template.yaml はAWSリソース全体の設計図です。今回の構成は非常にシンプルで、Lambda関数の定義にスケジュールイベントを追加するだけです。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Scheduled Batch with EventBridge and Lambda
Globals:
Function:
Runtime: python3.12
Timeout: 30
MemorySize: 128
Resources:
BatchFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: src/
Handler: app.lambda_handler
Description: 1分ごとに自動実行されるバッチ関数
Events:
ScheduleEvent:
Type: Schedule # EventBridge スケジュールルールを自動作成
Properties:
Schedule: rate(1 minute) # 1分ごとに実行
Name: !Sub "${AWS::StackName}-schedule"
Enabled: true # ルールを有効化した状態で作成
Outputs:
BatchFunctionArn:
Description: "Lambda 関数 ARN"
Value: !GetAtt BatchFunction.Arn
ScheduleRuleName:
Description: "EventBridge スケジュールルール名"
Value: !Sub "${AWS::StackName}-schedule"
CloudWatchLogsGroup:
Description: "CloudWatch Logs グループ名"
Value: !Sub "/aws/lambda/${BatchFunction}"template.yaml のポイント解説
Type: Schedule
SAMが EventBridge のスケジュールルールと Lambda のリソースベースポリシーを自動作成します。コンソール版では「EventBridgeスケジュール作成」+「ターゲット設定」の2画面操作が必要ですが、SAMではこの1行で完結します。
rate(1 minute)
rate式でシンプルな繰り返しを定義します。rate(5 minutes) や rate(1 hour) も同じ書き方で対応できます。
Enabled: true
ルールをデプロイ直後から有効にします。false にするとデプロイ後に手動で有効化が必要です。
rate式とcron式の比較:
方式 SAMでの書き方 用途 rate式 rate(1 minute)「X分ごと」などシンプルな繰り返し cron式 cron(0 0 * * ? *)「毎日9時」など複雑なスケジュール cron式はUTC基準です。日本時間(JST = UTC+9)の朝9時は UTC の0時なので
cron(0 0 * * ? *)と書きます。1分ごとの繰り返しにはrate式が最もシンプルです。
Step 3: Lambdaコードの確認(src/app.py)
src/app.py がバッチ処理本体です。今回は実際の業務処理の代わりに「処理件数」をランダムに生成してログに出力するシミュレーションコードです。
import json
import datetime
import random
def lambda_handler(event, context):
now_utc = datetime.datetime.now(datetime.timezone.utc)
# JST(UTC+9)に変換
jst = datetime.timezone(datetime.timedelta(hours=9))
now_jst = now_utc.astimezone(jst)
# バッチ処理のシミュレーション(ランダムな処理件数)
processed_count = random.randint(10, 100)
result = {
"status": "success",
"executedAt": {
"utc": now_utc.isoformat(),
"jst": now_jst.strftime("%Y-%m-%d %H:%M:%S JST"),
},
"processedCount": processed_count,
"message": f"{processed_count}件の処理が完了しました",
"triggeredBy": event.get("source", "manual"), # EventBridgeからは "aws.scheduler"
}
print(json.dumps(result, ensure_ascii=False))
return resultapp.py のポイント解説
event.get("source", "manual")
EventBridge からの呼び出し時は event["source"] に "aws.scheduler" が入ります。Lambda コンソールから手動テスト実行した場合は event が空のため、デフォルト値の "manual" になります。この値をログで確認することで、自動実行されているかどうかを判断できます。
外部ライブラリ不使用
標準ライブラリ(json, datetime, random)のみ使用するため、requirements.txt が不要です。sam build もシンプルに完了します。
Step 4: samconfig.toml を作成する
samconfig.toml は .gitignore で管理外のため、毎回手動で作成する必要があります。
eventbridge-lambda-batch/samconfig.toml を新規作成して以下を貼り付けてください(VSCodeで新規ファイルを作成して保存)。
version = 0.1
[default.deploy.parameters]
stack_name = "eventbridge-lambda-batch-stack"
resolve_s3 = true
s3_prefix = "eventbridge-lambda-batch-stack"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"
disable_rollback = true
image_repositories = []
[default.global.parameters]
region = "ap-northeast-1"【注意】
samconfig.tomlの置き場所
eventbridge-lambda-batch/フォルダの直下に置く必要があります。
別のフォルダに置くと以下のエラーが発生します:Error: Missing option '--stack-name', 'sam deploy --guided' can be used to...
Step 5: sam build(ビルド)
cd C:\my-aws\aws-learning-projects\eventbridge-lambda-batch
sam build成功すると以下のように表示されます:
Build Succeeded
Built Artifacts : .aws-sam/build
Built Template : .aws-sam/build/template.yaml
Commands you can use next
=========================
[*] Validate SAM template: sam validate
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided外部ライブラリがない場合の注意:
src/にrequirements.txtがない構成でもsam buildは正常に完了します。
ライブラリが不要なシンプルな関数ではrequirements.txtは省略可能です。
Step 6: sam deploy(デプロイ)
sam deploy途中で変更内容が表示されて確認を求められます。
Deploy this changeset? [y/N]: yy を入力して進めます。数分でデプロイが完了します。
デプロイ完了の確認
ターミナルに Outputs が表示されます。
CloudFormation outputs from deployed stack
----------------------------------------------------------------------
Outputs
----------------------------------------------------------------------
Key BatchFunctionArn
Value arn:aws:lambda:ap-northeast-1:123456789012:function:eventbridge-lambda-batch-stack-BatchFunction-XXXX
Key ScheduleRuleName
Value eventbridge-lambda-batch-stack-schedule
Key CloudWatchLogsGroup
Value /aws/lambda/eventbridge-lambda-batch-stack-BatchFunction-XXXX
----------------------------------------------------------------------CloudWatchLogsGroup の値を控えておきます(ログ確認時に使います)。
初回または
samconfig.tomlがない場合:sam deploy --guidedで対話式に設定できます。Stack Name [sam-app]: eventbridge-lambda-batch-stack ← 入力 AWS Region [ap-northeast-1]: Enter Confirm changes before deploy [Y/n]: Y Allow SAM CLI IAM role creation [Y/n]: Y Disable rollback [y/N]: y Save arguments to configuration file [Y/n]: Y
samconfig.tomlが自動生成されます。
Step 7: CloudWatch Logs で動作確認
デプロイ直後から EventBridge ルールが有効になり、1分ごとに Lambda が自動実行されます。
7-1. ログの確認(AWS CLI)
Outputs で確認した CloudWatchLogsGroup の値を使ってログを確認します。
aws logs tail /aws/lambda/eventbridge-lambda-batch-stack-BatchFunction-XXXX --follow--follow オプションでリアルタイムにログを流し続けます(Ctrl+C で停止)。
ロググループ名が不明な場合:
aws logs describe-log-groups --log-group-name-prefix "/aws/lambda/eventbridge" --query "logGroups[*].logGroupName" --output text
7-2. 期待するログ出力
{"status": "success", "executedAt": {"utc": "2026-02-22T10:00:00.000000+00:00", "jst": "2026-02-22 19:00:00 JST"}, "processedCount": 57, "message": "57件の処理が完了しました", "triggeredBy": "aws.scheduler"}"triggeredBy": "aws.scheduler" となっていれば EventBridge から自動実行されています。
7-3. 実行間隔の確認
1分ごとにログストリームが追加されていくのを確認できます。ログに "triggeredBy": "aws.scheduler" が含まれていれば自動実行成功です。
Step 8: AWSコンソールで確認(任意)
デプロイしたリソースをコンソールから目視確認できます。
- Lambda: Lambda → 関数 →
eventbridge-lambda-batch-stack-BatchFunction-XXXX- 「モニタリング」タブ → 「呼び出し」グラフで実行回数が確認できます
- EventBridge: EventBridge → ルール →
eventbridge-lambda-batch-stack-schedule(有効状態を確認) - CloudWatch Logs: CloudWatch → ロググループ →
/aws/lambda/eventbridge-lambda-batch-stack-BatchFunction-XXXX→ 最新のログストリームを開く
Step 9: リソースの削除
課金を止めるために、ハンズオン完了後は必ずリソースを削除してください。
注意:
rate(1 minute)は毎分実行されるため、放置するとログが蓄積し続けます。ハンズオン完了後は速やかにsam deleteを実行してください。
sam delete --stack-name eventbridge-lambda-batch-stack --region ap-northeast-1対話式で確認が入ります。両方 y で進めます。
Are you sure you want to delete the stack eventbridge-lambda-batch-stack? [y/N]: y
Are you sure you want to delete the folder eventbridge-lambda-batch-stack in S3? [y/N]: y削除完了の確認
aws cloudformation describe-stacks --stack-name eventbridge-lambda-batch-stack --region ap-northeast-1An error occurred (ValidationError): Stack with id eventbridge-lambda-batch-stack does not existこのメッセージが表示されれば削除完了です。
ロググループは残ります:
sam deleteで Lambda・EventBridgeルール・IAMロールは削除されますが、CloudWatch Logs のロググループは残ります。不要なら手動で削除してください。aws logs delete-log-group --log-group-name /aws/lambda/eventbridge-lambda-batch-stack-BatchFunction-XXXX
トラブルシューティング
| 症状 | 原因 | 対処 |
|---|---|---|
sam build が失敗する | src/app.py が存在しない | src/ フォルダと app.py が正しい場所にあるか確認 |
sam deploy が Missing --stack-name エラー | samconfig.toml がない、または eventbridge-lambda-batch/ 直下にない | 正しい場所に samconfig.toml を作成する |
| ログが出力されない | デプロイ直後でまだ実行されていない | 最大1分待つ |
"triggeredBy" が "manual" になる | EventBridge からではなく手動テスト実行した | EventBridge ルールからの実行を待つ(最大1分) |
| Lambda が 500 エラー | コードの構文エラーなど | CloudWatch Logs でエラー内容を確認 |
まとめ
今回のハンズオンで実現したこと:
| 確認項目 | 内容 |
|---|---|
| SAMテンプレート | Type: Schedule + rate(1 minute) だけで定期実行を実現 |
| 自動実行の確認 | CloudWatch Logsで "triggeredBy": "aws.scheduler" を確認 |
| 削除 | sam delete 1コマンドで全リソースをクリーンアップ |
SAMのメリットを実感できたポイント
Type: Schedule1行で EventBridgeルール作成・Lambda連携・IAMポリシー付与まで自動処理sam delete1コマンドで Lambda・EventBridgeルール・IAMロール・S3を一括削除- コードをGit管理できるため、チームでの共有や再現が簡単
このハンズオンの発展形
この構成を基礎として、以下のような実務的なバッチ処理に発展させられます:
- DynamoDBとの組み合わせ — 定期的にデータ集計・古いデータの削除
- S3との組み合わせ — 日次でファイルを生成してS3に保存
- メール通知の追加 — SNS経由で処理結果をメール送信
- cron式への変更 — 「毎日9時に実行」など業務に合わせたスケジュール設定
コンソール操作と比較してみる
「SAMは便利だけど、裏で何をやっているのかわからない」と感じた方向けに、全く同じ構成をAWSコンソールのみで手動構築する手順を比較記事としてまとめました。
コンソール版で手動構築すると何が起きるか(一部抜粋):
| SAMの記述1行 | コンソールでやること |
|---|---|
Type: Schedule | EventBridgeスケジュール作成 → ターゲット設定(2画面) |
Enabled: true | スケジュールの状態を「有効」に設定 |
sam delete | EventBridgeスケジュール・Lambda・IAMロール×2を個別手動削除 |
- AWSコンソールだけでEventBridge + Lambda定期バッチを構築する手順【SAM版との比較付き】

コメント