11月8日、Ruby on Railsで「Rails 8.0: PaaS は不要(Rails 8.0: No PaaS Required)」と題した記事が公開された。この記事では、最新バージョンのRails 8.0がもたらす、PaaS(Platform as a Service)を不要にする新しいデプロイ手法や、そのために備わったさまざまな機能について詳しく紹介されている。
以下に、その内容を詳細に解説する。
Kamal 2 + Thrusterの導入:シンプルで迅速なデプロイ
Rails 8.0では、アプリケーションをどこへでも素早くデプロイできるための新しいツールセット「Kamal 2」が標準搭載されている。Kamal 2を使うことで、たとえクラウドVMであっても、物理的なサーバーであっても、Linuxサーバーを簡単にセットアップできる。kamal setup
コマンドを一回実行するだけで、サーバーがアプリケーションサーバーとして稼働する準備が整うのだ。さらに、Dockerfileが一新されており、これにより「Thruster」と呼ばれる新しいプロキシがPuma Webサーバーの前に位置し、X-Sendfileの高速化、アセットキャッシング、圧縮などの機能を提供するため、Nginxなどの追加Webサーバーを用意する必要がなくなった。この構成により、Railsのコンテナはインターネットからのトラフィックを即時に受け入れることが可能である。
また、Kamal Proxyと呼ばれる新しい専用のプロキシも搭載されており、ゼロダウンタイムのデプロイが可能であるうえ、Let’s Encryptを使ったSSL証明書の自動化にも対応している。これにより、複数のアプリケーションを1つのサーバー上で運用する際の複雑な設定が不要になる。これらの機能によって、Railsアプリケーションのデプロイと運用がこれまで以上にシンプルで強力なものとなった。
Solid Adapterによるサービス依存の削減
Rails 8では、RedisやMemcachedといった外部サービスへの依存を排除するために、SQLiteベースのSolid Adapterが新たに追加された。これにより、キャッシュやジョブ管理を行うために外部サービスを必要とせず、SQLiteのストレージを活用することで処理の高速化が図られている。具体的には、以下の3つのアダプターが新たに提供されている:
Solid Cable
WebSocketメッセージの配信には通常Redisを利用するが、Solid CableによりSQLiteを利用してのメッセージ配信が可能となった。これにより、リアルタイム更新のためのサーバー間通信が簡素化され、デバッグのためのメッセージ保持機能も提供されている。Solid Cache
キャッシュ管理には一般的にRedisやMemcachedが使われるが、Solid Cacheではディスクストレージを活用することで、長期間かつ大容量のキャッシュを管理可能にする。Basecampでは実際に10テラバイト以上のキャッシュがディスク上で管理されており、特にレンダリング速度の向上に寄与している。Solid Queue
バックグラウンドジョブ処理にもSQLiteを活用するSolid Queueが登場した。これにより、従来必要とされていたジョブ管理フレームワークを置き換えることができ、簡単な設定で効果的なキュー管理が行える。たとえば、失敗したジョブの再試行や定期的なジョブスケジューリングにも対応しており、37signalsのHEYアプリケーションでは1日2000万件以上のジョブを処理するために使われている。
Propshaftでのアセット管理
Rails 8では、これまで長らく使用されてきたアセットパイプラインのSprocketsが「Propshaft」に置き換えられた。Propshaftはシンプルさを重視して設計されており、アセットの読み込みパスの提供と、将来のキャッシュを有効にするためのダイジェスト付加のみを目的としている。これにより、複雑なJavaScriptビルドプロセスが不要となり、簡素なアセット管理が可能となる。
認証機能の標準ジェネレーター
セキュアなアプリケーション構築を支援するため、Rails 8には基本的な認証システムを自動生成するコマンドが新たに追加された。bin/rails generate authentication
を実行するだけで、セッション管理やパスワードリセット機能、メタデータ追跡機能などを備えた基本的な認証システムがセットアップされる。このジェネレーターにより、Rails開発者は迅速にかつ安全にアプリケーションの認証機能を構築することが可能となり、さらにベンダーサービスへの依存も不要となる。
まとめ
Rails 8は、これまでのRailsの概念をさらに拡張し、デプロイの複雑さを排除するための機能が数多く実装されている。従来、外部サービスやPaaSに依存していたデプロイやアプリケーション運用のプロセスが劇的にシンプル化され、開発者が手軽に本番環境でのデプロイを実現できる時代が到来したと言えるだろう。
詳細は[Rails 8.0: No PaaS Required]を参照していただきたい。