オンプレのバッチ構成と課題

典型的なオンプレのバッチ構成は以下の通りだ。

オンプレのバッチ構成
バッチサーバー(常時稼働・専用機)
  ├── 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つのアプローチで競合を回避できる。

DB競合回避の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作成は数秒〜数十秒で完了し、初期ストレージコストも最小限だ。

Aurora Clone を使ったバッチフロー(Step Functions)
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ネイティブで実現できる。

Step Functions の主要機能
オンプレ 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-AUTOEventBridge 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・監視設計)を示す。