AWSハンズオン - EventBridge + LambdaでCronバッチを自動実行しよう【SAM版 / Windows対応】

AWS Basic
スポンサーリンク
スポンサーリンク

はじめに

「定期的にデータを処理したい」「夜中に自動でバッチを動かしたい」と思ったことはありませんか?

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ベースの使い分けも解説

Amazon検索[本 AWS 開発]

スポンサーリンク

前提条件

以下のツールがインストール・設定済みであることを確認してください。

必要なツール

ツール確認コマンド最低バージョン目安
AWS CLI v2aws --version2.x
AWS SAM CLIsam --version1.x
Pythonpython --version3.12推奨
Gitgit --version-
VSCode-最新版推奨

AWS認証の確認

aws sts get-caller-identity

アカウントIDが表示されれば認証設定済みです。表示されない場合は aws configure で認証情報を設定してください。


スポンサーリンク

アーキテクチャと使用サービス

使用するAWSサービス

サービス役割料金
EventBridgeスケジュールルールによる定期実行トリガー100万イベント/$1.00(無料枠あり)
Lambdaバッチ処理本体(Python)100万リクエスト無料枠あり
CloudWatch LogsLambda実行ログの保存5GBまで無料
S3SAMのデプロイパッケージ置き場自動作成・少量なのでほぼ無料

学習目的の短時間ハンズオンであれば、ほぼ無料枠内で収まります。
ただし、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 result

app.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]: y

y を入力して進めます。数分でデプロイが完了します。

デプロイ完了の確認

ターミナルに 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-1
An 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 deployMissing --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: Schedule 1行で EventBridgeルール作成・Lambda連携・IAMポリシー付与まで自動処理
  • sam delete 1コマンドで Lambda・EventBridgeルール・IAMロール・S3を一括削除
  • コードをGit管理できるため、チームでの共有や再現が簡単

このハンズオンの発展形

この構成を基礎として、以下のような実務的なバッチ処理に発展させられます:

  • DynamoDBとの組み合わせ — 定期的にデータ集計・古いデータの削除
  • S3との組み合わせ — 日次でファイルを生成してS3に保存
  • メール通知の追加 — SNS経由で処理結果をメール送信
  • cron式への変更 — 「毎日9時に実行」など業務に合わせたスケジュール設定

コンソール操作と比較してみる

「SAMは便利だけど、裏で何をやっているのかわからない」と感じた方向けに、全く同じ構成をAWSコンソールのみで手動構築する手順を比較記事としてまとめました。

コンソール版で手動構築すると何が起きるか(一部抜粋):

SAMの記述1行コンソールでやること
Type: ScheduleEventBridgeスケジュール作成 → ターゲット設定(2画面)
Enabled: trueスケジュールの状態を「有効」に設定
sam deleteEventBridgeスケジュール・Lambda・IAMロール×2を個別手動削除
  • AWSコンソールだけでEventBridge + Lambda定期バッチを構築する手順【SAM版との比較付き】
AWSコンソールだけでEventBridge + Lambda定期バッチを構築する手順【SAM版との比較付き】
はじめにこの記事は、SAM版ハンズオン記事の比較版です。SAM版ではコマンド数本でインフラが完成しましたが、「その裏で何が起きているのか?」「SAMを使わない場合はどれだけ手間がかかるのか?」 を実感してもらうために、全く同じEventBr...

関連記事

Amazon検索[本 AWS 開発]

コメント