記事を書く背景
どうも、個人開発でwalicaというサービス作っている者です。
walicaは、2018年にサービスリリースしまして、今では月間3,000人が使っている、そこそこ使われるサービスになっています。
ところで、月間PV4万くらいですが、マネタイズには失敗しているので
リリースしてから16ヶ月、赤字が続いています。 😂😂😂
広告収入がやや伸びてきていますが、赤字の主な原因はインフラ費用です。
また、普段は自分のブログで淡々と記事を書いているのですが、今回Qiitaで記事を書くことで、デメリットの指摘などのフィードバックコメントをいただきたいと思っています。
自分はインフラにそこまで詳しくないので、コメントや記事の修正を通してコスト最適化に重点を置いた個人開発のベストプラクティスについて議論できたら幸いです。
発生したインフラ費用の内訳 (2018年当時)
DB (RDS | MySQL) ... $23 / month
Webサーバ (EC2 t2.micro) ... $27 / month
ドメイン ... 3067円 / year
上記の後、Webサーバは費用を $7 / monthまで節約でき、大きな問題も無いですが今回は記事から割愛します。
今まで使ったDBサービスと価格、リージョン
AWS以外にも、 Heroku, Manifold などの複数のDaaS1からDBリソースをレンタルしました。
Amazon RDS for MySQL 2
料金: $23
リージョン: us-east
Heroku Clear DB
料金: 5MBまで$0
リージョン: us-east
Manifold JAWS DB
料金: 250MBまで$5
リージョン: us-east
ただし、 CREATE DATABASE
で複数のデータベースを作る権限が無い
= 5ドルで1つのDB。 2つ使いたいなら10ドルかかる
EC2という選択肢
manifoldを長いこと使っていたのですが、walica以外のサービスを開発するにあたって、さらにDBが必要になりました。manifoldでは前述のように、データベースを複数追加する権限が無いので、サービスを作るたびに$5払いたくないなぁ💸💸💸という意識がありました。
あと、国内の利用者が多いので、Tokyoリージョン使いたい🗾という気持ちもあったので、AWSを使うことにしました。
結果
EC2最高でした。少なくともコスト面ではベストです。
料金: $8.7
容量: 4GB
リージョン: 東京
(
いずれ2つ以上のDBを利用する
OR
1GB以上DB使いたい
OR
Tokyoリージョン使いたい
)
AND
DB安く済ませたい
上記の条件にヒットするならば、使うべきです。
$8.7で4GBは神🙏🙏🙏🙏🙏
注意点
RDSなどのマネージド・サービスと比較すると、EC2は自分でカバーしないといけない部分があります。
主な範囲は下記です。
- パッチ適用
- オートスケール
- バックアップ
- ディスク暗号化
- モニタリング
それなりに多いですが、個人開発レベルだといくつか必要なものを自分でやっていけばいいと思っています。
インフラめんどくさくて、開発に集中したい OR お金はある という人だったらRDSの方が良いです。
DB作成手順のまとめ
まず、sshでEC2に接続できる状態にしましょう。
このへんは調べればわんさか出てくるので、割愛します。
t3-nanoが安いです。
1. ssh接続する
ssh ec2-user@{ec2の ipv4 publicアドレス}
2. MySQL (MariaDB)をインストール
sudo su
yum update
yum install -y mariadb-server
systemctl start mariadb
systemctl enable mariadb
systemctl is-enabled mariadb
mysql_secure_installation
mysql -u root -p
CREATE USER 'remote_access' IDENTIFIED BY '{パスワードを自分で決めたもの}';
GRANT ALL PRIVILEGES ON *.* TO 'remote_access'@'%' WITH GRANT OPTION;
DBサーバーの設定はこれで終了です。
3. mysqlクライアントから接続できたら成功!
ssh接続を切り、自分のPCから接続確認をします。
mochida@mbp ~ % mysql -h {host ip} -u remote_access -p
Enter password: {パスワードを自分で決めたもの}
最後に
インフラガチ勢のコメント待ってます。
**「自分はこういうの使ってるよ」とか「そのやり方だとこういうリスクがあるよ」**とか教えていただけると幸いです🙇🙇🙇
追記① - 記事叩き フィードバック
たくさんのご意見いただきありがとうございます。
返信はできていませんが、全て目を通しています。
Twitterにもたくさんの意見があったので転載しておきます。
お前を見ているぞ 👮👮👮
追記②
デフォルトだとメモリが不足することが多々あるので、スワップ領域を設定しておいたほうがいいです。
https://qiita.com/wmx/items/631222f2e5a9e7a59fb4
また、innodb_buffer_pool_sizeを設定しておきましょう
https://tyablog.net/2020/02/22/adjust-mysqld-memory-usage/
※ スクショ消してほしかったら言ってください
追記②
タイトルが過激かつ否定されまくっていたので修正しました😭😭😭
x 個人開発でDBコストを抑えるならEC2一択
o 個人開発でDBコストを抑えるならEC2という選択肢もある
追記③
Aurora Serverless 調べてみました!
サーバレスなので、起動時間大丈夫かなと思ったのですが、やはりかなり遅そうです。
個人的には500ms以下じゃないとアプリには使いたくないですね...
[AWS]Aurora Serverless for PostgreSQLが休止状態から起動するまでの時間を調べた
追記④ 2023/1/1
MariaDBの方が簡単なので手順を更新しました。