ALB と ACM で Apache の Virtual Host 構成をためしてみた

# はじめに

Apache HTTP Server は、Virtual Host 機能があり、1 台の仮想サーバーで複数のサイトを提供できます。同じ仮想サーバーリソースを共有するため、コスト効率がよいメリットがあります。一方、セキュリティやパフォーマンス面で共有することになるため、デメリットの面も検討が必要です。

AWS 上に、AWS Certificate Manager (ACM) サービスがありパブリック証明書を無料で発行できます。Virtual Host 機能と、ACM を併用するときの設定方法や、サイトの上限が気になったので検証をしてみます。



# 構成図

以下の構成を作成します。

![image-20230603174737126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3796bfb9-91c7-86b7-e385-00578d5a80fd.png)



次のポイントがあります。

- EC2
  - Amazon Linux 2023 上で、Apache HTTP Server をインストール
  - Virtual Host の設定をして、2 つのサイトを提供する
- ACM
  - 2 つのサイトのドメインでパブリック証明書を提供できるようにして、ALB に紐づける



# 注意するべきService Quota

この構成での注意するべき Service Quota を紹介します。

- Application Load Balancer あたりの証明書 (デフォルト証明書を除く) : 25

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-limits.html



ALB で SSL 終端を行う際に、ALB に証明書を紐づけます。デフォルトでは、1 ALB あたりの証明書の数が 25 となっています。ドメイン名にアスタリスクを指定することで節約できる部分もありますが、1 個の EC2 の中で提供できるサイトの上限に関わるため注意しておきましょう。なお、上限緩和申請は可能となっています。



それでは設定をしていきます。

# EC2

Amazon Linux 2023 で構築をしていきます。比較的新しい OS なので、Repository の一覧の確認など、ちょっと回り道をしながら構築をします。Repository の一覧です。`amazonlinux` というリポジトリで、Apache HTTP Server が提供されています。

```
$ sudo dnf repolist
repo id                                         repo name
amazonlinux                                     Amazon Linux 2023 repository
kernel-livepatch                                Amazon Linux 2023 Kernel Livepatch repository
```



Apache HTTP Server を Install します。

```
sudo dnf install httpd
```



依存関係の実行例

```
$ sudo dnf install httpd
Last metadata expiration check: 1:43:22 ago on Fri Jun  2 12:19:06 2023.
Dependencies resolved.
============================================================================================================================
 Package                          Architecture        Version                                Repository                Size
============================================================================================================================
Installing:
 httpd                            x86_64              2.4.56-1.amzn2023                      amazonlinux               48 k
Installing dependencies:
 apr                              x86_64              1.7.2-2.amzn2023.0.2                   amazonlinux              129 k
 apr-util                         x86_64              1.6.3-1.amzn2023.0.1                   amazonlinux               98 k
 generic-logos-httpd              noarch              18.0.0-12.amzn2023.0.3                 amazonlinux               19 k
 httpd-core                       x86_64              2.4.56-1.amzn2023                      amazonlinux              1.4 M
 httpd-filesystem                 noarch              2.4.56-1.amzn2023                      amazonlinux               15 k
 httpd-tools                      x86_64              2.4.56-1.amzn2023                      amazonlinux               82 k
 libbrotli                        x86_64              1.0.9-4.amzn2023.0.2                   amazonlinux              315 k
 mailcap                          noarch              2.1.49-3.amzn2023.0.3                  amazonlinux               33 k
Installing weak dependencies:
 apr-util-openssl                 x86_64              1.6.3-1.amzn2023.0.1                   amazonlinux               17 k
 mod_http2                        x86_64              2.0.11-2.amzn2023                      amazonlinux              150 k
 mod_lua                          x86_64              2.4.56-1.amzn2023                      amazonlinux               62 k

Transaction Summary
============================================================================================================================
Install  12 Packages

Total download size: 2.3 M
Installed size: 6.9 M
```



Apache を起動します。

```
sudo systemctl start httpd
sudo systemctl enable httpd
```



ブラウザでアクセスすると It works! と表示されました。

![image-20230602230523743.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9d529a16-d4f0-789f-f824-9714cc233026.png)



It works を表示させている設定は、このあたりです。

```
$ cat /etc/httpd/conf.d/welcome.conf
#
# This configuration file enables the default "Welcome" page if there
# is no default index page present for the root URL.  To disable the
# Welcome page, comment out all the lines below.
#
# NOTE: if this file is removed, it will be restored on upgrades.
#
<LocationMatch "^/+$">
    Options -Indexes
    ErrorDocument 403 /.noindex.html
</LocationMatch>

<Directory /usr/share/httpd/noindex>
    AllowOverride None
    Require all granted
</Directory>

Alias /.noindex.html /usr/share/httpd/noindex/index.html
Alias /poweredby.png /usr/share/httpd/icons/apache_pb3.png
Alias /system_noindex_logo.png /usr/share/httpd/icons/system_noindex_logo.png
```



実際のファイルです、

```
$ cat /usr/share/httpd/noindex/index.html
<html><body><h1>It works!</h1></body></html>
```



動作確認のため、デフォルト表示ファイルをちょっと変更してみましょう。

```
cat <<'EOF' > /var/www/html/index.html
<html><body><h1>It works!!</h1></body></html>
EOF
```



ビックリマークが 2 つ表示されるようになりました。

![image-20230603002508595.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fa7e6f7c-c499-0e40-7ae8-418b39d4d44b.png)



# ACM

ACM の設定でパブリック証明書を発行していきます。

以下 2 つのドメインを取得対象にします。自分が持っているテスト用のドメインで、本番では使っていないものです。

- virtual1.tempdomin.xyz
- virtual2.sugiaws.tokyo

![image-20230602232416990.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ec1df962-5e81-0ad4-2c17-8eb2ac2e9c3a.png)



FQDN を指定します : `virtual1.tempdomin.xyz`

![image-20230602232616251.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/bd5a5edf-83d4-d032-c094-419b33069da0.png)



Request を押します。

![image-20230602232633689.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/748453fe-9618-3020-696c-9415c01b9ef5.png)



Pending validation になりました。

![image-20230602232700164.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/61229ff9-6e13-e2cd-2372-d576f9550939.png)



DNS validation を選んでいたので、Route 53 で指定された CNAME を自動作成します。

![image-20230602232759348.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d7366a34-9153-8c44-7a11-00d637f40bba.png)



Create records を押します。

![image-20230602232809021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a6fef1f5-2f5d-bad8-c6d7-b798e59bd2ce.png)



CNAME レコードが自動的に作成されています。

![image-20230602232848316.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4576f139-73b2-0a56-07fc-24178460a243.png)



これによって、Status が Success に変わりました。

![image-20230602233008427.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c08491ac-922f-7b3c-cdf1-36d361cacaf5.png)



同じく、もうひとつのドメインでも ACM の設定をしました。

![image-20230602233420128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/6a76dd58-4212-b9d4-3527-22dd7b0aace8.png)



# Target Group

Target Group を作成しました。細かな手順は省略しますが、前の手順で設定した EC2 を対象にしています。

![image-20230602232142356.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/819cca0b-6e5f-4261-a22e-7e1728df06dd.png)



# ALB

ALB の設定に移ります。既に ALB 自体は存在していて、リスナーの設定を進めていきます。

![image-20230602233534887.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/539fb12a-1bd7-5606-9862-f407ec344475.png)



HTTPS の 443 のリスナーにします。Target Group を、Apache がインストール済みの EC2 が含まれているものを指定します。

![image-20230602233719703.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a8123d14-b015-e36d-779a-cf947c43acdd.png)



デフォルトの SSL/TLS Certificate を指定します。これはあくまでデフォルトのものとなっていて、後から追加をしていきます。

![image-20230602233745694.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/af10af38-7910-eb35-8f73-90ac502d48b6.png)



リスナーが追加されたので、クリックして設定変更をします。

![image-20230602234445919.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a36853aa-f686-793a-0176-d4eca33a1357.png)



Certificates で Add をします。

![image-20230602234552997.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7f1a992a-a900-0ddf-40cd-c1331a4791b3.png)



Virtual Host で設定するドメインの Certificate を追加しました。

![image-20230602234632640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c5a9ee07-18a1-a64b-2845-5356f5104af2.png)



追加されました。

![image-20230602234657669.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4104ace9-7f64-be71-2add-344d4ba5e922.png)



# Route 53

Route 53 上でも、対象の A レコードを設定していきます。

![image-20230602234811561.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/acdc1914-5f05-8045-7ea9-17569f6e4610.png)



ALB を指定して、Create を押します。

![image-20230602234905021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3ab22eb5-e250-5e4b-7c33-c6c70fdd3691.png)



作成されました。

![image-20230602234943670.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3ed57a84-838c-c92a-e571-ae4608e1b54a.png)



# Virtual Host の指定

Apache 上の Virtual Host の設定をしていきます。次の 2 つのドメインを指定していきます。

- https://virtual1.tempdomin.xyz/

- https://virtual2.sugiaws.tokyo/



次の conf ファイルを作成します。

- `ServerName` : Virtual Host でアクセスをさせたいドメインを指定します。
- `DocumentRoot` : それぞれのドメインごとに、専用のディレクトリを指定します。

```
cat <<'EOF' > /etc/httpd/conf.d/virtualhost.conf
<VirtualHost *:80>
    ServerName virtual1.tempdomain.xyz
    DocumentRoot /var/www/virtual1

    <Directory /var/www/virtual1>
        Options -Indexes
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerName virtual2.sugiaws.tokyo
    DocumentRoot /var/www/virtual2

    <Directory /var/www/virtual2>
        Options -Indexes
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
EOF
```



指定したディレクトリを作成します。

```
mkdir /var/www/virtual1
mkdir /var/www/virtual2
```



Virtual 1 用の HTML ファイルを作成します。

```
cat <<'EOF' > /var/www/virtual1/index.html
<html><body><h1>Virtual1!!</h1></body></html>
EOF
```



Virtual 2 用の HTML ファイルを作成します。

```
cat <<'EOF' > /var/www/virtual2/index.html
<html><body><h1>Virtual2!!</h1></body></html>
EOF
```



サービスを再起動します。

```
sudo systemctl restart httpd
```




# 動作確認

Virtual 1 へのアクセスです。想定通り、ブラウザに「Virtual1!!」と表示されました。

![image-20230603185233263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/905beacc-4f50-543c-09af-5034572be89d.png)



Virtual 2 へのアクセスです。想定通り、ブラウザに「Virtual2!!」と表示されました。

![image-20230603185242589.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/43727bde-779e-f3b2-13e4-ec19824d01fb.png)