- Published on
コストを抑えながら運用したい!個人開発のWebアプリの構成
- Authors
- Name
- Nomad Dev Life
個人開発で作ったWebアプリの構成と、コストを安く抑える工夫
個人開発でWebアプリケーションを作成し、先月Beta版をリリースしました。
初めての個人開発だったこともあり、ユーザーが付くかどうか分からなかったため、開発・インフラともに極力ランニングコストを抑えるようにしました。
開発については、前回の記事でも紹介したとおり、Google Julesを無料で利用することで費用を抑えてきました。
今回はインフラコストの話です。まだBeta版でユーザーはほとんどいませんが、「ユーザーが100人程度に増えたらどうなるか」という想定も含めて書いてみます。
インフラ構成
今回のWebアプリは、以下のインフラ上に構築しています。

GCP
Cloud Run
軽量なコンテナデプロイ環境が欲しかったのでCloud Runを選びました。現状はユーザーが少ないため、コールドスタートでも問題ありません。そのおかげで無料枠に収まっています。
Frontend - React Router
当初はReact Remixで始めましたが、途中でReact Router v7に移行しました。React自体が初めてだったため、序盤は苦戦しました。レポート送信用の設定画面を提供しています。ただし、頻繁に利用されるものではないため、アクセス増による負荷はあまり想定していません。
Backend - Python / FastAPI
このWebアプリはユーザーにレポートを送信します。レポートにはグラフが含まれるため、Pandasやmatplotlibを利用できるPythonを採用しました。バックエンドには2種類のリクエスト経路があります。
- フロントエンドからのAPI呼び出し
- Cloud TasksからのAPI呼び出し
現状はどちらも1つのCloud Runで処理しています。 将来的にユーザーが増えた場合、フロントエンド経由の呼び出しはほとんど増えませんが、Cloud Tasks経由の呼び出しは増えるため、こちらだけ別コンテナに分けてスケールさせる予定です。
Cloud Scheduler / Cloud Tasks
ユーザーが指定した時刻にジョブを実行し、バックエンドのAPIを呼び出します。Cloud Schedulerはジョブあたり$0.10/月。このアプリではユーザーごとに1ジョブしか登録できないため、100ユーザーでも$10/月に収まります。
Cloud Tasksは100万回まで無料、以降は100万回あたり$0.40(上限50億回)。仮に100ユーザーが利用しても、最初の100万回に到達するまで27年かかる計算なので、現状はコストに含めなくてよいでしょう。
Secret Manager
APIキーやDBの認証情報を管理しています。現在は約20件のSecretを登録中です。現時点ではこれが最もコスト高で、月100〜120円ほど。サービス内容を大きく変えない限り、大幅な増加はないと見ています。
Artifact Registry
バックエンド/フロントエンドのコンテナイメージをそれぞれ2世代ずつ保持。Cloud Runにデプロイする際、このレジストリのイメージを利用しています。コストは月20円程度で、こちらも大きな変動は見込んでいません。
Neon
Free Plan
GCPのCloud SQLはコストが高めなので、サーバーレスでPostgreSQLを利用できるNeon を選びました。現在はFreeプラン(0.5GBストレージまで)を利用しています。ユーザーが増えたらLaunchプランへ移行予定です。ストレージは$0.35/GB/月なので、100ユーザーで10GB使った場合でも$3.5/月に収まります。Computeも従量課金ですが、複雑なSQLを発行するアプリではないため、コストへの影響は小さいと考えています。
個人開発をしてみて感じたこと
今回の開発で強く感じたのは、**「個人開発は小さく始めるのが一番」**ということ。 最初から完璧な設計を目指しても、実際に触るとやりたいことは変わってきます。そこで今回は「まず動かす → 後から改善する」という流れを意識しました。
実際に作ってみて、
- サーバーレスの便利さ
- 運用コストを抑える工夫の効果
- シンプルな技術選定のメリット
を実感でき、非常に学びの多い経験になりました。
おわりに
ユーザー100人程度を想定した小規模サービスであれば、GCP + Neonを組み合わせることでランニングコストを十分に抑えられそうです。
今後も改善や機能追加を続けながら、実際にユーザーに使ってもらえる形に育てていきたいと思います。まずは100人のユーザーに使ってもらえるよう、マーケティングを頑張ります。