前回、Amazon Linux 2023 の Docker イメージで Rails を立ち上げられた。
今回は、改めて AWS EC2 上の Amazon Linux 2023 で Rails を立ち上げる。
参考
操作
セキュリティグループを作成
- VPC エンドポイント 用を作成
- EC2 インスタンス 用を作成
どちらもインバウンドルール、アウトバンドルールともに空で入れておく。
EC2 インスタンスを作成
Amazon Linux 2023 でインスタンスを作成。
作ったEC2インスタンス用のセキュリティグループを割り当てる。
VPC エンドポイントを作成
- 名前:任意
- サービスカテゴリ: EC2 Instance Connect Endpoint
- VPC: EC2 インスタンスに割り当てた VPC を設定
- セキュリティグループ: 作った VPC エンドポイント用のセキュリティグループを割り当て
- subnet: 任意
セキュリティグループを編集
VPC エンドポイント 用を作成
- インバウンドルール:空
- アウトバンドルール:
- タイプ:SSH
- プロトコル:TCP
- ポート範囲:22
- 送信先:カスタム
- EC2 インスタンス用のセキュリティグループ
EC2 インスタンス 用を作成
- インバウンドルール:
- タイプ:SSH
- プロトコル:TCP
- ポート範囲:22
- ソース:カスタム
- VPC エンドポイント用のセキュリティグループ
- アウトバンドルール:
- タイプ:すべてのトラフィック
- プロトコル:TCP
- ポート範囲:22
- 送信先:カスタム
- 0.0.0.0/0
- インバウンドルール:
EC2 インスタンス内の設定
EC2 Instance Connect エンドポイントを使用したEC2 Instance Connect で、EC2 インスタンスへ接続できるようになっている。
ruby のセットアップ
asdf 経由での ruby 導入。
1 | $ dnf update -y |
nginx のセットアップ
1 | $ dnf install -y nginx |
Rails のセットアップ
1 | $ bundle init |
別のコンソールで、curl localhost:3000
を実行すると応答する。
とりあえず、起動まで確認できる。
Rails と nginx を連携
1 | #ポート設定をコメントアウトして |
1 | upstream rails_app_unix { |
1 | $ bundle exec rails s |
別のコンソールで、curl localhost
を実行すると応答する。
nginx のログを見ると nginx を通過していることを確認できる。
インターネットからアクセスさせる
直接
EC2 インスタンスの、セキュリティグループを編集。
- EC2 インスタンス 用を作成
- インバウンドルール:
- タイプ:HTTP
- プロトコル:TCP
- ポート範囲:22
- ソース:Anywhere IPv4
- 0.0.0.0/0
- インバウンドルール:
ブラウザで、EC2 インスタンスのパブリック IPv4 DNS にアクセスすると、Rails が応答する。
ただし、Blocked host: [パブリック IPv4 DNS に記載されたもの]
となる。
以下のように編集。
1 | Rails.application.configure do |
再起動すると、インターネットからの通信にもRailsからエラー無く応答する。
ALB 経由
ターゲットグループを作成。
- ターゲットタイプの選択:インスタンス
- ターゲットグループ名:任意
- プロトコル:HTTP
- ポート:80
- VPC: EC2 インスタンスが所属しているVPC
- プロトコルバージョン: HTTP1
ロードバランサー用セキュリティグループを作成。
- EC2 インスタンス 用を作成
インバウンドルール:
- タイプ:HTTP
- プロトコル:TCP
- ポート範囲:80
- ソース:Anywhere IPv4
- 0.0.0.0/0
インバウンドルール:
- タイプ:HTTP
- プロトコル:TCP
- ポート範囲:80
- ソース:Anywhere IPv6
- ::/0
アウトバンドルール:
- タイプ:HTTP
- プロトコル:TCP
- ポート範囲:80
- 送信先:カスタム
- EC2 インスタンス用のセキュリティグループ
ロードバランサーを作成。
- Application Load Balancer を選択
- 基本的な設定
- ロードバランサー名:任意
- スキーム:インターネット向け
- IPアドレスタイプ:Dualstack
- ネットワークマッピング
- VPC 任意
- マッピング:任意(今回はすべてチェックをいれた)
- セキュリティグループ
- ロードバランサー用セキュリティグループ を割り当て
- リスナーとルーティング
- プロトコル:HTTP
- ポート:80
- デフォルトアクション:作成したターゲットグループを割り当て
ブラウザで、ロードバランサの DNS 名 にアクセスすると、Rails が応答する。
また、ただし、Blocked host: [パブリック IPv4 DNS に記載されたもの]
となる。
config/environments/[環境].rb
をまた編集。
再起動すると、インターネットからの通信にもRailsからエラー無く応答する。
EC2 インスタンスのターゲットグループは、インターネットからのアクセスを受け付けているので、編集する。
- EC2 インスタンス 用を編集
- インバウンドルール:
- タイプ:HTTP
- プロトコル:TCP
- ポート範囲:22
- ソース:Anywhere IPv4
- ロードバランサーのセキュリティグループ
- インバウンドルール:
ブラウザで、EC2 インスタンスのパブリック IPv4 DNS にアクセスして応答しないことを確認できる。
割り当てたドメインでHTTPS
Route53 でドメインを取って有り、パブリック証明書を取ってあるものとする。
ロードバランサーのセキュリティグループを編集。
- EC2 インスタンス 用を作成
- インバウンドルール:
- タイプ:HTTPS
- プロトコル:TCP
- ポート範囲:443
- ソース:Anywhere IPv4
- 0.0.0.0/0
- インバウンドルール:
- タイプ:HTTPS
- プロトコル:TCP
- ポート範囲:443
- ソース:Anywhere IPv6
- ::/0
- インバウンドルール:
ロードバランサーにリスナーを追加。
- リスナーの詳細
- プロトコル:HTTPS
- ポート:443
- アクションの種類:ターゲットグループへ転送
- ターゲットグループへ転送:作成済みのターゲットグループを割り当て
- セキュアリスナーの設定
- セキュリティポリシー: ELBSecurityPolicy-TLS13-1-2-2021-06 (推奨)
- 推奨のモノを選んでおいた
- デフォルトの SSL/TLS 証明書
- ACMから
- 作成済みの証明書を割り当て
- セキュリティポリシー: ELBSecurityPolicy-TLS13-1-2-2021-06 (推奨)
ブラウザから、取得済みのドメインでアクセスをすると、nginx が 502 を返す。
また、ただし、Blocked host: [ドメイン]
となる。
config/environments/[環境].rb
をまた編集。
再起動すると、インターネットからの通信にもRailsからエラー無く応答する。
このタイミングで、ドメインからのアクセスしか受け付けないように他のhost名登録は消しておく。
また、ロードバランサーの HTTPのリスナーを一旦削除する。
再作成。
- リスナーの詳細
- プロトコル:HTTP
- ポート:80
- デフォルトアクション
- アクションの種類
- URLにリダイレクト
- URL にリダイレクト
- プロトコル:HTTPS- ポート:443
- ステータスコード
- 301 - 完全に移動されました
- アクションの種類
HTTPでアクセスするとHTTPSにリダイレクトがかかる。
Rails をサービス化する
Rails はコンソールから実行しているので、最後にサービス化して終わる。
1 | [Unit] |
起動します。
1 | $ systemctl start puma |
プロセスを手動で kill して再起動する事も確認できる。
自動起動も設定する。
1 | $ systemctl enable nginx |
OSが再起動しても自動で再起動する事が確認できた。
AWS EC2 上の Amazon Linux 2023 で Rails を立ち上げた。
後半は、ALB 周りのセットアップの振り返りだったようにも思えるが、良かったことにする。
SELinux で困るかと思ったが、とりあえずここまでの設定で困る事はない。
どこか引っかかるポイントがありそうなので、別途確認をしておきたい。
最近 Docker でなるだけ全部もみたいな形だったが、たまには全部セットアップしてみるのもいいのやもしれない。
では。