バッチのアーキテクチャジャーニー

この記事は、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

image

AWS から提供されているDockerfilefetch_and_run.sh を使用し、下記の流れで実行します。

  • AWS BatchDockerコンテナとしてジョブを実行する。
  • fetch_and_run.sh が実行され、 AWS S3 からアプリケーションを取得する。
  • アプリケーションを実行する。

アプリケーションを AWS S3 へ配置するだけで、バッチアプリケーションが実行可能となります。エンジニアはアプリケーションの開発に注力することが出来ます。

※LT時には fetch-and-run で引数を扱えないとお話ししてしまいましたが、引数を扱うことが出来ました。大変失礼しました。

アプリケーション開発言語

今回はGo言語を採用しました。 社内では2016年頃から使い始め、実績があります。バージョンは最新バージョンの Go 1.11 です。 Go言語のシングルバイナリは扱いやすく、fetch-and-run との相性は良さそうです❤️

ビルド/デプロイ

image

ビルド

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 へ移行することを検討して行きたいと思っています。

参考