背景
我が家では小鳥を3羽飼っており、そのうち1羽は女の子の文鳥です。小鳥はパートナーがいなくても無精卵を産むことがあり、体の小ささゆえ、卵を産む行為は大きな負担になります。卵を産まないためにも、体重管理が欠かせません。そこで私は、シンプルに体重を管理できるアプリを作ろうと考えました。
しかし、個人開発で問題となるのはランニングコストです。セオリーどおりにアプリを作ると、データベースやサーバの維持費がかかってしまいます。自分だけで使うなら無料または低コストのデータベースサービスもありますが、やはりエンジニアとしては「せっかく作るなら他の人にも使ってほしい」という気持ちがあります。
そこで本記事では、一定のユーザが利用してもランニングコストを0円に抑えるための工夫を紹介します。
アプリの紹介
アプリの紹介は最小限にとどめますが、基本機能としては
- 管理する小鳥の登録
- 小鳥ごとの体重の記録および表示
となります。体重入力はとにかくシンプルに、見た目は楽しく継続できることをコンセントに開発しています。
システムアーキテクチャの紹介
アーキテクチャ自体は至ってシンプルです。Next.jsで開発したフロントエンドアプリをVercel
にデプロイしています。Next.jsとCloudflare R2との通信部分もNext.jsのサーバサイドを利用して開発しています。サーバサイドもNext.jsを用いて開発することでVercelを利用することができサーバサイドのコストを削減できます。
本アプリ最大の工夫ポイント
今回の最大の工夫は、オブジェクトストレージであるCloudflare R2を疑似的にKey-Value型データベースとして活用した点です。
通常、オブジェクトストレージは画像や動画などRDBで扱いにくいデータを保存する用途で使われることが多いですが、もちろんJSONファイルを保存することも可能です。本アプリケーションでは、この機能を活かしてJSONをKey-Value形式のデータとして取り扱い、DynamoDBのような使い方を実現しました。
DynamoDBを使用する際は基本的に非正規化して運用するほうが望ましいとされていますが、このアプリケーションでは通信速度などを考慮し、JSONファイルが大きくなりすぎないよう適度に正規化して保存しています。たとえば、あるペットの体重記録は下記のようなJSONファイルで管理し、Next.js側で必要なJSONをダウンロードしてフロントエンド側で処理を行っています。
[{"datetime":"2024-12-08T20:46:18+09:00","weight":19,"isDeleted":false},
{"datetime":"2024-12-07T20:45:57+09:00","weight":20,"isDeleted":false},
{"datetime":"2024-12-06T20:43:21+09:00","weight":19.1,"isDeleted":false},
{"datetime":"2024-12-05T18:30:35+09:00","weight":18.3,"isDeleted":false},
{"datetime":"2024-12-21T20:46:48+09:00","weight":21.3,"isDeleted":false}]
フォルダ構成は下図のように整理しています。User(飼い主)ごとにフォルダを用意し、その下に複数の小鳥(ペット)ごとのフォルダが存在します。各小鳥には名前などのプロフィール情報を記載したJSONと、日々追記される weight.json を用意しています。体重データは継続的に蓄積されるので、将来的には月ごとにファイルを分割するなど、さらなる工夫も視野に入れています。
オブジェクトストレージをDBとして使うことで十分運用に耐えうるアプリケーションを作ることができます!!
デメリット
やはり、通信速度はDynamo DBなどと比べると少し遅いです。jsonをダウンロードしてくる際に、少し待ちますが数秒程度なので許容範囲かと思います。
ランニングコストがかかるとしたら
ランニングコストがかかるとしたら、
- URLをvercelのドメインから独自で取得したドメインにする
- アプリを商用化する場合は、VerrcelのPro Planに入る
- かなりのユーザが利用してCloudflare R2でコストがかかる
かと思います。基本、jsonしか保存していない場合、Cloudflare R2でコストがかかるということは一定のユーザ数がいるということが予想されるので、商用化の可能性も十分考えられる状態かと思います。
まとめ
本記事では、個人開発を行う上でいちばんのネックとなるDBの運用コストに対してオブジェクトストレージのCloudflare R2をDBとして使うことで0円運用を実現しました。オブジェクトストレージであれば、他にもAWS S3や最近ではVercel Storageと呼ばれるオブジェクトストレージがVercelから発表されたので候補として上がりそうです。
是非、個人開発する際には検討してみてください!