はじめに
Virtual Hostの知識を深めるためにAWSにてALB ACMのApacheの検証をしてみました。
よくRoute53経由でALBにアクセスするケースはセキュリティグループの設定不足や
サブネットの設定により、アクセス出来ないことがよくあります。
ドメインについては例で「example.com」で記載させていただいております。
本記事はセキュリティグループルールやサブネットについて特に詳細に記載しようと思います。
以下のサイトを参考に構築しました。
https://qiita.com/sugimount-a/items/7e5ebd390cb59c3e55da
前提条件
例 「example.com」のドメインをお名前.com等で発行済みであり、
Route53のレコードに登録済みであること
ドメインを発行していない場合は使用することは出来ません。
検証手順
1 EC2を作成する
EC2はパブリックサブネット上で作成しました。パブリックアドレスは有効にして付与しました。
EC2のセキュリティグループについて
自分のIPアドレスの22ポートを許可しないとEC2にSSH接続出来ません。
自分のIPアドレスの80ポートを許可してhttp://EC2のパブリックIPアドレスでアクセス出来る様にする。
以下はルール許可はよく設定を忘れるため、記載しました。
赤枠のルールについては、ALB作成後追加いたしました。
追加した理由としては、今回ALBでSSLを終端してALBからEC2への通信は80ポートで行うため、ALBのセキュリティグループを80ポートでEC2のセキュリティグループのインバウンドルールで許可する必要がある。許可しない場合はALBからEC2へアクセス出来ません。
2 EC2にSSH接続してコマンドを実行する
httpdのパッケージをインストールする。
# sudo su -
# dnf install httpd
httpdサービスを起動した後、httpdサービスがEC2再起動時に自動起動する設定にする。
# systemctl start httpd
# systemctl enable httpd
タイムゾーンを日本時間に変更しました。
rm -f /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ブラウザでEC2のパブリックIPアドレスで接続しました。
※以下の例はtest1と表示される設定にしております。
3 ACMをリクエストして証明書を発行する。
パブリック証明書をリクエストの手順を参照ください
ACM >> 証明書を一覧 >> リクエストを選択する
4 Target Groupを作成する
ターゲットグループは以下の設定で作成しました。
5 ALBを作成しました
ALBを自席PCからアクセスする場合はインターネットを経由する場合は、
ALBのサブネットを必ずパブリックサブネットにしてください
ALBをプライベートサブネットを選択したら自席PCからALBにアクセス出来ません。
仮にターゲットグループのEC2がプライベートサブネットに配置されていても、ALBは
自席PCからアクセスする場合はALBのサブネットはパブリックサブネットにしてください。
リスナーは443を指定して、先程作成したtest-tgのターゲットグループを指定する。
ACMは先程発行した証明書「test1.example.com」を選択する。
リスナールールのSNIにてtest2.example.comの証明書を追加する。
test1.example.comの証明書についてはリスナー設定時にSNIに自動登録されます。
ロードバランサーのセキュリティグループについては、Route53からALBへアクセスする場合はデフォルトルート0.0.0.0/0を許可する必要があります。
※理由はRoute53はグローバルサービスでRoute53のIPアドレスが不明なため、0.0.0.0/0ですべてのIPアドレスを許可します。
※Route53経由せずに直接ALBに自席PCからアクセスする場合は、自席PCのIPアドレスに対して443ポートを許可してあげればよいです。
ターゲットグループのヘルスチェックを確認した
ALBのヘルスチェックがEC2に届いていることを確認した。
仮に以下のアクセスログにてALBのヘルスチェックのログが出力されていない場合は、
EC2のセキュリティグループの設定でALBを許可していない可能性があります。
tail -n 4 /var/log/httpd/access_log
10.0.107.4 - - [16/Dec/2023:01:55:32 +0000] "GET / HTTP/1.1" 200 43 "-" "ELB-HealthChecker/2.0"
10.0.15.159 - - [16/Dec/2023:01:55:36 +0000] "GET / HTTP/1.1" 200 43 "-" "ELB-HealthChecker/2.0"
10.0.107.4 - - [16/Dec/2023:01:56:02 +0000] "GET / HTTP/1.1" 200 43 "-" "ELB-HealthChecker/2.0"
10.0.15.159 - - [16/Dec/2023:01:56:06 +0000] "GET / HTTP/1.1" 200 43 "-" "ELB-HealthChecker/2.0"
10.0.107.4 - - [16/Dec/2023:01:56:32 +0000] "GET / HTTP/1.1" 200 43 "-" "ELB-HealthChecker/2.0"
ヘルススタータス「healthy」であることを確認しました。
Route 53のAレコードを追加する。
Virtual Host の指定
Virtual Hostを新規に作成する。
[root@ip-10-0-4-249 httpd]# cat /etc/httpd/conf.d/virtualhost.conf
<VirtualHost *:80>
ServerName test1.example.com
DocumentRoot /var/www/test1
<Directory /var/www/test1>
Options -Indexes
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName test2.example.com
DocumentRoot /var/www/test2
<Directory /var/www/test2>
Options -Indexes
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
フォルダを作成した
mkdir /var/www/test1
mkdir /var/www/test2
サンプルのindex.htmlを作成する。
vi /var/www/test1/index.html
<html><body><h1>test1!!</h1></body></html>
vi /var/www/test2/index.html
<html><body><h1>test2!!</h1></body></html>
httpdの文法チェックをする
httpd -t
OK
httpdのサービスを再起動する
systemctl restart httpd
動作確認
https://test2.example.com
https://test1.example.com