freeeの開発情報ポータルサイト

freee の EC2 開発環境基盤について

freee 基盤チーム Advent Calendar 2023 13日目です。

はじめまして。SRE Platform Delivery チーム(以下 Delivery チーム)の tetora です! 今年の3月に freee に join しました。

年末年始はずっと積ん読していた三体の完結編を満を持して読もうと思っています。今からワクワクが止まりません。

はじめに

現在、freee ではプロダクト開発に Amazon EC2 を標準の開発環境として採用しています。

どの IT 企業でも入社したエンジニアがまずはじめにやることは開発環境の構築かと思います。

そして多くの場合、開発環境の構築は入社したてのエンジニアにとって最初の難関だと思います。

freee には多くの開発者がいます。プロダクトの規模も大きく数も多いです。 開発環境の構築のしやすさや安定した運用はプロダクト開発において非常に重要な要素になります。

本稿では freee の開発環境 EC2 の基盤となるアーキテクチャについての概要をお話しします。

(*EC2 上での具体的な開発手法や開発プロセスについては本稿では扱いませんのであしからず。)

AMI の作成・管理

EC2 の元となる AMI の作成プロセスは継続的改善を回しやすいように GitHub Actions を使って自動化されています。

AMI は Ansible で構成管理し、 Packer でイメージビルドしています。 ami-build freee のプロダクト開発に必要なライブラリやツールなどを preinstall した、いわゆるゴールデンイメージを作り、ECR に push しています。

EC2 のライフサイクル管理

少ないステップ数で開発環境を立ち上げて開発に入れるように インスタンス作成をはじめとした EC2 ライフサイクルの管理も自動化しています。

インスタンスの起動や削除、スペック変更やボリューム拡張などは GitHub Actions と Terraform を組み合わせてワークフローを構成しています。

開発者は GitHub Actions ワークフローを実行するだけでインスタンスの起動・スペックの変更などが行えるようになっています。

ちなみに現状 EC2 の hibernation(休止)機能を起動時に有効化しているため、既存データを保ったままで手動でスペックを変更しようとすると、新規にインスタンスを立ち上げてボリュームを付け替える必要があるので割と手間なのです。( 現状 hibernation は起動後に有効無効を切り替えることができず、また hibernation が有効なインスタンスはスペックを変更できないため。)

今後の課題

課題は多くあります。 Delivery チーム目線の課題としては「コストと開発者体験の両立」に集約されるのではないかと思っています。

freee はエンジニア組織としてもプロダクトとしても規模を拡大し続けており、それに比例して開発環境にかかるコストも増加しています。

Instance Scheduler による夜間のインスタンス自動停止や退職された開発者のインスタンス検知・削除の仕組み化など細かく対策はうっていますが、もっと抜本的にコストを圧縮する施策を考える必要があります。

同時に、コスト圧縮が開発者体験を損なう結果になってしまっては元も子もありません。 組織やプロダクトのスケールに対応できるように、基盤レベルでうまい仕組みを考える必要があります。

まだ何も具体的には決まっていないですが、たとえば開発対象のサービスと依存関係にはあるけど開発対象ではないサービスを共通バックエンドとして EC2 の外に切り出すことで軽量化とコスト削減が図れないかなど Delivery チームで議論を進めているところです。

おわりに

実のところ freee の開発環境の管理・運用を担うチームは長らく公式には存在していなかったのですが、 最近までサービス基盤チームという freee プロダクトの全社共通基盤システムの開発を担うチームが管理・運用してくれていました。

そしてサービス基盤の前には草の根的に先人たちが開発環境の土台を築いてきました。

そして今年度からようやく開発環境の基盤を本来担うべき Delivery チームに移管されたという経緯があります。 ( Delivery チームは名前の通りプロダクトの CI / CD 周りのプラットフォーム開発を担うチームですが、 開発者体験の向上という役割も持っています。実は最近まで Developer eXperience というチーム名でした。)

何が言いたいかというと、実は今日ご紹介した仕組みの多くは先人の功績なのです!ということでした。

まとめ

今日は freee の開発環境を支える基盤アーキテクチャについてご紹介させていただきました。 先人たちが作りあげてきた freee のプロダクト開発を支える開発環境をさらに使いやすく持続可能なものにしていけるように Delivery チーム頑張っていきまっしょい!

明日は SRE Platform Orchestration チーム の frauniki さんによる 「Amazon EKS on AWS Gravitonとfreee's EKS Platform」になります。 freee SRE 内でも話題沸騰中のタイムリーな内容になるかと思いますので、是非お楽しみに!