BLOG

ブログ

モノレポ × Amazon ECSで管理しやすいプロジェクトを構成した話

こちらは、Mavs Advent Calendar2023の4日目の記事です!

🎄🎄🎄

こんにちは、タロウです。

モノレポ構成 + Docker + Amazon ECSで構築し、スムーズな開発・運用保守をすることができているので、その方法をご紹介します!
ローカル環境から検証環境、本番環境と動作環境にDockerを使用し、環境構築や疎通での無駄なハマりを極力無くした構成が実現できました。

しばらく開発を離れたメンバーでも、追加開発や保守対応でとてもスムーズに再開することができたのでメリットの多い構成だったと感じています。

“弊社の体制や環境ではマッチしていた”話になります!一例として参考にしていただければと思います!

全体図

リポジトリ

1つのGitリポジトリにフロントエンド・バックエンドのソースを入れ、Docker Composeで一律管理をしています。

CI/CD・動作環境

GitへPush後は自動でデプロイされます。
※VPCや細かな設定・意図には触れません!

ローカル環境

シンプルにGitHubからPull、環境変数を整備、docker compose upのみで起動するようにしています。

環境構築での手間をできる範囲の極限まで減らし、プロジェクト参画のハードルを低くします。
環境構築の手順が多い状態でハマると工数を多く食い潰し予定が大きくずれ込んでしまうため、構築ステップは少ないに越したことありません。

数人のメンバーは数回、プロジェクトに出入りしていましたが、その度に環境でハマるようなことはなく、スムーズに開始することができます。

また開発しているとDockerのイメージが余計に肥大してしまうことを避けるため、ローカル環境でもマルチステージビルドの構成としました。
※気がついたらimageが数GBになっていてマシンが圧迫されていることもしばしばあったので軽量化しておいて損はなかったと感じます。

FROM public.ecr.aws/docker/library/node:16-alpine as setup
WORKDIR /usr/src/frontend
COPY --chown=node:node package.json yarn.lock ./
RUN yarn install --no-progress

FROM public.ecr.aws/docker/library/node:16-alpine as build
WORKDIR /usr/src/frontend
COPY --from=setup --chown=node:node /usr/src/frontend/node_modules node_modules
ENV HOST 0.0.0.0
EXPOSE 3000
USER node

# 起動
CMD ["yarn", "dev"]

フロントエンド・バックエンドを切り離して良かった

基本的にはメンバーは機能単位で担当するため、ローカル環境ではどちらも起動する必要がありますが、フェーズによってはフロントエンド・バックエンドどちらかのみの起動で良いタイミングがあります。

フロントエンドのみの修正であれば開発環境のAPIを使用することでPCに負荷が少なく、サクサクと進めることができたと感じます。
(当時はマシンスペックが高くはないメンバーがおり、Macが唸ることがありました)

また、切り離すことで確実に動く状態を維持している検証環境のリソースを使用することができ、環境が原因である不具合に対して余計な調査をせずに済みました。

認証機能・DBは徐々に共用リソースへ

開発当初はDBなど全てローカル環境で起動し進めて行きましたが、

  • 機能間結合確認
  • 複数人操作が必要なテスト

などでは検証環境DBや共通の認証サービスを使用した方が都合が良いことが多くなりました。
スムーズに進められるケースが多い反面、DBの構成変更が発生した際はmainブランチから最新ソースを取得してもらうなどの情報共有を行う必要がありました。

検証環境・本番環境

どちらの環境もGitHubのブランチと紐付けており、AWS CodePipelineでデプロイまで完結しています。
ただ、本番環境へのリリースのみ手動でPipelineのボタンで動くようトラッキングは切っています。
(誤操作でmainブランチへマージ=本番環境へ反映されることを避けたい)

またデプロイまでを自動化し完了通知をSlackで受けることで、今のデプロイ状態を確認する手間が省けました。
特にテストフェーズでは、頻繁に修正が発生し、都度、デプロイされているのか確認する必要がありましたが、デプロイ完了通知が来る→検証環境を確認するようなフローを作ることができスムーズな開発を行うことができました。

Slackの通知受信例

PJ開始直後に検証環境を作成して良かった

言語・フレームワークの選定がほぼ固まると、ローカル環境の構築と同時期に検証環境の構築も始めました。環境依存の考慮や、後になって構築できなかったなど後戻りを少しでも無くすことができます。

最新の状態が動く環境を常に準備することで正解値の確認や進捗を見ることができるため、チームメンバー・クライアントへ共有しやすい状況を作ることができます。
(レビューや、感覚的に状況を把握してもらうケースなどで大変有効活用しました)

また、日々の会話の中で動くモノを中心に話をすることはとても重要で、”自分はいったい何を作っているのか”、”自分が作っている機能はどこでどう活躍するのか”などが見えにくくなり、”自分の担当さえできていればいいや”といった自分本位な思考を防ぐことができたと感じます。

ブランチ運用

弊社では基本的に制限がない限りはGit Feature Flowに乗っ取った開発を進めています。
素早くデリバリーでき、開発のベースとなるブランチは最新ソースとなるためコンフリクトや先祖返りがかなり少なくなります。

また変更点の把握がしやすいので問題発生した場合は即座にfeatureブランチで原因調査を行うことができます。

下記のステップをタスク単位で繰り返し行います。

  • 最新の状態であるmainからfeatureブランチを作成する。
  • featureブランチで開発を行う。
  • 修正が完了したら検証環境用ブランチ(test-env)へマージする
  • 動作が問題なければmainへのプルリクエストを作成する
  • レビューOKであればmainへマージされる

参考

[GitFlowは使わない!シンプルな「GitFeatureFlow」を紹介します]
https://developers.gnavi.co.jp/entry/GitFeatureFlow/koyama

プロジェクト参画時のハードルを低くできた

とてもシンプルな流れで開発を行うことができるため、開発経験年数に関わらず参画時のハードルをかなり下げることができます。覚えることが多い状態でさらに複雑なブランチ運用ルールを作成してしまうとコードや業務理解に力を割くことが難しくなるためコストが高くなります。

既存メンバーや仕組みを変えることで避けられる場合は積極的な改善が良さそうです。

さらに、GitHubのissueとfeatureブランチをブランチ名+リンクで紐づけることで影響範囲や修正箇所が明確となりとても作業しやすい環境となります。

issueとfeatureブランチを紐づける

さいごに

いかに構築でハマらないか、スムーズに開発に入ることができるか、CI/CDを整備し明瞭に安全にリリースできるかに焦点を当て運用例の紹介でした!

まだまだ改善したいことはありますが、現時点でどのスキルレベルでも、メンバーのレイヤーが違ってもスムーズに参画し、開発・保守を行うことができる環境を作り運用することができています。

会社ごとに社内文化や制限の違いがありますが、弊社の取り組み事例がどなたかの参考になれば嬉しいです!

RELATED ARTICLE