No PaaS Required?レンタルサーバー(Conoha VPS)で立ち上げる Rails 8.0 アプリケーション(サーバー構築編)

Rails

Rails 8.0: No PaaS Required

2024/11/7に正式リリースされたRails 8.0ではNo PaaS Requiredという大胆なメッセージが掲げられました。「現代の開発者はPaaSなしではWebアプリケーションが作れないと思っている。そんなの馬鹿げてる!!」という言葉にはハッとさせられました。

PaaS不要を実現しているのは、kamal2とThrusterを取り入れ、rails new時に自動でコンフィギュレーションが行われることで、誰でも簡単にデプロイ自動化を実現できるようになったことと、Solid QueueやSolid Cacheなどをデフォルトとして、インメモリデータベース不要で多くの機能が使える仕組みを整えたことが大きいです。

多くのトランザクションが発生するようなアプリケーションであればPaaSの採用は理解はできるものの、個人ブログの運営や、就職活動で作成されるようなポートフォリオであっても学習コストや、利用料金の高いPaaSが使われがちな現状は少々異常な状態だとも思えます。

コスト面の比較のために、レンタルサーバーとAWS EC2を使って同程度の性能のサーバーを立ち上げた場合の比較を見てみます。

(注: 2024/11/17 現在の情報です)

Conoha VPS AWS EC2
料金
(36ヶ月一括契約)
296円/月 793.28円/月
(5.14USD レート154.33円/1USD)
メモリ 512MB 0.5GiB
CPU 1コア 2コア(t4g.nano)
SSD 30GB 30GB(EBSを追加)

金額面でも2倍以上の開きがあります。加えて、AWSの利用のためにはコンソールの利用方法などのベンダーに依存した学習が必要になることを忘れてはなりません。加えて、kamal2がもたらすデプロイの自動化まで実現しようとするとさらに学ぶべきことは増えます。そう考えるとPaaSを利用するというのは実はかなりコスト/タイムパフォーマンスが悪い気もしてきます。

とはいえある程度マネージドなサービスであるEC2とレンタルサーバーでは後者の方が立ち上げまでにやることが多いのは事実。実際にレンタルサーバー(Conoha VPS)を立ち上げて、 Webアプリケーションをデプロイするまでをやってみることでどのくらい大変かやってみることにしました。

手順

  1. サーバーを契約する
  2. セキュリティーグループを設定する
  3. 一般ユーザーを追加してrootユーザーログインを禁止する(Optional)
  4. 公開鍵認証を設定する(Optional)
  5. ドメインを取得してDNS設定を行う

サーバーを契約する

Conoha VPS のランディングページより申し込みができます。36ヶ月契約だと最安になりますが、1ヶ月単位から契約ができます。OS はお好みのもので良いと思いますが、私はDebian12.05を選択しました。(以降デプロイについての説明もこの環境におけるものであることをご了承ください。)

rootパスワードに設定する内容はサーバーへのログインパスワードになりますので、忘れないようにメモしておいてください。

セキュリティグループを設定する

Conoha VPSのコンソールにログインして、サーバーのセキュリティグループを設定していきます。初めはどのポートへの接続も許可されていない状態です。設定時に使用するSSHの開放はマスト、WebアプリケーションをデプロイするならHTTP, HTTPSの解放もマストになると思います。

コンソールにてサーバーを選択、該当するサーバーを選んで、ネットワーク情報 > セキュリティグループより以下を追加する必要があります。

  • IPv4v6-SSH
  • IPv4v6-Web (HTTP, HTTPS ポートの解放に相当)

一般ユーザーを追加してrootユーザーのログインを禁止する(optional)

rootユーザーは全ての操作が実行できてしまうため、誤操作によってとんでもないことが引き起こされる可能性があります。(サーバーのデータを全消しして復旧不可能になる…など)ですので、rootユーザーのログインは禁止して、一般ユーザーでのログインで操作を行うことが推奨されます。

一般ユーザーを作成するためにはサーバーにsshで接続し、以下のようにします。接続先のサーバーのIPアドレスは、コンソールのサーバーリストから確認できます。

# ユーザーの追加
$ useradd <ユーザ名>

# パスワードの設定
$ passwd <ユーザ名>

# sudo が実行可能なユーザーに追加する
$ sudo usermod -aG sudo web
次にrootユーザーによるログインを禁止しましょう。これはsshd_configにて設定が管理されています。
$ vi /etc/ssh/sshd_config

# sshd_config 内の PermitRootLogin の設定値を変更する
PermitRootLogin yes
↓
PermitRootLogin no

# sshd を再起動する
systemctl reload sshd

公開鍵認証を設定する(optional)

SSH通信を行う際の認証方式は初めパスワード認証となっていますが、パスワード認証はNGにして公開鍵認証方式をのみを許可するように設定することをおすすめします。なぜならパスワード認証はブルートフォース攻撃によって突破されてしまう危険性があるためです。

公開鍵認証に用いられる鍵ペアはConoha VPSのコンソールから作成できます。セキュリティ > 追加を選んで作成してください。するとダイアログが開くので、ここから秘密鍵をダウンロードできます。(もちろんssh-keygenなどで作成しても構いません。)

公開鍵はサーバー、秘密鍵は接続を行うクライアント側で管理します。まず公開鍵をサーバーに配置しましょう。コンソールのセキュリティ > SSH keyより、生成した鍵のパブリックキーの値をコピーして使います。

# 一般ユーザーでサーバーにログイン
$ ssh <ユーザー名>@<IPアドレス>

# ユーザーのホームディレクトリを作成する
$ su -
$ mkdir /home/<ユーザー名>
$ chown <ユーザー名>:<ユーザー名> /home/web
$ exit

# 公開鍵を配置する <= コピーしたパブリックキーをペーストする
$ vi .ssh/authorization_keys

この状態ではパスワード認証によるログインと公開鍵認証のどちらも可能となっている状態です。sshd_configの内容を変更し、パスワード認証を禁止します。

$ vi /etc/ssh/sshd_config

# sshd_config 内の PasswordAuthentication の設定値を変更する
PasswordAuthentication yes
↓
PasswordAuthentication no

# sshd を再起動する
systemctl reload sshd

ローカル側に秘密鍵を配置しましょう。

$ mv <ダウンロードした秘密鍵のパス> ~/.ssh/keys/hoge.pem

.ssh/config に、指定したIPアドレスにsshする際は同じユーザー、秘密鍵を使うように設定しておくと便利です。

$ vi ~/.ssh/config

Host <サーバーのIPアドレス>
  User <ユーザー名>
  IdentityFile ~/.ssh/keys/hoge.pem

ドメインを取得してDNS設定をする

今回はドメインの取得、DNS設定ともにConoha VPSで行ないます。

ドメインはConoha VPSのコンソールのドメイン > ドメイン取得から取得できます。

ドメインを取得したらドメイン名をクリックして、ネームサーバーの設定を行います。

筆者の環境はConoha VPS Ver3.0だったので、ネームサーバーをカスタムに変更し、新しいConohaのDNSサーバを指定する必要がありました。

次にDNSサーバーの設定を行います。

Conoha VPSのコンソールのDNSから設定が行なえます。

+ドメイン ボタンを押すとドメインを追加できます。ここに取得したドメインを入力し、NSレコード、Aレコードの設定をします。

NSレコードにはネームサーバーである a.conoha-dns.com, b.conoha-dns.org を指定し、AレコードにサーバーのIPアドレスを指定します。

ドメインの浸透には24時間から72時間ほど掛かるので、もしすぐにサーバーにアクセスができないようであってもしばらく待ちましょう。

これでConoha VPSを利用した、Rails アプリケーションを立ち上げるための、サーバーの構築は完了です。

まとめ

Conoha VPSを利用したサーバーの構築をしてみましたが、個人的にはそれほど大変ではなかったように思えます。PaaSに比べて機能がシンプルなので、コンソール上での操作に迷いはなかったですし、ベンダーに依存した専門用語が登場しない分、利用するための学習コストも低いです。

次の記事では構築したサーバーにRailsアプリケーションをデプロイするところまでを書いていきます。

コメント

タイトルとURLをコピーしました