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
- 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 する。
- クラスタの作成
- タスク定義
- 実行するイメージとかロール、メモリ、CPU を設定する
- ECS のコンソールから
- 「新しいタスク定義の作成」を選んで後はよしなに
- コンテナは先程追加したやつを選択。
- スケジュール設定
- ScheduleTask は使えないみたいなので、cron でやる事に。
- なので、↓を参考に cli で起動できるようにコマンドを作る
- https://docs.aws.amazon.com/cli/latest/reference/ecs/run-task.html
- 開発サーバなど、常時起動してるサーバの cron に作ったコマンドを設定する
まとめ
という事で、ECS & Fargate を使って いい感じのバッチ環境を作ることができた。 cron もサーバレスにしたければ Lambda & ClowdWatch Events で いけるかもだけど、力尽きたので今回はここまで。
補足
今回はバッチ 1 つだけだったんで Fargate を選択したけど、 バッチサーバ立てるくらいの規模なら クラスタを EC2 で組んで ScheduleTask にした方がよいかも。
ただし、pull してから実行までに少しタイムラグがあるので、 起動時刻に厳密なケースでは他の方法の方がよいと思われる。
追記
現在は
- 東京リージョン
- 時間指定実行
に対応したるので、さらに使いやすくなった。