PR

【AWS SAM】LambdaをAWS Schedulerで定期実行する最小構成テンプレート解説【再現性・拡張性重視】


【AWS SAM】LambdaをAWS Schedulerで定期実行する最小構成テンプレート解説【再現性・拡張性重視】

はじめに

本記事では、AWS SAM(Serverless Application Model) を活用し、Lambda関数をAWS Schedulerで定期実行する最小構成テンプレートについて、詳細に解説します。
本構成は「最短・最大効率で稼ぐ」ための再現性・自動化・拡張性を重視した設計となっており、月間定期処理や自動バッチなど、自動収益化ストリームの一部としても活用可能です。

テンプレート概要

以下のリソースを定義しています。

  • AWS Lambda関数(Python3.13)
  • CloudWatch Logs(ログ保持)
  • AWS Scheduler(スケジュール実行)
  • IAMロール(最小権限ポリシー)

この構成により、インフラ構築・運用コストを最小限に抑えながら、月次バッチ自動レポート作成など、様々な自動化タスクを構築できます。


各構成要素の詳細解説

1. Lambda関数

"Type": "AWS::Serverless::Function"
  • Runtime: Python3.13(最新安定版)
  • メモリ: 3008 MB(高性能設定)
  • タイムアウト: 10秒(短時間処理想定)
  • X-Rayトレーシング有効化Tracing: Active

評価:
適切なリソース割り当てで、短時間・高頻度処理に最適化されています。メモリ設定により並列処理性能を向上でき、実行コスト最適化に寄与します。

改善余地:
後述する「プロファイリング」によるメモリ最適化でさらにROI向上可能。


2. CloudWatch Log Group

"Type": "AWS::Logs::LogGroup"
  • DeletionPolicy: Retain(リソース削除後もログ保持)

評価:
トラブルシューティングや運用改善に必須のログが保持され、デバッグ効率向上に貢献。
また、ログベースでメトリクス作成やアラート設計にも展開可能。


3. AWS Scheduler設定

"Type": "AWS::Scheduler::Schedule"
  • CRON式: 毎月1日 3:30(Asia/Tokyo)
  • FlexibleTimeWindow: OFF(正確な時間指定)
  • Target: Lambda関数直接Invoke

評価:
新しいEventBridge Schedulerではなく、AWS Schedulerを選択しており、コスト効率が高い設計です。
また、Asia/Tokyoタイムゾーン対応により、ローカルタイム基準でのスケジュール管理が容易です。


4. IAMロール

"Type": "AWS::IAM::Role"
  • AssumeRole: Scheduler専用
  • 許可アクション: LambdaのInvokeFunctionのみ(最小権限設計)

評価:
**最小権限原則(Principle of Least Privilege)**に忠実。スケジュールターゲット(Lambda関数)のみに限定しているため、セキュリティリスクを最小化しています。


活用できるユースケース例

ユースケース説明期待できる成果
月次データ処理バッチ定期データ収集・変換・格納データ基盤自動化、運用コスト削減
自動レポート生成KPIレポート、売上分析などマネジメント向け資料自動化
リソース定期チェックAWSリソースの健全性診断インフラコスト最適化、障害予防
サブスクリプション更新通知月額サービスの更新処理顧客LTV向上、自動リテンション施策

テンプレートの強み(ROI・再現性・拡張性分析)

観点評価ポイント
ROI(投資対効果)初期コスト:無料枠内可能、運用コスト:Scheduler+Lambda数十円/月
再現性SAMテンプレートベースで簡単に再デプロイ・再利用可能
自動化スケジュール駆動型のため、運用者介入ゼロ
スケーラビリティLambdaのスケールアウト対応、トラフィック急増にも柔軟
セキュリティ最小権限設計、IAM管理適切、ログ保全も配慮
拡張性DynamoDB連携、S3出力、Step Functions連携など拡張容易

注意点と改善提案

  • メモリサイズ・タイムアウト最適化
    Lambdaプロファイラー(AWS ConsoleまたはAWS CLI)を使用して、実際の負荷に応じたリソース調整を行うことで、さらなるコスト最適化が可能です。
  • アラート設計推奨
    CloudWatchアラーム(エラー数、スロットリング検知)を併設し、障害検知を自動化することで運用監視コストをさらに削減できます。

LambdaをAWS Schedulerで定期実行する最小構成テンプレート全文

{
"Transform": "AWS::Serverless-2016-10-31",
"Resources": {
"Function": {
"Type": "AWS::Serverless::Function",
"Properties": {
"Description": {
"Fn::Sub": [
"Stack ${AWS::StackName} Function ${ResourceName}",
{
"ResourceName": "Function"
}
]
},
"CodeUri": "src/Function",
"Handler": "index.handler",
"Runtime": "python3.13",
"MemorySize": 3008,
"Timeout": 10,
"Tracing": "Active"
}
},
"FunctionLogGroup": {
"Type": "AWS::Logs::LogGroup",
"DeletionPolicy": "Retain",
"Properties": {
"LogGroupName": {
"Fn::Sub": "/aws/lambda/${Function}"
}
}
},
"Schedule": {
"Type": "AWS::Scheduler::Schedule",
"Properties": {
"ScheduleExpression": "cron(30 3 1 * *)",
"FlexibleTimeWindow": {
"Mode": "OFF"
},
"Target": {
"Arn": {
"Fn::GetAtt": [
"Function",
"Arn"
]
},
"RoleArn": {
"Fn::GetAtt": [
"ScheduleToFunctionRole",
"Arn"
]
}
},
"ScheduleExpressionTimezone": "Asia/Tokyo"
}
},
"ScheduleToFunctionRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Principal": {
"Service": {
"Fn::Sub": "scheduler.${AWS::URLSuffix}"
}
},
"Action": "sts:AssumeRole",
"Condition": {
"ArnLike": {
"aws:SourceArn": {
"Fn::Sub": [
"arn:${AWS::Partition}:scheduler:${AWS::Region}:${AWS::AccountId}:schedule/*/${AWS::StackName}-${ResourceId}-*",
{
"ResourceId": "Schedule"
}
]
}
}
}
}
},
"Policies": [
{
"PolicyName": "StartExecutionPolicy",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": {
"Fn::GetAtt": [
"Function",
"Arn"
]
}
}
]
}
}
]
}
}
}
}

まとめ

本テンプレートは、**AWSサーバーレス構成の「最小構成・最大効率」**を実現する強力なベースです。
少ない初期投資で定期タスクの自動化を行い、自動収益化ストリームの土台として非常に有用です。

次のステップとしては、この記事のテンプレートを起点に、

  • Step Functionsによるワークフロー拡張
  • DynamoDB、S3連携によるデータストア構築
  • CDK化・CI/CDパイプライン化によるさらに高い再現性・自動化

を目指すと、より大規模な自動化収益基盤に発展できます。


📚 参考文献


この形式でさらに「応用編」「CDK版」なども展開できますが、続きもご希望しますか?
(例:**「月10万円自動化ストリーム構築ロードマップ」**など)

コメント

タイトルとURLをコピーしました