AWS Apache の Virtual Hostを検証してみた

# はじめに
Virtual Hostの知識を深めるためにAWSにてALB ACMのApacheの検証をしてみました。
よくRoute53経由でALBにアクセスするケースはセキュリティグループの設定不足や
サブネットの設定により、アクセス出来ないことがよくあります。

**ドメインについては例で「example.com」で記載させていただいております。**

本記事はセキュリティグループルールやサブネットについて特に詳細に記載しようと思います。

以下のサイトを参考に構築しました。
https://qiita.com/sugimount-a/items/7e5ebd390cb59c3e55da

### 前提条件
例 「example.com」のドメインをお名前.com等で発行済みであり、
　Route53のレコードに登録済みであること
ドメインを発行していない場合は使用することは出来ません。


# 検証手順
### 1 EC2を作成する
EC2はパブリックサブネット上で作成しました。パブリックアドレスは有効にして付与しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/2ba534e5-91d2-3b5e-dff6-4311fa8b1eb3.png)

#### EC2のセキュリティグループについて

自分のIPアドレスの22ポートを許可しないとEC2にSSH接続出来ません。
自分のIPアドレスの80ポートを許可してhttp://EC2のパブリックIPアドレスでアクセス出来る様にする。

**以下はルール許可はよく設定を忘れるため、記載しました。**
赤枠のルールについては、ALB作成後追加いたしました。
追加した理由としては、今回ALBでSSLを終端してALBからEC2への通信は80ポートで行うため、ALBのセキュリティグループを80ポートでEC2のセキュリティグループのインバウンドルールで許可する必要がある。許可しない場合はALBからEC2へアクセス出来ません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/cce6d112-44c1-3d6d-0132-e8e4b517408e.png)

### 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と表示される設定にしております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/63009974-e07a-28f5-3b55-ecbe7bf8cabf.png)


### 3 ACMをリクエストして証明書を発行する。
パブリック証明書をリクエストの手順を参照ください

ACM >> 証明書を一覧 >> リクエストを選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/7024410d-6e12-f607-0bba-f7433afc67dc.png)

以下の設定内容を入力してACM証明書を発行してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/4e0c97d2-2535-d9b2-3b67-939e1e32976e.png)

2つのドメイン名でACM証明書を発行しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/feac0c90-90cf-b061-d879-c30ab25900ff.png)


### 4 Target Groupを作成する
ターゲットグループは以下の設定で作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/bcc8c18e-7478-1dda-9448-ea2a4f50492a.png)

ヘルスチェックの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/acae3555-32a1-479b-52c6-9b5f80162ece.png)

### 5 ALBを作成しました
ALBを自席PCからアクセスする場合はインターネットを経由する場合は、
ALBのサブネットを必ずパブリックサブネットにしてください

ALBをプライベートサブネットを選択したら自席PCからALBにアクセス出来ません。
仮にターゲットグループのEC2がプライベートサブネットに配置されていても、ALBは
自席PCからアクセスする場合はALBのサブネットはパブリックサブネットにしてください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/0d89c77f-7b1a-ddef-2761-a05c346fe9ad.png)

リスナーは443を指定して、先程作成したtest-tgのターゲットグループを指定する。
ACMは先程発行した証明書「test1.example.com」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/9cb2df18-56eb-f405-c9f9-c6bd3435f866.png)

リスナールールのSNIにてtest2.example.comの証明書を追加する。

test1.example.comの証明書についてはリスナー設定時にSNIに自動登録されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/57a63376-9bdb-ae83-41d6-815b991a8a49.png)


ロードバランサーのセキュリティグループについては、Route53からALBへアクセスする場合はデフォルトルート0.0.0.0/0を許可する必要があります。
※理由はRoute53はグローバルサービスでRoute53のIPアドレスが不明なため、0.0.0.0/0ですべてのIPアドレスを許可します。

※Route53経由せずに直接ALBに自席PCからアクセスする場合は、自席PCのIPアドレスに対して443ポートを許可してあげればよいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/e4b18e23-ddef-6605-7a1b-3c02d2346b4d.png)

### ターゲットグループのヘルスチェックを確認した

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」であることを確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/89c02a29-d433-0ac5-dc7b-93f805a62321.png)


# Route 53のAレコードを追加する。
ロードバランサーをエイリアスで指定して作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/7cdac043-9430-6a42-893f-d8c862bdb6b4.png)



## 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
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/cfe3c84c-cc48-409c-96c8-1f11262b3132.png)
```
https://test1.example.com
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/8f3bb786-bb84-b696-89a9-c995b0edf307.png)