💰

金が掛からないRailsの本番環境を求めて、

2024/11/03に公開

そして私は家を飛び出した。
旅路の果てで、以下の構成に辿り着いた。

~ 20xx年某月某日 ~

私はRuby on Railsを使ってWebアプリを作ろうとしていた。
そして同時にこう思っていた。
「お金かけたくない🥺」
当たり前だ。
なにせ私はこの荒れ果てた日本の片隅で、ひっそりと呼吸し、そして下界に転がる食料を貪る、一匹のしがなく卑しい動物だ。
いや、虫だ。
PR TIMESで「大規模な資金調達したぜ!」なんてPRできるようなニュースは無いし、タクシーの後部座席のディスプレイで上級国民にゴマをするサービスもない。
だから「できるだけお金を掛けない構成にせねば」と最初に考えた。
そんなことを考えながら、我が家のくたびれたドアノブを回した。

何に金が掛かるのか

以下の要素に金が掛かると見当を付けた。

  • データベース
  • ストレージ
  • Railsの実行環境

上記はWebアプリケーションを公開する際に必要な最低限の要素と言えるだろう。
上記に対して金が掛からない仕組みの実装やサービスの利用ができれば、安寧の園で眠ることができる。

金が掛からないデータベース

まず、Cloudflare D1が頭の中に現れた。
Cloudflare D1のトップページの画像
「Cludflareは金が掛からない良い子」というイメージがあるからだ。
しかし、D1はActive Recordに対応していないようだった。
「Active Recordを使わずして何がRailsアプリか」と誰に対してという訳でもないが啖呵を切った私は、Active Recordが使えて、かつ無料で使えそうなデータベースを探した。

次にNeonだ。
Neonのトップページの画像
NeonはVercel Postgresで存在を知り、PlanetScaleが無料で使えなくなってから目を付けていた。
そして「Neon Active Record」でググると、RailsとNeonを連携させる方法を解説していると思われるNeonのドキュメントが、検索結果の最初に現れたではないか。
https://neon.tech/docs/guides/ruby-on-rails
「これでデータベースの憂いは無くなった。」
と思ったが、日本にリージョンが無いという事実が、脳内の1部屋の1畳に居座っていた。
そこで「alternative neon database」とググってNeonっぽいDBaaSを探した結果、TiDB Cloudに出会った。
TiDBのトップページの画像
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が真っ先に思い浮かんだ。
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のトップページの画像
脳死で口を半開きにしながらKoyebのコンソールでテキトーにクリックしていった結果、デプロイすることができた。
Railsアプリケーション初デプロイの歓びで「ヨシ!」とほのかにつぶやき、グッ…!と非ほのかに拳を握った。
そしてKoyebが示してくれた私のRailsアプリケーションのURLを、唾を飲み込みながらクリックした。
ディスプレイの一面に、私が作成したWebアプリケーションが広がった。
そこで私は思ったのだ。
「ちょっと遅い…ッ!!」
リクエストしてからレスポンスが返ってくるまでに、遅さを感じた。
ページを遷移するときや何かしらのアクションを起こすときに、毎回そう感じてしまうのだ。

仕方がない。
無料なのだから。
まずもってKoyebを無料で使う際は、リージョンがフランクフルトかワシントンのどちらかしか選べない。
Koyebのコンソールの画像
もちろん選べるだけありがたい。
私はフランクフルトを選んでいた。
データベースのリージョンは日本だ。
つまり日本からフランクフルトまで「データをくれ」と要求して、フランクフルトから日本にあるデータを取得して、取得したデータをフランクフルトから日本に渡していることになるだろう。
間にフランクフルトが入ることで遅くなっていると、短絡的ではあるが考えた。
ただ、Koyebに課金をすれば東京リージョンを選べるし、CPUやメモリだって良いやつにすればいい。
すべては金の無いわたくしめが悪いのだ。
貧しさ故に子を私立に行かせてやれない親の気持ちとはこれか、と打ちひしがれた。
「Koyebよ、あなたは素晴らしい。簡単にデプロイできるし、東京にもリージョンを設けてくれている。ありがとう。」と感謝の念を胸に満たしながらKoyebを背にして、別の道を探しに歩き出した。

すこし歩いたところで、とりえあずFly.ioにデプロイすることにした。
Fly.ioのトップページの画像
Renderは無料で使える期限が明確に定まっているのに対して、Fly.ioは$5まで無料と見聞きしていたので、具体的に無料でどこまで運用できるか分からなかったからだ。
例えば毎月$1しか掛からないようであれば、Renderよりは長く運用できると。

Fly.ioはKoyeb同様に、非常に簡単にデプロイすることができた。
東京リージョンもある。
コンソールも分かりやすい。
そしてコンソールであるものを発見した。
console
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による差はあるかもしれない。

安寧の園へ…

これで「金が掛からないRailsの本番環境」を構築することができた。
Fly.ioにデプロイしてから1カ月ほど経った頃に、Fly.ioからメールが来ていた。
「貴様の今月の使用料が$5未満やから無料にしたるわ」と。

旅の目的を果たした私は、我が家のくたびれたドアを回して帰った。
今、この部屋は安寧の園となっていた。
さぁ、旅の疲れを癒すために眠るぞ。
旅路の果てで見つけたサービスたちの終了や、料金体系の変更が発生するそのときまで。

ちなみに、

  • いまRender確認したら「無料で使えるけど期限あるよ」ってのはデータベースに対してっぽいので、DBaaS使えば恒久的に無料で使えるかも。
    ただ、日本にリージョンが無いよ。
  • 「恒久的」とは書いてきたものの、HerokuとかPlanetScaleの無料プラン廃止とかDeta Spaceがサ終とかあったのでね。
    当記事で紹介した構成もいつどうなるやら分からんよね。

Discussion