くりにっき

フルスタックキュアエンジニアです

なるべくお金をかけずに個人アプリを運用したい

前々からこの手のことを書きたいとは思ってたけど id:k0kubun さんの下記エントリに触発されて書きました。

k0kubun.hatenablog.com

tl;dr;

  • HerokuやFirebaseを駆使すれば割と無料でいける
  • 若干お金を払えばもっと選択肢は増える

個人アプリ開発

  • 2001~2002年あたりから個人HPでアプリを公開。後にVectorにも公開
    • アカウントは残ってるのでいまだにVectorからのレポートメールが毎月届いてます
  • 2009年くらいから色々ウェブアプリを開発

前提

Heroku

jp.heroku.com

メリット

  • レコード数が少なければPostgreSQLが無料で使える
    • 執筆時点で1万レコードまで無料 *1
  • アドオンが充実しててRedisやMemcachedも小規模なら無料で使える
    • 無料で使えるがクレジットカードの登録は必要
  • git pushだけでデプロイできるお手軽さ
  • Herokuのコンソールから機微情報を環境変数としてセットできる
    • 個人アプリをOSSとして公開する時に地味に助かるやつ
  • Deploy to Herokuボタン があるのでgemみたいに個人アプリを他の人に気軽に配布できる
    • 今だとDockerイメージで固めてDocker Hubとかで配布ってのもできるけど実行環境含めて配布できるのは強い

デメリット

  • コールドスタートがあるのでRailsみたいに起動に時間のかかるアプリは不向き
  • 東京リージョンはEnterpriseでしか使えないので日本国内からアクセスするようなウェブアプリの場合レイテンシの関係で不利。(Enterpriseじゃない普通のHerokuだとusかeuのみ)

特にPostgreSQL, Redis, Memcachedが無料で使えるので、業務でサーバサイドアプリを作っていてその延長で個人アプリも作ってみたいという場合にはとっつきやすいんじゃないでしょうか。

色々思うところはあるんだけどHeroku便利なんすよね、、、

GCP

Google App Engine

cloud.google.com

  • Herokuと同じくらいにできたPaaS老舗
  • 国内外問わず他のPaaSも色々できたんだけどことごとくサービス終了したのでHerokuとAppEngineしか勝たんって思ってる

メリット

  • オートスケールがあるのでアクセス数に応じてインスタンスが自動で増減する
    • ただしインスタンスが増えるとその分費用も発生する
    • 追記:一応HerokuにもDynoのオートスケーリングはあるんだけど、Performanceプラン以上(1 Dyno辺り最低月250ドル)じゃないと使えないので個人アプリだと厳しいのではと思います。(FreeプランかStandardプランだとコンソールから手動でのDyno数変更のみ)
  • 静的ファイルはサーバサイドアプリとは別のフロントエンドサーバから配信する設定にできる

デメリット

  • Heroku同様コールドスリープがある
  • GCPだと無料のRDBが使えないので別のSaaSを併用する必要がある
    • Cloud SQLは個人アプリだと高くて使いづらい(最低スペックでも月12ドルかかる)し、AppEngine使ってるのにDB用にGCEインスタンスを作るのもかなり微妙
    • 完全無料で済ませるならDatastoreやFirestoreのようなGCPのKVSを使う必要があるが、RDBと全然違うのでそれなりに学習コストはかかる

AWSでやろうとするとApp Runnerなんだけど完全無料でやるのは難しいんじゃないかなあ、、、

Cloud Run

  • DockerイメージをCIでビルドする手間を惜しまなければ全然あり
  • Cloud Runの無料枠も潤沢にあるので個人アプリ開発で使うには十分なんだけど、ビルドしたDockerイメージを置くContainer Registryの費用が発生するので若干の費用は発生すると思います

Firebase

  • https://primap.web.app/ をFirebase Hostingで動かしてるんだけど爆速でいい
    • 以前Fastlyが世界的な障害になった時にプリマップも落ちていたのでFirebase HostingのバックエンドはFastlyだと思います。どおりで速いわけだ
  • その他Cloud FunctionsやFirestore辺りも使ってます

プリマップのアーキテクチャについては下記エントリに詳しく書いてます。

sue445.hatenablog.com

sue445.hatenablog.com

Cloud Functions

  • 画面が不要だとFaaSでもいいですね
  • 個人Slackで運用してる雑ボット類は数年前まではVPSで動かしてたんですが、サーバの管理するのが面倒になって今は全部Cloud Functionsで動かしてます
  • 無料枠が潤沢なので個人アプリで使うには十分
  • AWSだとLambdaに相当し、Lambdaも無料枠が潤沢にある
  • Secret Managerにある機微情報をFunctionに設定することができるんだけど、Functionの呼び出し毎にSecret Managerの読み取り費用が発生するためそこだけ注意
    • 無料枠を超えたら1万回アクセス毎に月0.03ドル *2
  • 実はCloud FunctionsのデプロイでもバックエンドでContainer Registryが使われている関係でGCSの費用が発生します
    • 規模にもよるけど自分が運用してるアプリだと月0.01~0.05ドルくらい

Cloud Functionsで思い出したけど先日Ruby 3.0サポートがGAになってますね

cloud.google.com

GitHub Pages

  • 静的ファイルしか使わないんであればGitHub Pages最強
  • GitHubにコミットされたファイルしかGitHub Pagesで公開できないので、mainブランチが更新された時にGitHub Actionsでビルドしてgh-pagesブランチにcommitしてpushするひと手間がある

2022/8/14追記

GitLab Pages同様にブランチにコミットしなくてもGitHub Pagesにデプロイできるようになった!!!!(超便利)

github.blog

GitLab Pages

  • GitHub PagesのGitLab版なんだけど、こっちはGitLab CIのartifactをGitLab Pagesで公開するためGitHub Pagesのようなcommit & pushが不要なので嬉しい

2022/5/7 17:00追記:ブコメレス

id:anonruru

とても参考になる。1つだけ、tldrがtrdrになってたのが気になった。

指摘ありがとうございます。typo修正しました