目次

AWS Batch 完全ガイド v2.0

初心者から実務者向けの包括的解説


ドキュメントの目的

本ガイドは以下を対象としています。

  • 初心者向け: AWS Batch とは何か、バッチジョブの自動化とは何かを学びたい方
  • 開発者・SRE 向け: ジョブキューの構成、コンピューティング環境のセットアップ、ジョブ依存関係の実装を習得したい方
  • データエンジニア向け: 大規模データ処理パイプライン(ETL)、機械学習訓練ジョブの並列実行、ゲノミクス解析を実装したい方
  • アーキテクト向け: Batch vs Lambda vs ECS vs Kubernetes の選定基準、マルチノード並列処理の設計を理解したい方

2026 年の AWS Batch エコシステム

  • SageMaker Training Job Queuing:AWS Batch で ML 訓練ジョブをキュー管理。データサイエンティストが優先度付きで投入可能
  • EKS クラスターのジョブキューイング:EC2・Fargate・EKS にまたがるワークロード統合管理
  • Spot Capacity Rebalancing:スポットインスタンスの中断警告に自動対応。置換インスタンスを事前起動
  • Fair-Share Scheduling:マルチテナント環境で複数チームのジョブ公平配分(Share Identifier で優先度制御)
  • 多言語ランタイムサポート:Python / Node.js / Java / Go などのコンテナイメージで即実行可能
  • Optical Data Center Regions (ODCR): Local Zones・Outposts に Batch 対応(2025 年 7 月以降)

目次

  1. 概要
  2. このサービスを選ぶ理由
  3. AWS Batch が解決する課題
  4. 主な特徴
  5. アーキテクチャ
  6. コアコンポーネント詳細
  7. コンピューティング環境の選択
  8. ジョブ定義とキュー
  9. ジョブ依存関係と DAG
  10. 配列ジョブ(Array Jobs)
  11. マルチノード並列ジョブ
  12. Fair-Share Scheduling
  13. Spot Instance 統合
  14. SageMaker Training Job Queuing
  15. 主要ユースケース
  16. 設定・操作の具体例
  17. 他の類似ツール・サービスとの比較
  18. ベストプラクティス
  19. トラブルシューティング
  20. 2025-2026 最新動向
  21. 学習リソース
  22. 実装例
  23. チェックリスト
  24. まとめ
  25. 参考文献

概要

AWS Batch は、クラウドで大規模バッチコンピューティングワークロードを効率的に実行するための完全マネージドサービス です。Batch は、ジョブキュー・コンピューティング環境・ジョブ定義の 3 要素を設定するだけで、EC2 インスタンス、Fargate リソース、EKS クラスター、さらには SageMaker Training ジョブをシームレスに管理します。AWS Batch 自体は無料。課金されるのは、起動した EC2・Fargate・EKS のコンピューティングリソースのみです。

このサービスを選ぶ理由

課題 従来の手動管理 AWS Batch での解決
ジョブスケジューリング 手動でジョブのキューイング・実行順序を管理 Batch がキュー・優先度・依存関係を完全管理
インフラ容量確保 ピーク時の容量を事前予測して確保(無駄) 自動スケーリング・オンデマンド起動。使った分のみ課金
スポットインスタンス 手動で中断対応・置換 Capacity Rebalancing で自動対応・チェックポイント保存機構
マルチノード並列 MPI クラスタの手動セットアップ Gang Scheduling で自動配置・ネットワーク管理
複雑な DAG ワークフロー Step Functions や Airflow を別途導入 Job Dependencies(N:1 ファンイン対応)
コスト最適化 スポット・オンデマンド混在の管理複雑 Mixed Allocation Strategy で自動最適化

具体的なユースケース

  • 毎日の大規模 ETL パイプライン:数百 GB の CSV を Apache Spark で Parquet に変換
  • ゲノム解析:WGS アライメント → バリアント呼び出しの多段並列処理(数千 CPU-hour)
  • 機械学習ハイパーパラメータチューニング:GridSearch / Random Search で数百〜数千ジョブ並列実行
  • 3D ムービーレンダリング:フレーム単位で数千ジョブ並列処理
  • 金融シミュレーション:モンテカルロシミュレーション(リスク計算)を数万ジョブで実行
  • 定期的なコンプライアンス監査:CloudTrail ログの分析を毎週夜間実行
  • SageMaker ML 訓練ジョブの優先度管理:複数チームのモデル訓練ジョブを公平配分

AWS Batch が解決する課題

  1. インフラのプロビジョニング複雑性:Batch が EC2・Fargate・EKS を自動管理。ユーザーはジョブ定義に集中
  2. スケーリング遅延:キュー内のジョブ数に応じて秒単位でコンピューティングリソースを起動
  3. スポット中断対応:Capacity Rebalancing が中断前のジョブを別インスタンスに移行。チェックポイント保存で再開可能
  4. 複雑なジョブ依存関係:DAG 形式の N:1 ファンイン(複数ジョブ完了後に 1 つのジョブ実行)を自動化
  5. マルチテナント・公平スケジューリング:Fair-Share Scheduling で複数チーム・ユーザーのジョブを公平配分
  6. モニタリング・ロギング統合:CloudWatch Logs、X-Ray、EventBridge と自動連携
  7. ML 訓練ジョブ管理:SageMaker Training Job Queuing で複数訓練タスクを統合管理

主な特徴

  • 完全マネージドジョブスケジューリング:ユーザーはコンテナイメージ定義に集中
  • マルチコンピューティング環境対応:EC2(オンデマンド・スポット)、Fargate、EKS、EKS on Outposts
  • 自動スケーリング:Batch Compute Environment がキュー内のジョブ数に応じて自動スケール
  • ジョブ依存関係(DAG):複数ジョブの順序・並列実行を JSON で定義
  • 配列ジョブ:1 つのジョブ定義を数千並列で実行(パラメータ変更)
  • マルチノード並列(MNP):複数 EC2 インスタンスで MPI ジョブを gang scheduling
  • Fair-Share Scheduling:Share Identifier で複数チームのジョブ公平配分
  • Spot Capacity Rebalancing:スポット中断を自動検知・置換
  • リトライ戦略:自動リトライ、条件付きリトライ(特定終了コードのみ)
  • CloudWatch / X-Ray / EventBridge 統合:エンタープライズグレードの可視化
  • SageMaker Training Job 統合:ML エンジニア向けのキューイング機構
  • Warm Pool(計画中):停止インスタンスを事前準備してコールドスタート回避

アーキテクチャ

graph TB
    subgraph Users["Users & Applications"]
        Dev["Developer<br/>Job Submission"]
        ML["ML Engineer<br/>SageMaker Jobs"]
        DSD["Data Scientist<br/>Array Jobs"]
    end
    
    subgraph BatchControl["AWS Batch Control Plane"]
        JobSub["Job Submission<br/>(AWS CLI / SDK / Console)"]
        Scheduler["Batch Scheduler<br/>Priority + Fair-Share"]
        Monitor["Monitoring & Logging<br/>(CloudWatch / X-Ray)"]
    end
    
    subgraph JobQueue["Job Queue (Priority-based)"]
        Q1["Queue Priority 100<br/>(High-Priority Jobs)"]
        Q2["Queue Priority 50<br/>(Standard Jobs)"]
        Q3["Queue Priority 1<br/>(Low-Priority)"]
    end
    
    subgraph ComputeEnv["Compute Environments"]
        EC2On["EC2 On-Demand<br/>(Persistent jobs)"]
        EC2Spot["EC2 Spot<br/>(Batch processing)"]
        Fargate["Fargate<br/>(Serverless)"]
        EKS["EKS<br/>(Kubernetes)"]
    end
    
    subgraph JobTypes["Job Execution Types"]
        Single["Single Container<br/>Job"]
        Array["Array Job<br/>N parallel"]
        MNP["Multi-Node Parallel<br/>MPI jobs"]
        DAG["DAG Workflow<br/>Dependent Jobs"]
    end
    
    subgraph Integration["Integration Layer"]
        ECR["Amazon ECR<br/>(Container Images)"]
        SM["SageMaker<br/>(ML Training)"]
        SF["Step Functions<br/>(Orchestration)"]
        EV["EventBridge<br/>(Events)"]
    end
    
    Users --> JobSub
    JobSub --> Scheduler
    Scheduler --> JobQueue
    JobQueue --> ComputeEnv
    ComputeEnv --> JobTypes
    JobTypes --> Integration
    Scheduler --> Monitor
    
    EC2Spot -.Capacity Rebalancing.-> EC2On
    
    style Users fill:#e1f5fe
    style BatchControl fill:#f3e5f5
    style ComputeEnv fill:#e8f5e9
    style Integration fill:#fff3e0

コアコンポーネント詳細

1. Compute Environment(コンピューティング環境)

EC2・Fargate・EKS リソースを管理するプール。3 種類の管理タイプがあります。

タイプ 説明 用途
MANAGED Batch が自動でリソース起動・削除を管理 推奨。ほぼすべてのケース
UNMANAGED ユーザーが EC2 インスタンスを手動管理 レガシーシステム統合。非推奨
SPOT_FLEET スポットインスタンスで最大コスト削減(75-90%) 中断許容ジョブ

MANAGED Compute Environment の詳細設定

aws batch create-compute-environment \
  --compute-environment-name batch-prod-env \
  --type MANAGED \
  --state ENABLED \
  --compute-resources '{
    "type": "SPOT",  # EC2 / SPOT / FARGATE / FARGATE_SPOT
    "allocationStrategy": "SPOT_CAPACITY_OPTIMIZED",
    "minvCpus": 0,
    "maxvCpus": 512,
    "desiredvCpus": 0,
    "instanceTypes": ["optimal"],  # m6i / c6i / r6i など
    "subnets": ["subnet-1a", "subnet-1c"],
    "securityGroupIds": ["sg-batch"],
    "instanceRole": "arn:aws:iam::123456789012:instance-profile/ecsInstanceRole",
    "spotIamFleetRole": "arn:aws:iam::123456789012:role/AmazonEC2SpotFleetRole",
    "bidPercentage": 60,
    "spotIamFleetRole": "arn:aws:iam::123456789012:role/AmazonEC2SpotFleetRole",
    "tags": {
      "Environment": "production",
      "CostCenter": "engineering"
    }
  }' \
  --service-role arn:aws:iam::123456789012:role/AWSBatchServiceRole

2. Job Queue(ジョブキュー)

ジョブを受け付けるキュー。1 つ以上の Compute Environment にマップされます。

属性 説明
Priority キュー間の優先度(1-1000)。高いほど優先
Compute Environment Order 複数の Compute Environment をリスト。上から順に割り当て試行
ENABLED / DISABLED キューの有効・無効切り替え
Scheduling Priority Fair-Share Scheduling の Share Identifier による優先度

3. Job Definition(ジョブ定義)

コンテナ実行の仕様書。以下の要素を定義:

  • Container Image:ECR イメージ URI
  • vCPU / Memory:リソース要件
  • IAM Role:ジョブがアクセスする AWS リソース権限
  • Environment Variables:設定値
  • Secrets:Secrets Manager・Systems Manager Parameter Store からの機密情報
  • Retry Strategy:リトライ回数・条件(特定終了コードのみなど)
  • Log Configuration:CloudWatch Logs グループ・ストリーム
  • Timeout:ジョブ最大実行時間(秒)
  • Mount Points:EBS・EFS マウント設定(Fargate では限定的)
  • GPU:GPU インスタンス(p3 / p4d)での GPU リソース指定

4. Job(ジョブ)

Batch に投入する実行単位。Job Definition に基づいて起動されます。

ジョブ状態 説明
SUBMITTED キューに投入直後
PENDING Compute Environment のリソース割り当て待ち
RUNNABLE リソース確保済み。起動待ち
STARTING コンテナ起動中
RUNNING 実行中
SUCCEEDED 正常完了(終了コード 0)
FAILED 失敗(終了コード 0 以外)
RUNNABLERUNNING:通常 10-30 秒(Spot は +60-120 秒)

コンピューティング環境の選択

EC2(オンデマンド・スポット混在)

# 混合インスタンスポリシー(推奨:コスト最適化 + 可用性)
aws batch create-compute-environment \
  --compute-environment-name batch-ec2-mixed \
  --type MANAGED \
  --compute-resources '{
    "type": "SPOT",
    "allocationStrategy": "SPOT_CAPACITY_OPTIMIZED",  # スポット中断リスク最小化
    "minvCpus": 0,
    "maxvCpus": 256,
    "desiredvCpus": 0,
    "instanceTypes": ["m6i.large", "m6i.xlarge", "m5.large", "m5.xlarge"],
    "bidPercentage": 70,  # スポット価格が On-Demand の 70% 以上なら EC2 On-Demand に切り替え
    "spotIamFleetRole": "arn:aws:iam::123456789012:role/AmazonEC2SpotFleetRole"
  }'

Fargate(サーバーレス、シンプル)

# Fargate 環境(GPU 非対応。最大 30GB メモリ)
aws batch create-compute-environment \
  --compute-environment-name batch-fargate \
  --type MANAGED \
  --compute-resources '{
    "type": "FARGATE",
    "maxvCpus": 256,
    "subnets": ["subnet-1a", "subnet-1c"],
    "securityGroupIds": ["sg-fargate"]
  }'

EKS(Kubernetes ネイティブ)

# EKS クラスター上での Batch(自動スケーリング対応)
aws batch create-compute-environment \
  --compute-environment-name batch-eks \
  --type MANAGED \
  --compute-resources '{
    "type": "EC2",
    "eks_configuration": {
      "eksClusterArn": "arn:aws:eks:ap-northeast-1:123456789012:cluster/my-cluster",
      "kubernetesNamespace": "batch-namespace"
    }
  }'

ジョブ定義とキュー

ジョブ定義の登録(Fargate)

aws batch register-job-definition \
  --job-definition-name data-etl-job \
  --type container \
  --platform-capabilities FARGATE \
  --container-properties '{
    "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/data-etl:v1.0",
    "resourceRequirements": [
      {"type": "VCPU", "value": "2"},
      {"type": "MEMORY", "value": "4096"}
    ],
    "jobRoleArn": "arn:aws:iam::123456789012:role/BatchJobRole",
    "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
    "logConfiguration": {
      "logDriver": "awslogs",
      "options": {
        "awslogs-group": "/aws/batch/jobs",
        "awslogs-region": "ap-northeast-1",
        "awslogs-stream-prefix": "etl"
      }
    },
    "environment": [
      {"name": "ENVIRONMENT", "value": "production"},
      {"name": "S3_BUCKET", "value": "my-data-bucket"}
    ],
    "secrets": [
      {
        "name": "DB_PASSWORD",
        "valueFrom": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:db-password"
      }
    ],
    "fargatePlatformConfiguration": {
      "platformVersion": "LATEST"
    }
  }' \
  --retry-strategy '{
    "attempts": 3,
    "evaluateOnExit": [
      {
        "onReason": "OutOfMemory",
        "action": "EXIT"
      },
      {
        "onExitCode": "1",
        "action": "RETRY"
      }
    ]
  }' \
  --timeout 3600  # 最大 1 時間で timeout

ジョブキューの作成

# ジョブキューの作成(優先度付き)
aws batch create-job-queue \
  --job-queue-name high-priority-queue \
  --priority 100 \
  --compute-environment-order '[
    {"order": 1, "computeEnvironment": "batch-ec2-mixed"}
  ]'

# ジョブの投入
aws batch submit-job \
  --job-name etl-run-20260101 \
  --job-queue high-priority-queue \
  --job-definition data-etl-job \
  --container-overrides '{
    "environment": [
      {"name": "BATCH_DATE", "value": "2026-01-01"},
      {"name": "MODE", "value": "incremental"}
    ],
    "resourceRequirements": [
      {"type": "VCPU", "value": "4"},
      {"type": "MEMORY", "value": "8192"}
    ]
  }'

# ジョブ状態確認
aws batch describe-jobs --jobs job-0123456789abcdef0

ジョブ依存関係と DAG

依存関係の定義(JSON)

# ジョブ A, B, C が完了後に ジョブ D を実行
aws batch submit-job \
  --job-name job-d \
  --job-queue my-queue \
  --job-definition my-job-def \
  --depends-on '[
    {"jobId": "job-a-id"},
    {"jobId": "job-b-id"},
    {"jobId": "job-c-id"}
  ]'

# 依存関係確認
aws batch describe-jobs --jobs job-d-id

Step Functions での DAG オーケストレーション

{
  "Comment": "Batch ETL Pipeline DAG",
  "StartAt": "ExtractData",
  "States": {
    "ExtractData": {
      "Type": "Task",
      "Resource": "arn:aws:states:::batch:submitJob.sync",
      "Parameters": {
        "JobName": "extract",
        "JobDefinition": "extract-job-def",
        "JobQueue": "my-queue"
      },
      "Next": "TransformData",
      "Catch": [{"ErrorEquals": ["States.ALL"], "Next": "HandleError"}]
    },
    "TransformData": {
      "Type": "Task",
      "Resource": "arn:aws:states:::batch:submitJob.sync",
      "Parameters": {
        "JobName": "transform",
        "JobDefinition": "transform-job-def",
        "JobQueue": "my-queue"
      },
      "Next": "ParallelLoad"
    },
    "ParallelLoad": {
      "Type": "Parallel",
      "Branches": [
        {
          "StartAt": "LoadDB",
          "States": {
            "LoadDB": {
              "Type": "Task",
              "Resource": "arn:aws:states:::batch:submitJob.sync",
              "Parameters": {
                "JobName": "load-db",
                "JobDefinition": "load-db-job-def",
                "JobQueue": "my-queue"
              },
              "End": true
            }
          }
        },
        {
          "StartAt": "LoadCache",
          "States": {
            "LoadCache": {
              "Type": "Task",
              "Resource": "arn:aws:states:::batch:submitJob.sync",
              "Parameters": {
                "JobName": "load-cache",
                "JobDefinition": "load-cache-job-def",
                "JobQueue": "my-queue"
              },
              "End": true
            }
          }
        }
      ],
      "Next": "Success"
    },
    "Success": {
      "Type": "Succeed"
    },
    "HandleError": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:notify-error",
      "End": true
    }
  }
}

配列ジョブ(Array Jobs)

1 つのジョブ定義を複数パラメータで並列実行。

# 配列ジョブの投入(0-999 で 1000 並列)
aws batch submit-job \
  --job-name image-processing-array \
  --job-queue my-queue \
  --job-definition image-processor-job \
  --array-properties '{
    "size": 1000  # 0-999 の 1000 並列実行
  }' \
  --container-overrides '{
    "environment": [
      {"name": "ARRAY_INDEX", "value": "AWS_BATCH_ARRAY_INDEX"}
    ]
  }'

# コンテナ内での使用(例:Python)
import os
array_index = os.getenv('AWS_BATCH_ARRAY_INDEX')
image_id = f"image-{array_index:05d}.jpg"
# 該当イメージを処理

配列ジョブの最大並列数:10,000 個


マルチノード並列ジョブ

複数 EC2 インスタンスにまたがる MPI(Message Passing Interface)ジョブ。

# マルチノード並列ジョブ定義の登録
aws batch register-job-definition \
  --job-definition-name mpi-simulation-job \
  --type container \
  --container-properties '{
    "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/mpi-app:latest",
    "resourceRequirements": [
      {"type": "VCPU", "value": "8"},
      {"type": "MEMORY", "value": "16384"}
    ],
    "jobRoleArn": "arn:aws:iam::123456789012:role/BatchJobRole"
  }' \
  --node-properties '{
    "mainNode": 0,
    "numNodes": 4,  # 4 ノード(マスター 1 + ワーカー 3)
    "nodeRangeProperties": [
      {
        "targetNodes": "0:",
        "container": {
          "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/mpi-app:latest",
          "resourceRequirements": [
            {"type": "VCPU", "value": "8"},
            {"type": "MEMORY", "value": "16384"}
          ]
        }
      }
    ]
  }'

# マルチノード並列ジョブの投入
aws batch submit-job \
  --job-name mpi-job-20260101 \
  --job-queue my-queue \
  --job-definition mpi-simulation-job \
  --node-overrides '{
    "numNodes": 8  # ランタイムで 8 ノードに変更
  }'

注意:

  • EC2 コンピューティング環境のみ対応(Fargate・EKS は非対応)
  • Spot インスタンス非対応(オンデマンドのみ)
  • 複数 AZ にまたがる配置はサポートされない(同一 AZ 内)

Fair-Share Scheduling

複数チーム・ユーザーのジョブを公平に配分するスケジューリング方式。

# スケジューリングポリシーの作成
aws batch create-scheduling-policy \
  --policy-name team-fair-share \
  --fair-share-policy '{
    "shareDecaySeconds": 3600,  # 1 時間の減衰時間
    "computeReservation": 80,   # 各チームが最大 80% リソース使用可
    "shareDistribution": [
      {
        "shareIdentifier": "team-a",
        "weightFactor": 1.0
      },
      {
        "shareIdentifier": "team-b",
        "weightFactor": 2.0  # team-b が team-a の 2 倍リソース取得
      },
      {
        "shareIdentifier": "team-c",
        "weightFactor": 0.5  # team-c が team-a の 1/2 リソース
      }
    ]
  }'

# ジョブ投入時に Share Identifier を指定
aws batch submit-job \
  --job-name team-a-analysis \
  --job-queue fair-share-queue \
  --job-definition analytics-job \
  --scheduling-priority-override 50 \
  --share-identifier team-a

Spot Instance 統合

Spot Capacity Rebalancing

スポットインスタンスの中断警告を自動検知し、置換インスタンスを事前起動。

# スポット対応のコンピューティング環境
aws batch create-compute-environment \
  --compute-environment-name batch-spot-rebalance \
  --type MANAGED \
  --compute-resources '{
    "type": "SPOT",
    "allocationStrategy": "SPOT_CAPACITY_OPTIMIZED",
    "bidPercentage": 60,
    "spotIamFleetRole": "arn:aws:iam::123456789012:role/AmazonEC2SpotFleetRole",
    "tags": {
      "SpotRebalanceEnabled": "true"
    }
  }'

# ジョブ定義でチェックポイント機構を実装
aws batch register-job-definition \
  --job-definition-name checkpoint-job \
  --type container \
  --container-properties '{
    "image": "my-app:checkpoint",
    "environment": [
      {"name": "CHECKPOINT_DIR", "value": "/mnt/checkpoint"}
    ]
  }'

Spot 中断対策:

  • SIGTERM シグナルハンドリング(2 分前に通知)
  • 定期チェックポイント(30 秒ごと)
  • メタデータサービスの spot/instance-action エンドポイント監視

SageMaker Training Job Queuing

AWS Batch で SageMaker Training ジョブを優先度付きで管理。

# Batch コンピューティング環境で SageMaker Training をサポート
aws batch create-compute-environment \
  --compute-environment-name batch-sagemaker \
  --type MANAGED \
  --compute-resources '{
    "type": "EC2",
    "minvCpus": 0,
    "maxvCpus": 512,
    "instanceTypes": ["p3.8xlarge", "p4d.24xlarge"]
  }' \
  --service-role arn:aws:iam::123456789012:role/AWSBatchServiceRole

# SageMaker Training Job を Batch 経由で投入
aws sagemaker create-training-job \
  --training-job-name ml-training-20260101 \
  --role-arn arn:aws:iam::123456789012:role/SageMakerRole \
  --algorithm-specification '{
    "TrainingImage": "382416733822.dkr.ecr.ap-northeast-1.amazonaws.com/xgboost:latest",
    "TrainingInputMode": "File"
  }' \
  --input-data-config '[
    {
      "ChannelName": "training",
      "DataSource": {
        "S3DataSource": {
          "S3Uri": "s3://my-bucket/training-data",
          "S3DataType": "S3Prefix",
          "S3DataDistributionType": "FullyReplicated"
        }
      }
    }
  ]' \
  --output-data-config '{
    "S3OutputPath": "s3://my-bucket/output"
  }' \
  --resource-config '{
    "InstanceType": "ml.p3.8xlarge",
    "InstanceCount": 1,
    "VolumeSizeInGB": 50
  }' \
  --stopping-condition '{"MaxRuntimeInSeconds": 86400}'

主要ユースケース(12 個以上)

1. 日次 ETL パイプライン

# 毎日 2:00 AM に大規模データ変換
aws events put-rule \
  --name daily-etl \
  --schedule-expression "cron(0 2 * * ? *)"

aws events put-targets \
  --rule daily-etl \
  --targets "Id"="1","Arn"="arn:aws:batch:ap-northeast-1:123456789012:job-queue/etl-queue","RoleArn"="arn:aws:iam::123456789012:role/EventBridgeRole"

2. ゲノム解析パイプライン(多段並列)

  • Step 1: FASTQ ファイルをアライメント(BWA-MEM)→ BAM 生成
  • Step 2: バリアント呼び出し(HaplotypeCaller)→ VCF 生成
  • Step 3: アノテーション(VEP)
  • Job Dependencies で順序管理

3. 機械学習ハイパーパラメータチューニング

  • 配列ジョブで数百の異なるハイパーパラメータで SageMaker Training 実行
  • 結果を S3 に保存
  • 最高精度モデルを自動選択

4. 3D ムービーレンダリング

  • フレーム単位で数千ジョブ並列化
  • 配列ジョブで AWS_BATCH_ARRAY_INDEX をフレーム番号に割り当て

5. 定期ログ分析(CloudTrail / VPC Flow Logs)

  • AWS Lambda + EventBridge Scheduler で毎日実行
  • CloudWatch Logs に検索結果を集約

6. コンプライアンス監査

  • 週間監査ジョブ:全 EC2・IAM・S3 リソースのスキャン
  • Security Hub と連携

7. 金融シミュレーション(モンテカルロ)

  • オプション価格計算・リスク評価
  • 数万並列で数百万シミュレーション実行

8. ビッグデータ分析(Apache Spark)

  • EMR Serverless ジョブを Batch キューイング経由で実行
  • Spark クラスターのセットアップ自動化

9. マルチテナント優先度管理

  • Fair-Share Scheduling で複数顧客のジョブを公平配分
  • 各顧客の Share Identifier で SLA 管理

10. バッチ推論(モデル予測)

  • 大規模な新規データセット(TB 級)に対して訓練モデルで予測実行
  • 配列ジョブで小分け

11. バックアップ・データベース操作

  • 定期データベースバックアップ
  • 大規模テーブルの再インデックス

12. 開発環境のテスト・ビルド

  • コード変更時に CI/CD から Batch ジョブ投入
  • マルチリージョンテスト並列実行

設定・操作の具体例

CLI での基本的なジョブ投入フロー

# 1. ジョブ定義の確認
aws batch describe-job-definitions \
  --job-definition-name my-job-def \
  --status ACTIVE

# 2. ジョブキューの確認
aws batch describe-job-queues \
  --query 'jobQueues[*].{Name:jobQueueName,Status:state,Priority:priority}'

# 3. ジョブ投入
aws batch submit-job \
  --job-name my-job-20260101 \
  --job-queue my-queue \
  --job-definition my-job-def

# 4. ジョブ状態監視
aws batch list-jobs \
  --job-queue my-queue \
  --job-status RUNNING

# 5. 詳細ログ確認
aws logs tail /aws/batch/jobs --follow

Python SDK での配列ジョブ投入

import boto3

batch = boto3.client('batch', region_name='ap-northeast-1')

response = batch.submit_job(
    jobName='image-processing-array',
    jobQueue='my-queue',
    jobDefinition='image-processor-job',
    arrayProperties={
        'size': 1000  # 1000 並列
    },
    containerOverrides={
        'environment': [
            {
                'name': 'IMAGE_ID',
                'value': 'AWS_BATCH_ARRAY_INDEX'
            }
        ]
    }
)

job_id = response['jobId']
print(f"Submitted job {job_id}")

# ジョブ完了待機
waiter = batch.get_waiter('job_completed')
waiter.wait(jobs=[job_id])

CloudFormation での Batch 環境構築

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  BatchServiceRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: batch.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSBatchServiceRole

  ComputeEnvironment:
    Type: AWS::Batch::ComputeEnvironment
    Properties:
      ComputeEnvironmentName: batch-prod
      Type: MANAGED
      State: ENABLED
      ComputeResources:
        Type: SPOT
        AllocationStrategy: SPOT_CAPACITY_OPTIMIZED
        MinvCpus: 0
        MaxvCpus: 512
        InstanceTypes:
          - m6i.large
          - m6i.xlarge
        Subnets:
          - subnet-xxxxx
        SecurityGroupIds:
          - sg-xxxxx
        InstanceRole: arn:aws:iam::123456789012:instance-profile/ecsInstanceRole
        BidPercentage: 60
      ServiceRole: !GetAtt BatchServiceRole.Arn

  JobQueue:
    Type: AWS::Batch::JobQueue
    Properties:
      JobQueueName: prod-queue
      Priority: 100
      ComputeEnvironmentOrder:
        - Order: 1
          ComputeEnvironment: !Ref ComputeEnvironment

  JobDefinition:
    Type: AWS::Batch::JobDefinition
    Properties:
      JobDefinitionName: data-etl-job
      Type: container
      PlatformCapabilities:
        - FARGATE
      ContainerProperties:
        Image: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/data-etl:latest
        ResourceRequirements:
          - Type: VCPU
            Value: '2'
          - Type: MEMORY
            Value: '4096'
        JobRoleArn: arn:aws:iam::123456789012:role/BatchJobRole

他の類似ツール・サービスとの比較

観点 AWS Batch AWS Lambda ECS + EC2 Kubernetes (EKS) Apache Airflow Apache Oozie
管理負荷 非常に低(ジョブキュー管理のみ) 極めて低(サーバーレス) 中程度(ECS クラスター管理) 高(K8s ノード管理) 中程度 中程度
最大実行時間 無制限(24h以上対応) 15 分(制限) 無制限 無制限 無制限 無制限
最大メモリ 3.8TB(x2 インスタンス) 10.24GB インスタンスに依存 インスタンスに依存 インスタンスに依存 インスタンスに依存
GPU サポート ✅(p3 / p4d)
マルチノード並列 ✅(MPI / gang scheduling) ✅(ただし手動管理)
スケジューリング ✅(Job Queue + Fair-Share) ✅(同時実行数制限) ❌(別途ツール必要)
コスト効率 ★★★★★(Spot + Auto Scaling) ★★★★☆(オンデマンド) ★★★★☆ ★★★☆☆ ★★★☆☆ ★★☆☆☆
使用シーン 大規模バッチ処理、科学計算、HPC 軽量定期タスク、イベント駆動 コンテナアプリ恒続実行 マイクロサービス、複雑オーケストレーション ワークフロー定義、DAG スケジューリング Hadoop 生態系

Slurm(オンプレミス HPC)との比較

観点 AWS Batch Slurm
初期投資 0(クラウド課金) 数百万円(ハードウェア+ライセンス)
スケーラビリティ ∞(AWS リージョン制限のみ) サイト内スケール限定
グローバル展開 ✅(マルチリージョン容易) ❌(困難)
管理負荷 低(AWS がインフラ管理) 高(オンプレミス管理)
ジョブスケジューリング 同程度 Batch より高機能

ベストプラクティス

✅ DO(すべきこと)

  1. Fargate をデフォルトに(GPU・大メモリ不要な限り)

    • サーバーレス。管理不要
    • 起動時間 30-60 秒(EC2 より短)
  2. Spot を積極活用(中断許容ジョブ)

    • コスト削減率:75-90%
    • Capacity Rebalancing で自動置換
  3. コンテナイメージを軽量に(< 500MB)

    • ECR ダウンロード時間削減
    • デプロイ高速化
  4. リトライ戦略を細かく設定

    • 一時的障害は自動リトライ
    • リソース不足など非一時的なら EXIT
  5. CloudWatch / X-Ray 統合

    • ジョブパフォーマンス可視化
    • ボトルネック特定
  6. Fair-Share Scheduling を活用(マルチテナント環境)

    • チーム間の公平配分
    • SLA ベースのスケール
  7. セキュリティ

    • IAM Role(ジョブごと最小権限)
    • Secrets Manager で機密情報管理
    • VPC エンドポイント活用

❌ DON’T(してはいけないこと)

  1. maxvCpus 未設定

    • コスト爆発リスク
    • 必ず上限を設定
  2. 環境変数に機密情報を直接設定

    • CloudWatch Logs に露出
    • Secrets Manager / Parameter Store 使用
  3. マルチノード並列に Spot 使用

    • 1 つのノード中断で全体失敗
    • オンデマンド必須
  4. GPU ジョブを Fargate で実行

    • Fargate は GPU 非対応
    • EC2 コンピューティング環境使用
  5. ジョブログをアプリケーション管理

    • CloudWatch Logs を標準
    • ローカルストレージは容量制限あり
  6. バージョニングなしイメージ使用

    • latest タグは危険
    • 必ずセマンティックバージョニング

トラブルシューティング

現象 原因 解決
ジョブが PENDING のまま リソース不足・Compute Environment が DISABLED maxvCpus を増やす / list-jobs で確認
ジョブが FAILED(OutOfMemory) メモリ不足 Job Definition の memory を増やす
ジョブ完了に 5+ 分かかる EC2 起動遅延(Spot キャパシティ待機) Fargate に変更 / Warm Pool 使用
配列ジョブの一部が FAILED パラメータエラー / AWS_BATCH_ARRAY_INDEX ハンドリング漏れ コンテナログを CloudWatch で確認
スポット中断で全ジョブ失敗 チェックポイント機構未実装 SIGTERM ハンドラー + 定期 CP 実装
IAM 権限エラー ジョブロールの権限不足 batch:* + ec2:* + s3:* 等を追加
イメージダウンロード遅延 ECR レート制限 / イメージサイズ大 ecr:GetDownloadUrlForLayer 権限確認 / イメージ軽量化
CloudWatch Logs に出力されない awslogs ドライバー設定漏れ / ロググループ未作成 Job Definition で logConfiguration 確認

2025-2026 最新動向

Spot Capacity Rebalancing 強化

  • スポット中断 2 分前の自動検知・置換が主流化
  • 2025 年 7 月:Optical Data Center Regions(ODCR)でも Batch 対応開始

SageMaker Training Job Queuing 一般提供

  • 2026 年 Q1:複数 ML エンジニアのジョブを統一キューで管理
  • Fair-Share Scheduling で優先度制御

Warm Pool(計画中)

  • 停止 EC2 インスタンスを事前準備
  • コールドスタート時間を秒単位に削減(体験改善)

Multi-architecture Image Support

  • ARM64(Graviton)イメージのネイティブサポート(cost 30% 削減)

AWS Outposts / Local Zones での Batch 展開

  • 2025 年 7 月以降:オンプレミス環境で Batch ジョブ実行可能
  • エッジでのローカル処理 + クラウド連携

学習リソース

公式ドキュメント(AWS 提供)

  1. AWS Batch User Guide
  2. AWS Batch API Reference
  3. AWS Batch FAQs
  4. Capacity Blocks for ML(スポット割引)

ベストプラクティス & ブログ

  1. Instance type allocation strategies for AWS Batch
  2. Best practices for Amazon EC2 Spot
  3. Setting up AWS Batch multi-node parallel jobs
  4. Spot Fleet Auto Scaling Best Practices 2026

オープンソース / サンプルコード

  1. AWS Batch GitHub Examples
  2. AWS CDK Batch Constructs
  3. Terraform AWS Batch Provider

Kubernetes / Karpenter との比較リソース

  1. Karpenter(K8s Auto Scaling)
  2. Cluster Autoscaler vs Karpenter

実装例

例 1:ETL パイプラインの実装

import boto3
from datetime import datetime

batch = boto3.client('batch')

# Step 1: Extract ジョブ投入
extract_response = batch.submit_job(
    jobName=f'extract-{datetime.now().isoformat()}',
    jobQueue='etl-queue',
    jobDefinition='extract-job'
)
extract_job_id = extract_response['jobId']

# Step 2: Transform ジョブ投入(Extract 依存)
transform_response = batch.submit_job(
    jobName=f'transform-{datetime.now().isoformat()}',
    jobQueue='etl-queue',
    jobDefinition='transform-job',
    dependsOn=[{'jobId': extract_job_id}]
)
transform_job_id = transform_response['jobId']

# Step 3: Load ジョブ投入(Transform 依存)
load_response = batch.submit_job(
    jobName=f'load-{datetime.now().isoformat()}',
    jobQueue='etl-queue',
    jobDefinition='load-job',
    dependsOn=[{'jobId': transform_job_id}]
)

print(f"ETL Pipeline started: {load_response['jobId']}")

例 2:配列ジョブでの並列画像処理

import os
import sys
from PIL import Image
import boto3

s3 = boto3.client('s3')

array_index = int(os.getenv('AWS_BATCH_ARRAY_INDEX', 0))
bucket = os.getenv('S3_BUCKET')
image_id = f'{array_index:05d}'

# S3 からイメージダウンロード
s3.download_file(
    Bucket=bucket,
    Key=f'raw/{image_id}.jpg',
    Filename=f'/tmp/{image_id}.jpg'
)

# イメージ処理(リサイズ・フィルター等)
img = Image.open(f'/tmp/{image_id}.jpg')
img_resized = img.resize((256, 256))
img_resized.save(f'/tmp/{image_id}_processed.jpg')

# 結果を S3 にアップロード
s3.upload_file(
    Filename=f'/tmp/{image_id}_processed.jpg',
    Bucket=bucket,
    Key=f'processed/{image_id}.jpg'
)

print(f'Processed image {image_id}')

コンテナイメージの Dockerfile:

FROM python:3.11-slim
RUN pip install pillow boto3
COPY process.py /app/process.py
ENTRYPOINT ["python", "/app/process.py"]

チェックリスト

  • [ ] Fargate vs EC2 vs EKS のどれを使うか決定した
  • [ ] コンピューティング環境の maxvCpus を明示的に設定
  • [ ] ジョブ定義に IAM Role(最小権限)を指定
  • [ ] 機密情報は Secrets Manager / Parameter Store 経由
  • [ ] リトライ戦略を evaluateOnExit で細かく制御
  • [ ] CloudWatch Logs ロググループを事前作成
  • [ ] Spot ジョブは SIGTERM ハンドラーを実装
  • [ ] 配列ジョブは AWS_BATCH_ARRAY_INDEX の parse 処理確認
  • [ ] マルチノード並列ジョブは EC2 + オンデマンド
  • [ ] Fair-Share 環境では Share Identifier を含めて投入
  • [ ] イメージサイズを 500MB 以下に最適化
  • [ ] CloudFormation / Terraform で Infrastructure as Code 化
  • [ ] 本番環境前にステージング環境で動作確認
  • [ ] Cost Anomaly Detection で異常な支出を監視

まとめ

AWS Batch は 「エンタープライズグレードのバッチコンピューティング完全マネージドサービス」 です。

主要な使いどころ:

  • 大規模データ処理(ETL):数百 GB~ TB
  • 科学計算・シミュレーション:GPU / マルチノード対応
  • 機械学習:SageMaker Training Job キューイング統合
  • ゲノミクス・バイオインフォマティクス:HPC クラス性能
  • 金融シミュレーション:モンテカルロ並列化

強み:

  • ジョブスケジューリング自動化(IAM で権限管理)
  • Spot との統合で極限のコスト最適化(75-90% 削減)
  • Fair-Share で複数チーム公平配分
  • Step Functions との組み合わせで複雑 DAG 自動化
  • SageMaker / EKS との深い統合

注意点:

  • maxvCpus 未設定でコスト爆発リスク
  • マルチノード並列は EC2 + オンデマンド必須
  • イメージ管理・バージョニング重要

参考文献

AWS 公式

ベストプラクティス

関連サービス比較

業界情報

最終更新:2026-04-26 バージョン:v2.0