バッチのアーキテクチャジャーニー
この記事は、mediba Advent Calendar 2018 の20日目です。
こんにちは。コミュニケーションデザイン本部 創造部の森竹です。
バックエンド開発を担当しています。最近はカイゼン・ジャーニーを通じてのアジャイル/スクラムの推進やBIT VALLEY -INSIDE-のコミュニティ運営に参画しています。
今回は先日のBIT VALLEY -INSIDE- Vol.2 でライトニングトーク(LT)させて頂いた内容を中心に記事とさせて頂きました。あるプロダクトのバッチアプリケーションアーキテクチャのジャーニーを紹介します。
AWS Batch
AWS 環境でのバッチと言えば、AWS Batch ではないでしょうか。 AWS Batch
の特徴は下記の通りです。
- フルマネージド型です。
AWS Batch
の実体はAmazon ECS
、またその実体はEC2
の構成です。スポットインスタンスへ入札することが出来ます。 - 2018年3月 に
CloudWatch Event
に対応し、cron
的な使い方が出来るようになりました。 Docker
コンテナ🐳でアプリケーションを実行します。- ログは
CloudWatch Logs
に出力します。 - 実行パターンの1つに、「fetch-and-run」があります。
fetch-and-run
AWS から提供されているDockerfile 、fetch_and_run.sh を使用し、下記の流れで実行します。
AWS Batch
がDocker
コンテナとしてジョブを実行する。fetch_and_run.sh
が実行され、AWS S3
からアプリケーションを取得する。- アプリケーションを実行する。
アプリケーションを AWS S3
へ配置するだけで、バッチアプリケーションが実行可能となります。エンジニアはアプリケーションの開発に注力することが出来ます。
※LT時には fetch-and-run
で引数を扱えないとお話ししてしまいましたが、引数を扱うことが出来ました。大変失礼しました。
アプリケーション開発言語
今回はGo
言語を採用しました。 社内では2016年頃から使い始め、実績があります。バージョンは最新バージョンの Go 1.11
です。 Go言語のシングルバイナリは扱いやすく、fetch-and-run
との相性は良さそうです❤️
ビルド/デプロイ
ビルド
Travis CI
にてGo
ビルドを実行し、バイナリを AWS S3
(ビルド用バケット) へPUTします。
デプロイ
環境毎に作成した下記ブランチへのマージをトリガーに、 Travis CI
にて AWS S3
(アプリケーション用バケット) へPUTします。 fetch-and-run
でのデプロイは、これだけです❤️
- deployment/production
- deployment/staging
- deployment/development
Fargate
2018年8月に「タスクのスケジュール」に対応したと発表がありました。
AWS Batch
でやろうとしていた事と同じことがクラスター管理(EC2
)不要で実現出来るようになりました❗️
まとめ
バッチのアーキテクチャジャーニーを紹介させて頂きました。
今回は AWS Batch
ではなく、AWS Fargate
を採用し、Go
のバッチアプリケーションを fetch-and-run
を使って実行するアーキテクチャとしました。もちろんバッチアプリケーションの仕様や特性により、AWS Batch
を採用することもあると思います。
CI
には Travis CI
を使用していますが、AWS CodePipeLine/CodeBuild
でも良さそうです。
今後は EC2
で実行している既存のバッチアプリケーションを AWS Batch
、または AWS Fargate
へ移行することを検討して行きたいと思っています。
参考
