AWS ALB パスベースルーティングを実装してみました。(EC2 + ALB + Apache)

#はじめに
こんんちは、山田です。
今回は、Appliation Load Balancerを用いて、URLのパスごとに接続先のポート番号を変更する方法について記載していきます。

#全体構成図
今回使用するAWSリソースは以下の通りです。

|AWSリソース名  |個数  |備考  |
|---|---|---|
|VPC|1|-|
|Subnet|4|PublicSubnet 2つ<br>PrivateSubnet 2つ|
|EC2  |3  |EC2-①(Windows)<br>EC2-②(RHEL)<br>EC2-③(RHRL)|
|InternetGateWay|1 |-|    
|ALB | 1 |-  |
|Route53|1|PrivateHostZone 1つ|

以下に全体構成図を記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/300ff73b-3b42-ad74-1966-ed8a06f7dbfa.png)

ALBに関しては、接続元URLごとに、接続先のポート番号が変わるように設定します。今回はホスト名は「yamada.test.local」で同一とし、パスごとにルーティングをするように設定します。また、Webサーバソフトウェアとして、「Apache」を使用します。

|URL|ポート番号|
|---|---|
|http://yamada.test.local/hoge1|80|
|http://yamada.test.local/hoge2|81|
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/d75c94e8-c55b-48b6-0d71-fb97679034b8.png)
① UserはInternetGateWayを介して、EC2にSSH接続する。
② EC2ログイン後、ALBに接続する。その際、Route53のプライベートホストゾーンを用いて、名前解決をする。
③ ALBはトラフィックを、EC2-②、EC2-③に振り分ける。

#構築手順
以下より実際の構築手順に関して、記載していきます。

##前提条件
VPC、Subnet、EC2、InternetGateWay(IGW)は構築済みとします。

##Apacheの設定
① EC2-①に、リモートデスクトップ接続します。
② 「TeraTerm」を用いて、EC2-②にSSH接続します。
③ Apacheをインストールします

```
yum -y install httpd
```

④ Listenするポート番号を追加します。

```
cd /etc/httpd/conf
vi httpd.conf
---------------------------
Listen 80
Listen 81　#81を追加
---------------------------
```
⑤ バーチャルホストの設定をします。

```
cd /etc/httpd/conf.d
vi vhost.conf　#バーチャルホスト設定ファイル作成
----------------------------------------------------------------------
<VirtualHost *:80>
    DocumentRoot /test　#今回はドキュメントルートとして「/test」を設定
    ServerName localhost
</VirtualHost>

<VirtualHost *:81>
    DocumentRoot /test
    ServerName localhost
</VirtualHost>
----------------------------------------------------------------------
```

⑥ ディレクトリ,ファイルを作成します。

```
cd /
mkdir test
cd /test
mkdir hoge1
cd hoge1
vi index.html
----------------------------------------
<html>

<head>
<title>EC2-2</title>
</head>

<body>
hoge1
</body>

</html>
------------------------------------------

mkdir hoge2
cd hoge2
vi index.html
----------------------------------------
<html>

<head>
<title>EC2-2</title>
</head>

<body>
hoge2
</body>

</html>
------------------------------------------
```


⑦ Apache起動,自動起動の設定をします。

```
systemctl start httpd　#Apache起動
systemctl enable httpd　#Apache自動起動設定
systemctl status httpd　#runningになっていることを確認
```

⑧ EC2-③にログインし、③～⑦の設定を同様に行います。

##ApplicationLoadBalancer(ALB)作成
① AWS管理コンソール画面->EC2->ロードバランサー->ロードバランサーの作成をクリックします。
② 以下のような画面が表示されるので、ALBを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/15dd9478-6f5c-7bd4-2c25-38f39678d572.png)
③ 以下に設定項目を記載します。

|設定項目|設定値|備考|
|---|---|---|
|name|test-alb|-|
|Scheme|Internal|今回は内部向けなのでInternalを選択|
|IP address type|IPv4|-|
|VPC|検証用VPC<br>(作成したVPC選択)|-|
|Mapping|PrivateSubnet-1a、PrivateSubnet-1c<br>(作成したPrivateSubnetを選択)|今回は内部向けなのでPrivateSubnetを指定|
|SecurityGroup|SecurityGroup<br>(作成したSecurityGroupを選択)|-|
|Listener|後ほど変更|-|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/1dbd7acc-f9d6-ee73-250c-33cf26248141.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/181a7f91-9bf8-3e72-221a-cb8de04796a0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/2f97b933-e63b-3cb7-b53f-b045c010a819.png)

④ ターゲットグループを作成します。

|設定項目|設定値|備考|
|---|---|---|
|target type|Instances|-|
|target group name|targetgroup-01<br>targetgroup-02|ポート番号80,81番用に2つ作成|
|Protocol Port|HTTP 80 (targetgroup-01)<br>HTTP 81 (targetgroup-02)|-|
|Protocol version|HTTP1|-|
|Health check protocol|HTTP|-|
|Health check path|/hoge1/index.html (targetgroup-01)<br>/hoge2/index.html (targetgroup-02)|-|
|Target Instance|EC2-②<br>EC2-③|-|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/b236b80f-6a45-f87e-365e-b8eccc2f8977.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/4ff8bf08-628e-945e-0978-084b57f92605.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/659146f7-8686-26dd-8f93-9ded1ec10cb3.png)
④ リスナー設定変更
  リスナー->リスナー追加をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/314204eb-5e57-9c21-3a3b-ea2e6ae2d918.png)
　以下に設定項目を記載します。

|ホスト|パス|転送先|
|---|---|---|
|yamada.test.local|/hoge1 または /hoge1/*|targetgroup-1|
|yamada.test.local|/hoge2 または /hoge2/*|targetgroup-2|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/7f652724-266c-ba20-c604-090c7133925f.png)

##Route53、プライベートホストゾーン設定
① AWS管理コンソール->Route53->ホストゾーン->ホストゾーンの作成をクリックします。
  ドメイン名「test.local」、ホストゾーンタイプは「プライベートホストゾーン」で作成します。

|ホストゾーン種類|ドメイン名|
|---|---|
|プライベートホストゾーン|test.local|

② レコードを作成します。

|設定項目|設定値|
|---|---|
|レコード名|yamada.test.local|
|レコードタイプ|A|
|トラフィックルーティング先|internal-test-alb-1273242164.ap-northeast-1.elb.amazonaws.com<br>(ALBのDNS名)|
|ルーティングポリシー|シンプルルーティング|


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/d5b6faac-ce87-2182-aff5-987bcf7bd6c5.png)

##動作確認
① 「http://<span>yamada.test.local</span>/hoge1/」、「http://<span>yamada.test.local</span>/hoge2」にそれぞれアクセスし、「hoge1」「hoge2」の文字列がそれぞれ表示されることを確認できれば、完了です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/7cf77207-0e83-2755-a8a3-f71dd1c39dda.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/94ed5bd4-4010-84f7-eb87-56ca0639867a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/11a3e21f-cfcb-d41b-845d-be026a447029.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/b94b7604-57bc-16e5-7a9e-5fb59f10e001.png)