最近 Rust をさわり始めてる @zaru です。Rust で雑に Web アプリを作ったものを雑にデプロイしたいな〜と思って調べたところ、render が手頃で良さそうだったので紹介します。

デプロイは GitHub に push するだけ

Dockerfile や設定ファイルなどは何も必要ありません。render のコンソールから GitHub 連携をし、プロジェクトを作り、リポジトリを指定したら、あとは GitHub に push するだけで Rust のビルドが始まり、デプロイされます。超手軽ですね。Heroku のような PaaS になっています。

注意点は host と port くらい

render に限らず他の PaaS もそうですが、Web アプリの host と port 指定は気をつける必要があります。と言っても以下の2点くらいです。

  • host は 0.0.0.0 にする
  • port は環境変数 PORT を受け取れるようにする

render 公式ドキュメントでこの記載は見つけられなかったのですが、これで動くので、おそらく大丈夫でしょう。

具体的に Rust の Web アプリフレームワーク warp のサンプルコードです。

use warp::Filter;
use std::env;

#[tokio::main]
async fn main() {
    let port_key = "PORT";
    let default_port = 3000;
    let port = match env::var(port_key) {
        Ok(val) => match val.parse::<u16>() {
            Ok(port) => port,
            Err(_) => {
                println!(
                    "the port number \"{}\" is invalid. default port will be used.",
                    val
                );
                default_port
            }
        },
        Err(_) => {
            println!(
                "\"{}\" is not defined in environment variables. default port will be used.",
                port_key
            );
            default_port
        }
    };

    let hello = warp::path!("hello" / String)
        .map(|name| format!("Hello, {}!", name));

    warp::serve(hello)
        .run(([0, 0, 0, 0], port))
        .await;
}

render についての感想

  • 初回ビルドは依存パッケージをダウンロードしてくるので、少し時間がかかる
    • 2回目以降はキャッシュしてくれるので、ビルドのみ
  • リージョン
    • 今は2つのリージョンをサポート
      • Oregon, USA
      • Frankfurt, Germany
    • Tokyo リージョンなどのアジア圏への対応は検討中
      • ここで要望を確認できる
      • Asia Region
      • render で決済をする際に国を聞かれる
      • 実際にお金を払ってくれる人が多い地域を優先的にサポートするはずなので、Tokyo リージョンを待望する人は、ぜひお金を払って render を支援してあげてください
  • 実質 Heroku ?
    • 使い勝手の感覚はほぼ Heroku なので、Heroku が好きな人は好きそう
    • ソースコードのみでデプロイできる、まさに PaaS らしい PaaS
    • Heroku との明確な違いは現時点ではそこまで感じてない
    • サポート言語・フレームワークがモダンな感じ