この記事はソニックガーデン 若手プログラマ Advent Calendar 2024の7日目の記事です。
はじめに
2024年9月にRails World 2024が開催されました。Railsの創始者であるDHHの発表で、Rails 8のベータ版がリリースされました!
このリリースにより、RailsのThe One Person Framework 化が格段に前進しました。SQLiteだけで、プライマリーデータベース、キャッシュ、キュー、リアルタイム通信の機能をカバーできるようになりました。Kamal により、さまざまなところに簡単にデプロイできるようになりました。
Kamalを使って、RailsサーバーをVPSにデプロイしてみました。コマンドを叩くだけでサクッとデプロイでき、体感がとても良かったです。「Kamalを使えるようになったのはいいけど、どういう仕組みでデプロイしてるんだ?」と思ったので、本記事では、Kamalのデプロイの仕組みをまとめます。
Kamalって何?
まず、Kamalとは何なのかを簡単にまとめます。
Kamalの公式サイトを見てみると、以下のメッセージに目を引かれます。つまり、Kamal は、「物理サーバーからクラウドの仮想マシンまで、どんなところにもWebアプリケーションをデプロイすること」を目的としたソフトウェアということです。
さらに、公式サイトを読み進めていくと以下の文章があります。
Kamal offers zero-downtime deploys, rolling restarts, asset bridging, remote builds, accessory service management, and everything else you need to deploy and manage your web app in production with Docker. Originally built for Rails apps, Kamal will work with any type of web app that can be containerized.
これを粗く要約すると 「Kamalは、Webアプリケーションの本番環境デプロイに関することでやりたいことを色々やってくれる」 ということです。
Kamalのデプロイの仕組み
Kamalを使ってWebアプリケーションをデプロイする際は、基本的にkamal setup
とkamal deploy
のこれらコマンドしか使いません。
デプロイ先サーバーに対して、Kamalによるデプロイを初めてする場合、kamal setup
を実行します。そうすると、サーバーにKamalを使ったデプロイが環境が作られます。そして、Webアプリケーションがサーバーにデプロイされます。
デプロイ先サーバーに対して、Kamalによるデプロイをしたことがある場合は、kamal deploy
を実行すれば、サーバーにWebアプリケーションがデプロイされます。
デプロイの戦略
デプロイの戦略は、「デプロイ先サーバー群に対するローリングリスタート戦略」と「ブルーグリーン・デプロイメント戦略」を組み合わせたものを採用しています。
新しい変更をサーバーごとにデプロイして、各サーバーが新しいバージョンのWebアプリケーションを古いバージョンと並行して実行します。トラフィックが安全に切り替わったら、古いバージョンのWebアプリケーションを停止します。
kamal deploy
実行時の処理の流れ
上記戦略を実現するために、kamal deploy
実行時に以下の処理が行われます。
- SSHにより、ローカルマシンとデプロイ先サーバーに接続
- ローカルマシンとデプロイ先サーバーの両方で、Dockerレジストリにログイン
- ローカルマシンで、Dockerイメージをビルドして、DockerレジストリにDockerイメージをプッシュ
- デプロイ先サーバーで、DockerレジストリからDockerイメージをプル
- デプロイ先サーバーで、kamal-proxyが80番と443番のポートを受け付けているか確認
- 新バージョンのWebアプリケーション用のDockerコンテナーを起動
- 新コンテナーが
GET /up
へのリクエストに対して200 OK
で応答することを確認する - 新コンテナーへのトラフィックがルーティングされるように、kamal-proxyに設定する
- 古いバージョンのWebアプリケーションが実行しているコンテナーを停止
kamal-proxyは、Kamalに同梱されているHTTPプロキシです。これにより、HTTPリクエストを適切なコンテナーにルーティングしています。
kamal-proxyにより、古いバージョンのコンテナーから、新しいバージョンのコンテナーへのトラフィックルーティングを適切に行なっています。適切なルーティングにより、ダウンタイムがない安全なデプロイを実現しています。
おわりに
本記事では、Kamalのデプロイの仕組みについてまとめました。デプロイの戦略は、「ローリングリスタート戦略」と「ブルーグリーン・デプロイメント戦略」の組み合わせたものを採用しています。その戦略をどのように実現しているのか具体的にまとめました。
この記事を読んで、Kamalを使ってみようと感じてもらえれば幸いです。
ソニックガーデン 若手プログラマ Advent Calendar 2024の8日目は@Ito-Misaki です。お楽しみに!