１つのALBでWebサーバとAPIサーバをドメインで出し分ける

# やりたいこと
- 図のようにWebサーバとAPIサーバを１つのALBで出し分けてほしい
- 各サーバは負荷分散を行う可能性もあるため複数台登録にも対応してほしい
- IPは固定していないので，IPが変化しても大丈夫なようにする

![Untitled Diagram (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/6908e8f8-6758-b1e5-8f41-9dfba17011b2.png)

# 今回やること
- Route 53でWebサーバとAPIサーバ用のドメインを用意する
- ALBでドメインによってWebサーバ及びAPIサーバのターゲットグループを切り替えるように設定
- 今回は便宜上，Webサーバ用のドメインを**hoge.com**，APIサーバ用のサブドメインを**api.hoge.com**として説明します

![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/53e3a6c7-0399-96b3-c0b7-9a8604473cee.png)

# 前提条件
- Webサーバ及びAPIサーバのEC2がある
- ALB及びRoute 53でドメインが用意されていることとします

→ ドメインの登録方法は[こちら](https://qiita.com/NaokiIshimura/items/89e104dd2d8dd950780e)を参考にしましょう

# ロードバランサーの設定
まずは，ALBの作成を行います．
AWSのコンソールから**EC2**を選択し，
**ロードバランサー** -> **ロードバランサーの作成**を押します

![0-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/7d42f8a8-b077-b37f-5e0c-af1d1e98e05e.png)

今回はロードバランサーとして**ALB**を選択
![0-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/6e547835-db7f-ec70-cacf-81674b56bcef.png)

名前：**hoge-alb**
VPC：**作成したパブリックサブネットを選択**
アベイラビリティーゾーン：**今回はaとcのパブリックサブネットを選択**
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/3f1d622a-d66c-106c-ddbd-fb53fe3bff7e.png)

## セキュリティーグループの設定
セキュリティグループの割当：**新しいセキュリティグループを作成する**を選択
セキュリティグループ名：**hoge-sg**
説明：**hoge-sg**
※名前は適切なものを書きましょう

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/5b5d5d0d-0895-3c7f-a9de-fcc5236dec25.png)

## ルーティンググループの設定
ターゲットグループ：**新しいターゲットグループ**を選択
名前：**hoge-web-tg**
※ 適切な名前を書きましょう

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/7b2ec042-ec4b-20c2-1dfa-19b52c15a9b4.png)

## Webサーバのターゲットグループの設定
ターゲットの登録を行います

**Webサーバを選択** -> **登録済みに追加**

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/6ee87988-ba62-a2e0-bb2b-310fdc3c6fd1.png)

最後に**確認**を押してALBの作成及びWebサーバへのターゲットグループを作成します．

## APIサーバのターゲットグループ作成
次に，APIサーバのターゲットグループを作成します．

EC2のコンソールから，
**ターゲットグループ** -> **ターゲットグループの作成**を選択

名前：**hoge-api-tg**
※ 適切な名前を書きましょう

**作成**を押してターゲットグループを作ります

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/4d7c065e-c4ae-41f6-a795-efaad0db684a.png)


## APIサーバのターゲットグループの設定
作成したターゲットグループを選択してAPIサーバを登録します．

**hoge-api-tg**を選択 -> **ターゲット** -> **編集**

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/b91bda8d-68a1-17d3-732b-74c4e4f4dab9.png)


**APIサーバを選択** -> **登録済みに追加** -> **保存**
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/67e52c25-49e3-2b33-b77b-b5b5dbf52210.png)

# Route 53の設定
## ドメインとALBを紐付ける
すでにドメインhoge.comがある状態でALBと紐付けます

コンソールから**Route 53**を選択 -> 作成したドメインを選択 -> **レコードセットの作成**
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/2c60c968-cbc3-81fe-6ee9-6156b2f60875.png)

エイリアスで**はい**を選択 -> 作成したALB(**hoge-alb**)を選択

最後に**作成**を押しましょう
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/a0916f23-c2fa-446a-ca25-98c0e46ae903.png)

## APIサーバのサブドメイン作成
API用のサブドメインを作成してALBと紐付けます

名前：**api**
エイリアス：**はい**
エイリアス先：作成したALB(**hoge-alb**)を項目の中から選択します

最後に**作成**を押してサブドメインを作ります
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/63c78c72-ba33-2cb8-ead1-cffe84eaf002.png)

# ルーティングの設定
## APIサーバのルーティングをALBに設定
EC2のコンソールから
**ロードバランサー** -> 作成した**hoge-alb**を選択 -> **ルールの表現/編集**
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/1d6a623e-a786-3cf6-126e-8d8a5e99a235.png)


**プラスボタン**を選択 -> **ルールの挿入**
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/daa57ffc-9d6d-d728-f926-348178b7565e.png)

**条件の追加** -> **ホストヘッダー**
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/afaf0add-9856-bc5a-82fa-92614b98e858.png)

Route 53で作成したAPI用のサブドメインを入力します
ホストヘッダー：**api.hoge.com**

次に，入力したホストヘッダーからの通信があった場合の転送先を設定します
**アクションの追加** -> **転送先**
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/49948834-f94b-b4f9-aee8-6c74a0c8f6be.png)

**hoge-api-tg**を選択 -> **保存**
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/fbbbeac2-2264-3869-5835-28ef21fbe919.png)

最終的にはこのようになっています
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/2f076a46-17f1-90f1-0bd2-2da2a642a8e4.png)

# 結果
**hoge.com**でwebページが表示され，**api.hoge.com**でAPIサーバと通信することが出来ました

![19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/6c10516e-5581-206b-38dd-876e77ee1f9e.png)