Ruby on Rails さらにエコになった構成要素を解説

2025年4月25日掲載

governance

最近、Rails のエコシステムに新しい変化が起きています。

デプロイに伴う複雑さを排除し、よりシンプルでスムーズな運用体験を実現するために、Thruster 、Kamal Proxy 、および Kamal という構成要素が実装されました。

Puma の前段に Thruster を配置できるようになり、さらに、Kamal Proxy を設定できます。デプロイ時には Kamal が利用可能です。

これらの新しい構成要素は Rails アプリケーションのデプロイや運用をよりシンプルにすることを目指して作られました。

この記事では、Thruster、Kamal Proxy、Kamal の役割と特徴について解説します。

目次

従来の構成との比較

従来の Rails アプリケーションでは、Web サーバとして Nginx や Apache を使用し、アプリケーションサーバとして Puma を採用する構成が一般的でした。しかし、今後は以下のような設計も選択できるようになります:

  • Thruster: Web サーバの役割を担当
  • Kamal Proxy: デプロイ時のリバースプロキシとして機能
  • Kamal: シンプルなデプロイツールとして活躍
rails

1つのコンテナ内で Web サーバとアプリケーションサーバを統合することで、構成を簡略化することが可能です。

役割の解説

Thruster

Thruster は Go 言語で書かれた HTTP/2 プロキシです。
Rails 8 以降では、Dockerfile に Thruster が含まれています。

(Dockerfile)

-snip-
ENTRYPOINT ["/rails/bin/docker-entrypoint"]
-snip-
CMD ["./bin/thrust", "./bin/rails", "server"]

メリット

  • Gem 化: Puma や Rails と統合されたコンテナとして利用可能。
  • シンプルな構成: Web サーバとアプリケーションサーバを分離したコンテナにする必要がない。
  • チューニングの簡略化: デフォルト設定で多くのユースケースに対応。

ただし、細かいチューニングが必要な場合は、依然として Nginx などの選択肢も検討すべきです。

先の図の中のコンテナ単位の枠を見てください。Nginx と Puma+Rails を組み合わせる場合、それぞれ分離したコンテナを docker-compose などで構成することも多かったと思います。Thruster の登場により、Web サーバとアプリケーションサーバの組み合わせを意識しなくてよくなり、単一のコンテナで構築できるようになりました。

 

Kamal Proxy

Kamal Proxy は、HTTP のリバースプロキシとして機能します。主な特徴は以下の通りです:

特徴

  • ゼロダウンタイムデプロイ : 後段のサービスのヘルスチェックを行い、新しいターゲットへのシームレスな切り替えを実現。
  • 証明書の自動管理 : Let’s Encrypt を利用して TLS 証明書を自動的に取得・更新。

Kamal Proxy は、Thruster、Puma、Rails を監視しながらロードバランサー的な役割を果たします。また、証明書の管理も自動化されており、ユーザーはホスト名を設定するだけで済みます。

 

AWS などのクラウドサービス上で独自のロードバランサーや証明書管理を行っている場合、Kamal Proxy は使わなくても大丈夫です。そのような環境では、クラウドネイティブなリソースを活用する運用が可能です。

一例として、以下のような構成が考えられます:

  1. Amazon ECR(Elastic Container Registry)に、Thruster、Puma、Rails を統合した Docker コンテナイメージを登録。
  2. そのイメージを Amazon ECS(Elastic Container Service)のクラスター上で実行。
  3. ECS の機能を利用して、必要に応じてスケールアウトやスケールインを自動化。

クラウドのマネージドサービスを最大限に活用した、柔軟なアプリケーション運用が実現します。

 

Kamal

Kamal は、オンプレミスやクラウドなど多様な環境でのデプロイを簡単に行うためのツールです。特定のクラウドプロバイダや商用ツールに依存しません。

使い方は簡単です。設定ファイルを作成し、kamal deploy コマンドを実行するだけです。

$ kamal deploy

内部的には以下の操作が行われます:

  1. Git 管理: リポジトリのクローンやコミットの管理。
  2. Thruster と Rails コンテナのビルド: Docker イメージのビルドとプッシュ。
  3. Docker ネットワークの作成: コンテナ間の通信を確保。
  4. Kamal Proxy の起動: リバースプロキシとしての機能を開始。

デプロイまでの環境設定

簡単すぎて、逆に分かりにくいかもしれないです。デプロイするまでの初期設定時からの操作を一通りやってみましょう。

初期設定時に必要な作業

概略としては下記の作業です。

  • ドメインの取得とAレコードの設定
  • Git リポジトリの初期化
  • Docker Hub の利用(レポジトリとアクセストークンの設定)
  • 環境変数の設定(KAMAL_REGISTRY_PASSWORD、RAILS_MASTER_KEY)
  • ポート解放(Let's Encrypt の HTTP-01 チャレンジ用に80/tcpを開放)
  • デプロイの設定ファイル

 

一つ一つ具体例を見ていきます。

・ドメインの取得とAレコードの設定

どこで DNS を管理していても問題ありません。名前解決できればよいです。

$ dig myapp.example.com
myapp.example.com. 300	IN	A	192.0.2.1

 

・Git リポジトリの初期化
kamal がコミット名を内部で管理用に使います。最低限 commit だけしておいてください。

$ git init
$ git add .
$ git commit -m "Initial commit"

 

・Docker Hub の利用
コンテナイメージの管理先は、docker hub のレポジトリとします。各項目の適当な名称はこの後の設定ファイルで例示として使います。

  • ネームスペース: myspace
  • レポジトリ: myapp
  • アクセストークン: Read & Write のスコープ

 

・環境変数の設定

$ export KAMAL_REGISTRY_PASSWORD=${上記のアクセストークン}
$ export RAILS_MASTER_KEY=$(cat config/master.key)

 

・ポート解放
Let's Encrypt の HTTP-01 チャレンジのため、80/tcpを0.0.0.0/0からアクセスできるようフィルタを解放しておく必要があります。証明書が作れたら接続元は絞って問題ありません。

 

・デプロイの設定ファイル
rails の version8 から一式がディフォルトで使えるようになっています。

(config/deploy.yml)

service: myapp

image:myspace/myapp

registry:
  username: ***
  password:
    - KAMAL_REGISTRY_PASSWORD

servers:
  web:
    - 192.0.2.1

env:
  secret:
    - RAILS_MASTER_KEY

ssh:
   user: shinya
   port: 10022
   keys:
     - "~/.ssh/dev-key.pem"

proxy:
  ssl: true
  host: myapp.example.com

builder:
  arch: amd64

以上です。

ここまでできていれば、あとは先に紹介したデプロイコマンドを打つだけです。

$ kamal deploy

アクセスしてみましょう。

https://myapp.example.com

まとめ

Railsの新しい構成要素である Thruster 、Kamal Proxy 、および Kamal は、デプロイに伴う複雑さを排除し、よりシンプルでスムーズな運用体験を実現するために設計されました。

現代の開発者が求める「効率性」「柔軟性」を兼ね備えた設計思想が反映されています。オンプレミスでもクラウドでも場所を選ばないで活用できる点も魅力です。

これからも Rails の進化から目が離せません!

おすすめの記事

条件に該当するページがございません