金が掛からないRailsの本番環境を求めて、
そして私は家を飛び出した。
旅路の果てで、以下の構成に辿り着いた。
- データベース: TiDB Cloud
- ストレージ: Cloudflare R2
- Railsの実行環境: Fly.io
~ 20xx年某月某日 ~
私はRuby on Railsを使ってWebアプリを作ろうとしていた。
そして同時にこう思っていた。
「お金かけたくない🥺」
当たり前だ。
なにせ私はこの荒れ果てた日本の片隅で、ひっそりと呼吸し、そして下界に転がる食料を貪る、一匹のしがなく卑しい動物だ。
いや、虫だ。
PR TIMESで「大規模な資金調達したぜ!」なんてPRできるようなニュースは無いし、タクシーの後部座席のディスプレイで上級国民にゴマをするサービスもない。
だから「できるだけお金を掛けない構成にせねば」と最初に考えた。
そんなことを考えながら、我が家のくたびれたドアノブを回した。
何に金が掛かるのか
以下の要素に金が掛かると見当を付けた。
- データベース
- ストレージ
- Railsの実行環境
上記はWebアプリケーションを公開する際に必要な最低限の要素と言えるだろう。
上記に対して金が掛からない仕組みの実装やサービスの利用ができれば、安寧の園で眠ることができる。
金が掛からないデータベース
まず、Cloudflare D1が頭の中に現れた。
「Cludflareは金が掛からない良い子」というイメージがあるからだ。
しかし、D1はActive Recordに対応していないようだった。
「Active Recordを使わずして何がRailsアプリか」と誰に対してという訳でもないが啖呵を切った私は、Active Recordが使えて、かつ無料で使えそうなデータベースを探した。
次にNeonだ。
NeonはVercel Postgresで存在を知り、PlanetScaleが無料で使えなくなってから目を付けていた。
そして「Neon Active Record」でググると、RailsとNeonを連携させる方法を解説していると思われるNeonのドキュメントが、検索結果の最初に現れたではないか。
「これでデータベースの憂いは無くなった。」
と思ったが、日本にリージョンが無いという事実が、脳内の1部屋の1畳に居座っていた。
そこで「alternative neon database」とググってNeonっぽいDBaaSを探した結果、TiDB Cloudに出会った。
TiDB Cloudは、
- Active Recordに対応していてる
- リージョンに東京を選べる
- 無料枠ありの従量課金制
だった。
「これでデータベースの憂いは無くなった。マジで。」
1畳に居座っていた輩は退去した。
RailsでTiDB Cloudを使うには、
database.yml
に以下を書くだけ(たしか)。
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
url: <%= ENV["DATABASE_URL"] %>
development:
<<: *default
TiDB Cloudのドキュメントとサンプルのリポジトリを参考にすれば、簡単に使えると思う。
金が掛からないストレージ
ストレージは、データーベースの時と同じくCloudflare R2が真っ先に思い浮かんだ。
そして思い浮かんだまま、特筆することもなくR2を使うことができた。
RailsでCloudflare R2を使うには、
以下を済ませて、
- Cloudflare R2の設定
- aws-sdk-s3をインストール
以下のコードでファイルのアップロードができた。
require "aws-sdk-s3"
r2_client = Aws::S3::Client.new(
access_key_id: ENV["R2_ACCESS_KEY"],
secret_access_key: ENV["R2_SECRET_KEY"],
endpoint: "https://#{ENV["CLOUDFLARE_ACCOUNT_ID"]}.r2.cloudflarestorage.com",
region: "auto",
)
r2_client.put_object(
bucket: ENV["R2_BUCKET"],
key: foo,
body: bar,
content_type: baz
)
金が掛からないRailsの実行環境
Herokuが無料で使えなくなってから、幾年月が経っただろうか。
Renderは無料で利用を開始できるものの、期限が定まっていると見聞きした。
Fly.ioは$5分まで無料と見聞きしたので、Renderと同じく恒久的金掛からない運用ができない。
ということで、Koyebを使い始めた。
脳死で口を半開きにしながらKoyebのコンソールでテキトーにクリックしていった結果、デプロイすることができた。
Railsアプリケーション初デプロイの歓びで「ヨシ!」とほのかにつぶやき、グッ…!と非ほのかに拳を握った。
そしてKoyebが示してくれた私のRailsアプリケーションのURLを、唾を飲み込みながらクリックした。
ディスプレイの一面に、私が作成したWebアプリケーションが広がった。
そこで私は思ったのだ。
「ちょっと遅い…ッ!!」
リクエストしてからレスポンスが返ってくるまでに、遅さを感じた。
ページを遷移するときや何かしらのアクションを起こすときに、毎回そう感じてしまうのだ。
仕方がない。
無料なのだから。
まずもってKoyebを無料で使う際は、リージョンがフランクフルトかワシントンのどちらかしか選べない。
もちろん選べるだけありがたい。
私はフランクフルトを選んでいた。
データベースのリージョンは日本だ。
つまり日本からフランクフルトまで「データをくれ」と要求して、フランクフルトから日本にあるデータを取得して、取得したデータをフランクフルトから日本に渡していることになるだろう。
間にフランクフルトが入ることで遅くなっていると、短絡的ではあるが考えた。
ただ、Koyebに課金をすれば東京リージョンを選べるし、CPUやメモリだって良いやつにすればいい。
すべては金の無いわたくしめが悪いのだ。
貧しさ故に子を私立に行かせてやれない親の気持ちとはこれか、と打ちひしがれた。
「Koyebよ、あなたは素晴らしい。簡単にデプロイできるし、東京にもリージョンを設けてくれている。ありがとう。」と感謝の念を胸に満たしながらKoyebを背にして、別の道を探しに歩き出した。
すこし歩いたところで、とりえあずFly.ioにデプロイすることにした。
Renderは無料で使える期限が明確に定まっているのに対して、Fly.ioは$5まで無料と見聞きしていたので、具体的に無料でどこまで運用できるか分からなかったからだ。
例えば毎月$1しか掛からないようであれば、Renderよりは長く運用できると。
Fly.ioはKoyeb同様に、非常に簡単にデプロイすることができた。
東京リージョンもある。
コンソールも分かりやすい。
そしてコンソールであるものを発見した。
Current month so farと書いてある。
ここで「$5まで無料」の前に「毎月」が付くのではないかと仮説を立てた。
Fly.ioのドキュメントでは仮説が真である確証を得られなかったが、Fly.ioのコミュニティやXを見るに、仮説が真であるように見受けられた。
真である場合、Fly.ioのドキュメントによると東京リージョンでメモリ512Mで起動し続けたら月$4.18とのことなので毎月$5に収まる。
つまり繰り返しにはなるが仮説が真の場合、恒久的金掛からない運用ができる。
ちなみに後ほど同様のことを記すが、この仮説は真であった。
ちなみにKoyebとFly.ioそれぞれで、あるページ間の遷移に要した時間をChromeのデベロッパーツールでJavaScriptを使って計測したら、以下の通りだった。
- Koyeb: 約2,500ms
- Fly.io: 約350ms
メモリはどちらも512MBで、リージョンは前述の通りだ。
CPUはKoyebが0.1 vCPU
という表記で、Fly.ioはshared-1x-cpu
と書いてある。
CPUによる差はあるかもしれない。
安寧の園へ…
- データベース: TiDB Cloud
- ストレージ: Cloudflare R2
- Railsの実行環境: Fly.io
これで「金が掛からないRailsの本番環境」を構築することができた。
Fly.ioにデプロイしてから1カ月ほど経った頃に、Fly.ioからメールが来ていた。
「貴様の今月の使用料が$5未満やから無料にしたるわ」と。
旅の目的を果たした私は、我が家のくたびれたドアを回して帰った。
今、この部屋は安寧の園となっていた。
さぁ、旅の疲れを癒すために眠るぞ。
旅路の果てで見つけたサービスたちの終了や、料金体系の変更が発生するそのときまで。
完
ちなみに、
- いまRender確認したら「無料で使えるけど期限あるよ」ってのはデータベースに対してっぽいので、DBaaS使えば恒久的に無料で使えるかも。
ただ、日本にリージョンが無いよ。 - 「恒久的」とは書いてきたものの、HerokuとかPlanetScaleの無料プラン廃止とかDeta Spaceがサ終とかあったのでね。
当記事で紹介した構成もいつどうなるやら分からんよね。
Discussion