サヨナラHeroku 〜アプリケーションの知識だけで本番稼働を実現できる無料のプラットフォームを追い求めて〜
はじめに
Herokuの無料枠がもうすぐ消滅する(2022/11/28)ので、ソフトウェアエンジニアリングを勉強中の初学者の方々は、ポートフォリオの置き場所に頭を抱えることが確定しています。本稿では、その代替手段として、お金をかけず、かつなるべくアプリケーションの知識だけで、ポートフォリオの本番稼働を実現できる最適なプラットフォームを決定し、具体的な導入方法までを説明したいと思います。
オルタナティブHeroku
まず海外にはオルタナティブHerokuを謳っているプラットフォームはそれなりにあります。その中で無料枠があってポートフォリオを公開するのに適していそうなプラットフォームは以下の通りです。
AWSやGCPなどのメジャーなクラウドベンダーの中にも、それに類するサービスは存在しますが、場合によってはコンテナイメージを自前で用意しなくてはならない点、かつどちらも完全無料とは言えない点(特にApp Runnerは無料枠なし)で初学者には敷居が高いと言えます。
- App Runner(AWS)
- CloudRun(GCP)
この中からアプリケーションだけでなくRDBMSも無料のものに絞ると、Fly.ioとRailwayがやや変則的に無料で提供しているほか、Renderが90日間のみ無料で使用できるPostgresを提供しているぐらいで、Herokuに比べると物足りなさを感じるかもしれません。
いずれにせよRDB必須のオルタナティブHerokuはFly.ioかRailwayで決まりになります。しかしそれでは記事の面白みが損なわれてしまうため、ここは無料のDBaaS(Database as a Service)との組み合わせも模索したいと思います。無料プランがあり、それなりのストレージ容量(1GB以上)が提供されているDBaaSを対象とします。
なお、フロントエンド界隈で人気のVercelも、実はRails、Laravel、Djangoなどをデプロイできる点でオルタナティブHerokuと言えそうですが、そこに注力しているようには見えなかったため、今回の対象からは除外しています。
各プラットフォームの所感
Herokuはアプリケーションを動かすために必要なリソースや公式ドキュメントの提供に止まらず、本番運用に必要な、監視、デプロイ、シークレット情報管理、SSLの自動更新といった仕組みも一通り揃えてくれていました。これも初学者がHerokuを利用する上で、魅力的な部分だったと考えます。
一方、利用していないときは待機状態となり、待機後にアクセスすると、アプリケーションをロードするのに数十秒かかる点や、無料プランでは海外リージョンしか選択できない点が不満として挙げられていました。同様に、今回調査したオルタナティブHerokuなプラットフォームにも一長一短があるので、それぞれ列挙します。
PaaS
Cyclic
Herokuと同じくAWS上に構築されているPaaSです。Herokuで提供している本番運用に必要な仕組みは、本プラットフォームでも提供してくれています。加えて、Herokuと異なり、無料プランで国内リージョンの利用が可能で、利用していないと待機状態になる、なんてこともありません。おまけにDynamoDBとs3もデフォルトで提供されており、DBaaSと組み合わせればかなり広範なユースケースに対応できるプラットフォームと言えます。ただ公式のドキュメントはかなり少なく、ハードルは高い印象が拭えません。
参考記事
Deta
Herokuの良い点と悪い点をほぼそのまま備えているプラットフォームです。有料プランが存在しないため事業継続性の観点で難があり(そもそもbeta提供)、これを使うぐらいなら他のプラットフォームを使いたいところです。
参考記事
Fly.io
本番運用に必要と思われる仕組みは全て提供されている上に、無料で使えるVMが、メモリ256MBと他に比べて貧弱ではあるものの、最大3つ使える点が興味深いです。ロードバランサーの後ろにVMが存在する構成であるため、1つを無料のRDBコンテナとして使用したとしても、最初から2台運用をすることで非常に安定したインフラを構築できるのは素晴らしいですね。ロードバランサーに関しては、手を入れなくても「いい感じ」に設定してくれます。
さらに、公式から提供されているドキュメントの充実具合も今回取り上げたプラットフォームの中では抜きん出ているので、初学者にとってのハードルも非常に低いと思います。
ただ提供されている数々の仕組みをCLIから操作することになる点は、人によってはマイナスに映るかもしれません。あとサインイン後クレカ登録必須かのような画面の見せ方は紛らわしいです(クレカ入力の下にクレカなしで利用するための目立たないリンクがあリます)。
参考記事
Koyeb
ポテンシャルはかなり高めの新興のPaaS。リージョンは今のところドイツ(フランクフルト)のみで今後シンガポール等拡大予定。最終的には世界各国の10拠点にアプリケーションを展開できるようです(マルチリージョンデプロイエンジンと呼んでいるようです)。無料枠は後述のRailwayと同じく5ドルではあるものの、メモリ256MBのnanoコンテナ2つまたは512MBのmicroコンテナ1つをフルタイムで稼働させられます。また、秒単位課金かつゼロからスケールできると謳っているため、ポートフォリオ用途であれば、実は複数の役割の異なるコンテナを組み合わせて稼働させることもできそうです。
またGitHubとの連携を想定した作りになっているため、リポジトリにpush後にデプロイというパイプラインを最初から導入できる点も魅力的です。今後この仕組みにはプレビュー環境も追加される予定です。
なおDBについてはDBaaSなど外部のサービスを使えというスタンスのようで、ご丁寧におすすめのベンダーをリサーチした記事を提供してくれています。
参考記事
Railway
Fly.ioに比べるとやや劣るもののドキュメントが充実していて、初学者でもとっつきやすい印象があります。また様々なフレームワークに適したデプロイテンプレートが提供されている点も好ましいと言えます。例えばDjangoやLaravelのテンプレートを使えば、DBも一緒にセットアップできます。ただしその場合はアプリとDBの2サービスの構成となるため、1ヶ月5ドル分の無料枠を月中に使い切ってしまう可能性があります。またリージョンがアメリカ西部のみなのも気になります。リージョン拡大の計画はあるので今後に期待したいです。
また、ファーストパーティーのスケジューラーが提供されておらず、サードパーティのライブラリの導入手順が案内されているのみなところは、初学者には辛いと思います。
参考記事
Render
数年前からオルタナティブHerokuとして注目されていたPaaSです。Postgresを90日間しか使えない点は残念ですが、キャッシュやセッション管理に無料のRedisを使える点は他には無い魅力と言えるでしょう。一方スケジューラー(cron)は有料のみ。
リージョンは国内にはなく、アジアではシンガポールのみとなリます。一応東京リージョンのリクエストが出ているようなので、今後もしかしたら提供されるかもしれません。またHerokuと同じく一定期間アクセスがない場合は、待機モードとなり、スピンアップ完了するまで最大30秒の待ち時間が発生します。
参考記事
DBaaS
PlanetScale
今年日本国内でもかなり注目を浴びた分散DBサービスです。分散DBは今とても熱い分野ですが、その中でもこのサービスは、MySQLベースであることと、無料枠が大きいこと、DBの更新や管理面で優れた機能が多く提供されていること、そして東京リージョンがあること、この4つが魅力です。
bit.io
3GBの無料枠に最大3つのデータベースをセットアップできるPostgresベースのマネージドサービスです。ユニークな点として、テーブル作成とデータ投入をWEBの画面からCSVをアップロードして行えます。リージョンは今のところアメリカのみ。そのせいか、migrationしようとすると反応がもっさりしていて、実運用は難しそうでした。
2023/7/6追記:
本サービスは、2023/6/29に終了しました
CockroachDB serverless
9月下旬にbetaが外れて正式版となったPostgresベースのマネージドサービスです。無料枠として5GB分のストレージが提供されています。ただ国内リージョンはなく、クラウドプロバイダにAWSを選択した場合は、シンガポールとムンバイ、GCPを選択した場合はジュロン(シンガポール西部)がアジア地域ということで有力な選択肢となります。
また、無料枠は2億5000万のリクエストユニットまでという制限もあるようですが、これは各クエリで発生する計算量とIOPsを測定することで弾き出された数値が元になるようです。面白いことに、この制限の範囲内であればDBは作り放題のようです(プランに明記がないため、実際に2つめのDBを作成してみたところ、問題なく作成できました)。
サマリーシート
一通り各サービスを眺めてみましたが、結局Herokuと比べてどうなのか?が分かりにくいと思ったので、評価項目を用意して、Herokuとそれ以外のPaaSの場合で比較できるようにしてみました。なお当たり前ですが、無料枠の範囲内での話です。
PaaS
Heroku | Cyclic | Deta | Fly.io | Koyeb | Railway | Render | |
---|---|---|---|---|---|---|---|
クレカ登録 | 不要 | 不要 | 不要 | 不要 | 不要 | 不要 | 不要 |
国内リージョン | なし | あり | なし | あり | なし | なし | なし |
待機時間 | あり | なし | なし | なし | なし | なし | あり |
RDB | あり | なし | なし | あり | なし | あり | 一部あり (90日間) |
スケジューラー | ○ | ○ | ○ | ○ | ○ | △ | × |
SSH/Console | あり | なし | なし | あり | あり | なし | あり |
カスタムドメイン | あり | あり | あり | あり | あり | あり | あり |
SSL自動更新 | あり | あり | あり | あり | あり | あり | あり |
シークレット管理 | あり | なし | なし | あり | あり | あり | あり |
インターフェース | GUI | GUI | CLI | CLI | GUI | GUI | GUI |
監視 | あり | あり | なし | あり | あり | あり | あり |
ロギング | あり | あり | あり | あり | あり | あり | あり |
ドキュメント | 充実 | それなり | 最低限 | 充実 | それなり | 充実 | 充実 |
ZeroConf | × | × | × | ○ | ○ | ○ | × |
DBaaS
PlanetScale | bit.io | CockroachDB | |
---|---|---|---|
クレカ登録 | 不要 | 不要 | 不要 |
国内リージョン | あり | なし | なし |
接続タイプ | MySQL | Postgres | Postgres |
ストレージ | 5GB | 3GB | 5GB |
DB作成 | 1つ (+開発用2つ) |
3つ | いくつでも |
GUI操作 | なし | あり | あり |
監視 | あり | なし | あり |
SSL | あり | あり | あり |
ドキュメント | 充実 | 最低限 | それなり |
結論
以上、無料でポートフォリオを公開できるPaaSとDBaaSを調査しました。結論としては、PaaSはFly.ioがポートフォリオを公開するという用途では最も適しており、次点はKoyebです。今後リージョンが拡大していけばFly.ioと遜色のないレベルのサービスになるように思います。
DBaaSについては、やはり使い勝手や国内リージョンが使えるという点でPlanetScaleが最良と言えるでしょう。bit.ioはmigration時のレスポンスの悪さが気になりました。CockroachDB serverlessはGAから日が浅くDB作成に制限がないのは魅力であるとしても現時点では様子見かなと。ただし、Postgresを使うことを最重要視するのであれば、有力な選択肢となるでしょう。
一旦これで終了にしてしまっても良いのですが、「無料は魅力だけど、構築には相応の手間がかかるでしょう?」と誤解して去っていく人が居ると悲しいので、このあとFly.ioとPlanetScaleの組み合わせによるアプリケーションの公開の手順を、具体的に検証していきたいと思います。
Fly.ioを使ってアプリケーションを公開する
まず最初にお伝えしておくと、下準備を終えた状態かつRDB等他のリソースへの接続を行わない前提であれば、アプリケーションの公開に要する時間は3分程度でした。しかもほぼ待ち時間のみです。
下準備
Fly.ioでアプリケーションを公開する場合は、専用のCLIツールを使います。もちろんアカウントも必要なので、Fly.ioへのサインアップとCLIツールのインストール、認証を行いましょう。
サインアップ
公式サイトのサインアップページにアクセスし、Githubアカウントまたは適当なアイパスを入力してアカウントを作成します。
CLIツールのインストール
以下のページの手順に沿ってインストールを行います。
CLIツール認証
以下の手順でCLIから認証を行います。カード番号の入力フォームが出てきますが、入力しなくても認証はできるので注意。
- 以下のコマンドを実行します
flyctl auth signup
- ブラウザにリダイレクトされるので以下の画面からサインアップを行います
- 以下の画面のカード入力欄直下の
Try Fly.io for free
をクリックして認証を完了します
公開
今回は、私がPHPerであることからComoserでインストールした直後のLaravelアプリケーションを公開するところまでを行いました。
1.fly launch
アプリケーションのディレクトリ直下に移動し、fly launch
コマンドを実行します。実行するとapp name
とregion
を尋ねられるので適当に入力します。最後に、deploy
を行うか尋ねられるので、n
を選択します。この時点で、LaravelかどうかをFly.ioが認識して、APP_KEYの生成も行ってくれます。
2.fly.toml編集
アプリケーションディレクトリ直下に自動でfly.tomlが生成されているので、それを開いて編集します。今回のアプリケーションはPHP8.1で稼働するものなので、バージョンの値を変更します。ちなみに変更せずにデプロイすると、アプリケーションは500エラーとなりました。
[build]
[build.args]
NODE_VERSION = "14"
- PHP_VERSION = "8.0"
+ PHP_VERSION = "8.1"
[env]
APP_ENV = "production"
3.fly deploy
fly deploy
コマンドを実行します。初回のデプロイでは、dockerのビルドが行われます。ビルドに1〜2分、その後デプロイします。
4.fly open
fly open
コマンドを実行します。ブラウザが開き、Fly.io上に作成されたアプリケーションにリダイレクトします。
ここまでのまとめ
以上でアプリケーションの公開まで完了しました。途中で躓くことはなかったのですが、デプロイはたまにAPIエラーでこけることが報告されており、もしエラーメッセージが表示された場合はリトライする必要があるかもしれません。またapp name
はFly.io内全体でユニークである必要があり、かつ一度つけた名前のインスタンスを削除したとしても名前は残ります。名前が被るとエラーになるので、その点も気をつけてください。
Fly.ioをPlanetScaleと接続する
次にFly.ioのアプリケーションをPlanetScaleに接続します。画面に沿って作業をして2-3分でDBを作成することができました。
下準備
サインアップとDB作成を行います。
サインアップ
公式サイトのサインアップページにアクセスし、Githubアカウントまたは適当なアイパスを入力してアカウントを作成します。
DB作成
-
サインアップ後に送られてくるメールのリンク(Confirm email)からwelcomeページに移動します。
-
welcomeページには、オンボーディング用のスライドがあり、それを進めていくと最後に
Create your first database
というボタンが現れるので、クリックしましょう。オンボーディングなんて不要だと思った人は、welcomeページの下の方に「Create」というアンカーがあるのでそれをクリックしてください。
-
DBを作成します。DB名を入力し、Regionを選択します。RegionはTokyoを選びましょう。
接続情報の取得
-
自身のマイページから作成したDBのダッシュボードに移動し、画面右にある「connect」ボタンをクリックします。
-
表示される接続情報の画面から、ConnectWithのプルダウンををクリックします。
-
表示されるメニューから今回接続するアプリケーションの言語やフレームワークを選択します。今回はLaravelを選択します。
接続情報の登録
今回はFly.ioのアプリケーションから接続する必要があります。このため、上記画面で出力された情報を、Fly.ioのsecretに登録します。シークレットにはパスワードのように非公開にしたい情報のほか、アプリケーションによって変更することになる情報も登録します。fly.tomlのenvディレクトリで定義していると、例えばFly.io上に本番とstg両方のアプリケーションを構築した場合、環境に応じて設定情報を切り替えることができません。このため、シークレット側に格納しておく方が都合が良いのです。
fly secrets set DB_DATABASE=hoge DB_USERNAME=fuga DB_PASSWORD=xxxx
またfly.tomlのenvディレクティブにはDB_HOSTとMYSQL_ATTR_SSL_CAを追加します。値はplanetscaleから得られたものを使ってください。
[env]
APP_URL = "https://imah-hoge-prd.fly.dev"
APP_ENV = "production"
LOG_CHANNEL = "stderr"
LOG_LEVEL = "info"
LOG_STDERR_FORMATTER = "Monolog\\Formatter\\JsonFormatter"
+ DB_HOST=ap-northeast.connect.psdb.cloud
+ MYSQL_ATTR_SSL_CA = "/etc/ssl/certs/ca-certificates.crt"
ここまでのまとめ
以上で接続の準備が完了となります。この後、再びFly.ioにアプリケーションをデプロイすれば、PlanetScaleと接続できるようになります。
最後に
今回はあくまでポートフォリオの公開先として、Herokuの無料プランに代わる選択肢をリサーチするというテーマでした。当然商用利用では事情が異なってきますのでご注意ください。
とはいえ今回紹介したFly.ioとPlanetScaleは、有償利用の場合でもコスパと柔軟性に優れているので、特に予期せぬスパイクが発生するような商用サービスの公開先を探しているケースでも参考になると思います。
また、ちょっとしたサービスをリリースする先としても、1から環境を構築するVPSよりも、コードと設定ファイルを準備してデプロイするだけですぐ公開できるプラットフォームの方がリリースへのハードルは遥かに低いとも思いました。
Discussion
以下twitterやはてブでご指摘いただきていた点を修正しました。ご指摘ありがとうございました。
Bit.io なのですが、先月29日にサービスを終了したようです:
https://bit.io/
ツイートでは話題にしてたのにこちらは更新しておりませんでした。ご指摘ありがとうございます。