← Back

ecspressoライクなAWS Batchデプロイツール「batcha」を作った

GoAWSOSS

ecspressoライクなAWS Batchデプロイツール「batcha」を作った

AWS Batch の Job Definition をコードで管理・デプロイするCLIツール batcha を作りました。

GitHub: kyosu-1/batcha

モチベーション

ECS はサービスとタスク定義を中心にデプロイを管理します。一方 AWS Batch は、ジョブキューとコンピュート環境を使ったバッチ処理の実行基盤で、管理の中心は Job Definition とジョブキューになります。AWS Batch はコンテナの実行基盤に ECS や EKS を利用するジョブスケジューリングサービスですが、デプロイの単位や運用の流れは異なります。

ECS には @fujiwara さん作の ecspresso という優れたデプロイツールがあります。サービスやタスク定義を JSON で宣言的に管理し、差分検出・Terraform 連携・デプロイ/ロールバックといった運用に必要な機能をひと通り備えたツールです。

AWS Batch にはこういったいい感じのデプロイツールがなかったので、ecspresso の設計思想やインタフェースを参考にして作りました。テンプレートエンジンに kayac/go-config、Terraform state の参照に fujiwara/tfstate-lookup を利用しており、ecspresso と同じエコシステムの上に構築しています。

ecspresso と同様に、変更頻度の高い Job Definition の管理に特化し、ジョブキューやコンピュート環境、ネットワークといった頻繁には変わらないリソースは Terraform などの IaC ツールに任せる設計です。

ただ、ECS と違って Service の概念がなく、やることは基本的に Job Definition の register と run だけなので、ecspresso よりだいぶシンプルなツールになっています。 名前の由来は抹茶(matcha)です。ecspresso がエスプレッソなので、こちらもコーヒー屋の流れで。Batch + matcha = batcha です。

特徴

ecspresso の主要機能に対応する形で、AWS Batch 向けの機能を実装しています。

ecspresso (ECS) batcha (AWS Batch)
タスク定義を JSON テンプレートで管理 Job Definition を JSON テンプレートで管理
ecspresso register でタスク定義登録 batcha register で Job Definition 登録
ecspresso diff で差分検出 batcha diff で差分検出
ecspresso verify でローカル検証 batcha verify でローカル検証
ecspresso init で既存リソースから生成 batcha init で既存定義から生成
ecspresso run でタスク実行 batcha run でジョブ実行
tfstate プラグインで Terraform 連携 同様に tfstate プラグインで連携

Job Definition の登録

batcha register で Job Definition を AWS Batch に登録します。リモートとの差分がなければ登録をスキップするため、不要なリビジョンが増えません。

batcha register --config batcha.yml

宣言的な Job Definition 管理

ecspresso と同様に、定義を JSON テンプレートで管理します。テンプレート内で環境変数や Terraform の state を参照できます。

{
  "jobDefinitionName": "my-job",
  "type": "container",
  "containerProperties": {
    "image": "{{ tfstate \"aws_ecr_repository.app.repository_url\" }}:{{ env \"IMAGE_TAG\" \"latest\" }}",
    "resourceRequirements": [
      { "type": "VCPU", "value": "0.25" },
      { "type": "MEMORY", "value": "512" }
    ]
  }
}

差分検出

ecspresso の diff と同じく、リモートとローカルの差分を確認してからデプロイできます。

batcha diff --config batcha.yml

Terraform 連携

前述の tfstate-lookup を使っており、S3・GCS・Terraform Cloud など主要なバックエンドに対応しています。

# batcha.yml
region: ap-northeast-1
job_definition: job-definition.json
plugins:
  - name: tfstate
    config:
      url: s3://my-bucket/terraform.tfstate

ジョブの実行・ログ確認

ecspresso の run / logs に対応する機能です。ジョブの実行と CloudWatch Logs の取得をサポートしています。

# ジョブを実行して完了を待つ(--job-queue または config の job_queue で指定)
batcha run --config batcha.yml --job-queue my-queue --wait

# CloudWatch Logsをフォロー
batcha logs --config batcha.yml --follow

ローカルバリデーション

ecspresso の verify と同様に、AWS API を呼ばずにテンプレートと構造を検証できます。Fargate のリソース制約(vCPU/メモリの組み合わせ)もチェックします。

batcha verify --config batcha.yml

クイックスタート

Homebrew でインストールできます。

brew install kyosu-1/tap/batcha

既存の Job Definition からセットアップを始められます。

# 既存の定義からconfig + テンプレートを生成
batcha init --job-definition-name my-job

# 差分を確認
batcha diff --config batcha.yml

# デプロイ
batcha register --config batcha.yml

GitHub Actions

GitHub Actions 用のアクションも用意しており、CI/CD の中でイメージタグの更新から Job Definition の登録まで完結できます。

- uses: kyosu-1/batcha@v0
  with:
    args: "register --config batcha.yml"
  env:
    IMAGE_TAG: ${{ github.sha }}

おわりに

batcha のコードはほぼ Claude Code が書いたもので、自分は設計の方向付けと調整に徹しました。ecspresso という優れた手本があったのも大きいですが、こういうツールがサクッと作れてしまう、いい時代になりましたね。