個人開発でDBコストを抑えるならEC2という選択肢もある


# 記事を書く背景
どうも、個人開発で[walica](https://walica.jp/)というサービス作っている者です。  
walicaは、2018年にサービスリリースしまして、今では月間3,000人が使っている、そこそこ使われるサービスになっています。  

ところで、月間PV4万くらいですが、**マネタイズには失敗している**ので
リリースしてから16ヶ月、**赤字が続いています。** 😂😂😂

広告収入がやや伸びてきていますが、赤字の主な原因は**インフラ費用**です。

自分はインフラにそこまで詳しくないので、コメントや記事の修正を通して**コスト最適化に重点を置いた個人開発のベストプラクティス**について議論できたら幸いです。

# 発生したインフラ費用の内訳 (2018年当時)
```
DB (RDS | MySQL)           ... $23 / month
Webサーバ (EC2 t2.micro)    ... $27 / month
ドメイン                      ... 3067円 / year
```

上記の後、Webサーバは費用を $7 / monthまで節約でき、大きな問題も無いですが今回は記事から割愛します。

# 今まで使ったDBサービスと価格、リージョン
AWS以外にも、 Heroku, [Manifold](https://manifold.co/) などの複数のDaaS[^1]から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ドルかかる

[^1]: Database As A Service
[^2]: 容量に対して従量課金ですが、当時、5MB程度の利用でした。。

# 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/

※ スクショ消してほしかったら言ってください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148503/c3cb58fa-b49d-8d5c-bbba-da456e9d1fa5.png)
[@shonansurvivorsさんのツイート](https://twitter.com/shonansurvivors/status/1236475472709443584?s=20)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148503/8f368d24-309c-163f-a634-ea1642c612dd.png)
[@kochos5さんのツイート](https://twitter.com/kochos5/status/1236467712932458496?s=20)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148503/a3080b17-7373-2237-8376-90b6bd6511d8.png)
[f3571n4l3n73さんのツイート](https://twitter.com/f3571n4l3n73/status/1236458490639446016?s=20)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148503/4ac8abed-37cd-5f91-6033-6293bcb8573a.png)
[@__timakin__さんのツイート](https://twitter.com/__timakin__/status/1236297328052461569?s=20)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148503/89a537f7-8bae-bb28-6681-aaca9de9d268.png)
[@a_yasuiさんのツイート](https://twitter.com/a_yasui/status/1236259510840209408?s=20)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148503/1f35e076-822c-d4c0-cc70-56283794843d.png)
[@Michin0sukeさんのツイート](https://twitter.com/Michin0suke/status/1236677958565126144?s=20)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148503/b7b170aa-eb5e-6aef-7929-e204d2f267ce.png)
[@Keisuke69さんのツイート](https://twitter.com/Keisuke69/status/1236675105696038912?s=20)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148503/d45b3d51-3179-ffcc-4993-6a5e1690f12c.png)
[@webuilder240さんのツイート](https://twitter.com/webuilder240/status/1236475596630134785?s=20)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148503/4891783f-1695-45f2-7209-29314f3122f0.png)
[@otchyさんのツイート](https://twitter.com/otchy/status/1236889949489643521?s=20)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148503/91e919d7-6830-0fc6-f177-cbb8e989cb6b.png)
[@Kengo_TODAさんのツイート](https://twitter.com/Kengo_TODA/status/1236809161624584199?s=20)

# 追記②
タイトルが過激かつ否定されまくっていたので修正しました😭😭😭

x 個人開発でDBコストを抑えるならEC2一択
o 個人開発でDBコストを抑えるならEC2という選択肢もある

# 追記③
[Aurora Serverless](https://aws.amazon.com/jp/rds/aurora/serverless/) 調べてみました！
サーバレスなので、起動時間大丈夫かなと思ったのですが、やはりかなり遅そうです。 
個人的には**500ms以下**じゃないとアプリには使いたくないですね...

[[AWS]Aurora Serverless for PostgreSQLが休止状態から起動するまでの時間を調べた](https://qiita.com/Nacht/items/50799b3d739af88a9988)


# 追記④ 2023/1/1
MariaDBの方が簡単なので手順を更新しました。

# 追記⑤ 2025/1/23
最近作ったサービスの宣伝です。
https://calinto.jp/