Fargateでバッチを動かすときにググってもちょうどいい事例が見つからず少し試行錯誤して動くようになったので、これからやる人が私と同じ思いをしなくて済むようにここに記しておく。
EKS on Fargateがre:inventで発表されて使えるようになったので念のためタイトルをECS on Fargateにしています。
まず最初に結論から。
結論
Fargateでバッチを動かすときの肝は登録数(Desired Count)を0にすること
構成
- GitHub ActionsでS3にコードを移して
- ファイルの更新をトリガーにCodeBuildでコンテナのビルド
- CodeDeployでECSサービスの更新
- ECSのタスクスケジューリング(CloudWatch Events)でバッチ実行
CodePipelineでやってることを全部GitHub Actionsでやることも可能なんですが、どっちでやるのがいいんですかね
GitHub ActionsやGolangのChannelについても詳しく書きたかったんですが、ネットの海に広がっているので割愛
本題のFargateでバッチを動かす
概要
- サービス作成時に登録数(Desired Count)を0にする
- タスクスケジューリングでCloudWatch Eventsのルールとターゲットを設定して、ECSタスクを実行する
サービス作成時に登録数(Desired Count)を0にする
サービス作成時にタスクの数を1以上にしてしまうとバッチが延々と実行されてしまうので0に設定します
タスクスケジューリングを設定する
こちらもネットの海に広がっているので詳細は割愛しますが、CloudWatch Eventsのルールとターゲットを設定すると、ECSタスクが実行されるようになります
まとめ
コンテナは本当に楽ですね
EC2管理しなくていいだけで本当にありがたい
アプリケーション実行環境は各クラウド早く標準化対応してもらってデータストアなんかのサービスでクラウドを選ぶ時代が来て欲しいですね
AWSでバッチを作るなら
他にもLambda, AWS Batchと選択肢がありますが、比較記事を弊社の先輩が書いてくれているのでよろしければ参照ください
現状ではFargateが多くの状況に適していると思います
FargateなかったときにAWS Batch使ったことありますが大変でした
AWSでサーバレスな定期バッチ環境を作るには結局どれ使えばいいの?(Lambda vs Fargate vs Batch)
https://qiita.com/kazuktym/items/0ecc1dbf98c3c3623473
それではみなさん良いクリスマスと良いお年を!