AWS の ECS & Fargate でゆるいバッチ環境を作る

仕事で以下のようなバッチを作る事になったのでその記録をメモしとく。

  • 月 1 回実行
  • 内容は手動でやってた作業を自動でやって結果をメールするだけ
  • 実行には 30 分ほどかかる
  • 全然クリティカルじゃない
    • エラーが発生しても連絡があってから再実行すればよい
    • 再実行もすぐでなくてもよい

で、考えた事がこちら

  • 運用工数かけたくない
    • cron 等で定期実行
    • サーバレス
  • そんなに変更ないだろうからデプロイは自動でなくてよい
  • なるべく安くすませたい

AWS でいくつかやり方があるけど、どれがいいか検討してみる。

  • Lambda + ClowdWatch Events
    • サーバレス
    • デプロイは zip 上げるだけ
    • cron 風の記述で定期実行可能
    • 実行時間の上限が 5 分なので今回は使えず
  • Elastic Beanstalk の worker 環境
    • デプロイ、切り戻しが楽なのはよい
    • docker も使える
    • cron 風定期実行可
    • ただし、安くもないし、サーバレスでもない
      • t2.micro でも一ヶ月で 1000 円強かかる
    • 一旦保留、他の方法でダメだった時はこれで
  • AWS Batch
    • サーバレス
    • 裏は docker なので使える技術はわりと自由
    • 定期実行はあまり得意ではないみたい
  • ECS + EC2
    • docker
    • ScheduleTask でやれば cron 記法で定期実行できる
    • サーバレスでないし安くもない
  • ECS + Fargate
    • docker
    • Fargate なので使った分だけ課金
    • 東京リージョンにない
      • 注: これやった当時はまだでした
    • Fargate はまだ ScheduleTask で使えないみたい

で、安さと運用を考えて ECS + Fargate で行くことにした。

SES の設定

今回は送信制限を解除してない SES を使ったので、 予め送信先のメールアドレスを登録しておいた。

プログラム作成 & docker 化

バッチとして実行するプログラムを作る。 docker なので言語は自由に選べばよいが、今回は node.js で。 メールは aws-sdk 経由で SES で送る。

プログラムができたら Docker 化する。 Fargate は pull が遅いらしいんで、軽量化のため ベースイメージは node の alpine にした。

ECS の設定

Fargate & SES が使える us-east-1 に構築する。

  • ECR にバッチのリポジトリを作って Docker イメージを push する。
  • クラスタの作成
    • クラスタとは ECS の実行環境みたいなもんらしい。
    • ECS のコンソールから
    • クラスターの作成」を選んで
    • 「ネットワーキングのみAWS Fargate を使用)」の
    • クラスタテンプレートを選んで
    • 後はよしなに作る。
  • タスク定義
    • 実行するイメージとかロール、メモリ、CPU を設定する
    • ECS のコンソールから
    • 「新しいタスク定義の作成」を選んで後はよしなに
    • コンテナは先程追加したやつを選択。
  • スケジュール設定

まとめ

という事で、ECS & Fargate を使って いい感じのバッチ環境を作ることができた。 cron もサーバレスにしたければ Lambda & ClowdWatch Events で いけるかもだけど、力尽きたので今回はここまで。

補足

今回はバッチ 1 つだけだったんで Fargate を選択したけど、 バッチサーバ立てるくらいの規模なら クラスタを EC2 で組んで ScheduleTask にした方がよいかも。

ただし、pull してから実行までに少しタイムラグがあるので、 起動時刻に厳密なケースでは他の方法の方がよいと思われる。