オンプレのバッチ構成と課題
典型的なオンプレのバッチ構成は以下の通りだ。
バッチサーバー(常時稼働・専用機)
├── JP1 / A-AUTO / cron でスケジュール管理
├── シェルスクリプト + Java 実行
└── JDBC で直接 Oracle / PostgreSQL に接続
問題:
夜間バッチ実行中にAPが同じテーブルを更新
→ ロック待ち → タイムアウト → バッチ失敗 or APエラー
対策(オンプレでの工夫):
・バッチ実行中はAP側のメンテナンスウィンドウを設ける
・バッチ専用スキーマを作る
・SELECT FOR NOWAIT / SKIP LOCKED を使う
いずれも根本的な解決ではなく、運用でカバーしている状態
バッチ基盤の選定
AWSでのバッチ実行基盤は、バッチの性質によって使い分ける。
| バッチの性質 | 推奨サービス | 理由 |
|---|---|---|
| 定期実行・単純処理(数分以内) | Lambda + EventBridge Scheduler | 最もシンプル。5分制限に注意 |
| 定期実行・処理時間が長い(数十分) | ECS Scheduled Task + EventBridge | コンテナで自由にJavaバッチを動かせる |
| 複数ステップ・依存関係あり | Step Functions + ECS Task / Lambda | フロー可視化・リトライ・エラー分岐が強力 |
| 大量データの並列処理 | AWS Batch(Fargate Spot) | コスト最適・並列数を動的に制御 |
💡 ECS Scheduled Task = オンプレのcron相当
EventBridge Scheduler で cron 式(例:cron(0 2 * * ? *) = 毎日2時)を指定すると、その時刻にECSタスクが起動し処理が終わると終了する。バッチサーバーを常時稼働させる必要がない。
バッチとAPのDB競合回避設計
AWSでは以下の3つのアプローチで競合を回避できる。
【パターン1:Reader Endpoint分離(参照系バッチ)】
バッチ(参照のみ)→ Aurora Reader Endpoint
APサーバー → Aurora Writer Endpoint(更新)
→ バッチがReaderを使う限りWriterへの影響ゼロ
→ Replicaのレプリケーション遅延(数ms〜数十ms)を許容できる場合に有効
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【パターン2:時間帯スケジューリング(更新バッチ)】
夜間2:00〜5:00 → バッチ実行ウィンドウ
→ AP側のECSタスク数を最小(0〜1台)にスケールイン
→ バッチがWriterに集中してロック競合なし
→ EventBridge + ECS Auto Scaling で自動化可能
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【パターン3:Aurora Clone(本番無影響)】
① バッチ開始時に Aurora Clone を作成(ほぼ瞬時・コピーオンライト)
② バッチは Clone DB で処理(本番Aurora は無影響)
③ バッチ完了後 Clone を削除
→ 大量データの集計・帳票生成・分析バッチに最適
→ Cloneは本番の時点スナップショット(整合性が保たれる)
Aurora Clone — 本番無影響バッチ処理
Aurora Cloneは、本番DBを瞬時に複製してバッチ専用のDBを作る機能だ。コピーオンライト方式なので、Clone作成は数秒〜数十秒で完了し、初期ストレージコストも最小限だ。
EventBridge Scheduler(毎日 AM 2:00)
↓
Step Functions ステートマシン起動
│
├─ State 1: Aurora Clone 作成
│ aws rds restore-db-cluster-to-point-in-time
│ --restore-type copy-on-write
│ --source-db-cluster-identifier prod-cluster
│ → Clone エンドポイントを取得
│
├─ State 2: バッチ ECS Task 起動
│ 環境変数 DB_URL=Clone Endpoint を注入
│ → Clone DB で集計・帳票生成 → S3 に出力
│
├─ State 3: SNS 完了通知(メール)
│
└─ State 4: Clone 削除
→ ストレージコスト精算終了
💡 Aurora Clone のコスト
Clone は作成時点でストレージを共有するため初期コストはほぼゼロ。その後Clone側で変更が加わった分のみ別ストレージとして課金される。集計・読み取り専用バッチであれば非常に安価に運用できる。
Step Functionsによるフロー制御
複雑なバッチフローの管理は Step Functions が最も強力だ。オンプレのJP1のような商用ジョブスケジューラに相当する機能をAWSネイティブで実現できる。
オンプレ JP1/A-AUTO 機能 Step Functions での対応
─────────────────────────────────────────────────────
ジョブネット定義 ステートマシン定義(JSON/YAML)
先行ジョブ待ち 次状態への遷移条件
リトライ設定 Retry設定(回数・間隔・バックオフ)
エラー時の後続スキップ Catch設定(エラー種別ごとに分岐)
実行履歴の管理 Step Functions 実行履歴(90日保持)
ジョブ実行状況の可視化 AWS コンソール上でフローをグラフ表示
異常終了通知 EventBridge + SNS でメール / Slack通知
コスト面:常時稼働 vs 実行時のみ
| 項目 | オンプレ(バッチ専用サーバー) | AWS(ECS Task / Fargate) |
|---|---|---|
| サーバーコスト | 24時間365日稼働の固定費 | バッチ実行中のみ課金 |
| スケール | サーバースペック固定 | 必要な時だけFargate Spot等で大量起動 |
| メンテナンス | OS・ミドルウェアの定期更新が必要 | コンテナイメージの更新のみ |
| コスト最適化 | 難しい(常時稼働が前提) | Fargate Spot使用で最大70%削減可能 |
対比表
| 項目 | オンプレ | AWS |
|---|---|---|
| スケジューラ | cron / JP1 / A-AUTO | EventBridge Scheduler |
| 実行基盤 | バッチ専用サーバー(常時稼働) | ECS Task / AWS Batch(実行時のみ起動) |
| フロー制御 | シェルスクリプト / JP1ジョブネット | Step Functions(可視化・リトライ・エラー分岐) |
| 並列処理 | サーバースペック依存 | AWS Batch(動的スケール・Spot活用) |
| DB競合(参照系) | AP と同一DB・競合リスクあり | Aurora Reader Endpoint 分離 |
| DB競合(大量処理) | メンテウィンドウで回避 | Aurora Clone(本番無影響) |
| 障害時の再実行 | 手動 or JP1リトライ設定 | Step Functions 自動リトライ / Dead Letter Queue |
ハマりポイント
⚠️ ECS Task のタイムアウトに注意
ECS Fargate には1タスクあたりのタイムアウト上限はないが、Step Functions のタスクステートにはデフォルトタイムアウト(heartbeatSeconds)がある。長時間バッチでは HeartbeatSeconds を適切に設定するか、Activity Task パターンを使うこと。
⚠️ Aurora Clone はリージョンをまたげない
Aurora Clone は同一リージョン内でのみ作成できる。DR構成でマルチリージョン展開している場合、Clone先も同じリージョンになる。クロスリージョンのバッチが必要な場合はスナップショットのリストアを検討すること。
✅ 次の記事では…
PART 07 では本シリーズのまとめとして、オンプレとAWSの設計思想の違いを整理し、移行時の全体的な注意点と次のステップ(IaC・CI/CD・監視設計)を示す。