初めての AWS で Laravel API をデプロイしてみた！ - 第 6 弾：Webレイヤ冗長化編

# 1. はじめに
私は2023年10月より、内定直結型エンジニア学習プログラム「アプレンティス」に2期生として参加しています。

https://apprentice.jp/

AWS について学んだので、Laravel API を AWS でデプロイする方法についてまとめました。
AWS に初めて触れる方の参考になれば幸いです。

### シリーズ一覧
長編になっているので、複数の記事に分けて公開しています。
本記事はその第 6 弾です。

1. [サーバー設置編](https://qiita.com/mosyaneko/items/0788e1011b792f137d5b)
2. [サーバー接続編](https://qiita.com/mosyaneko/items/55e75ee5a96920db5981)
3. [IP アドレス編](https://qiita.com/mosyaneko/items/0788e1011b792f137d5b)
4. [データベース編](https://qiita.com/mosyaneko/items/182438555c7d23e5a3e9)
5. [アプリケーション起動編](https://qiita.com/mosyaneko/items/f221be0fc56c270ee5fe)
6. Webレイヤ冗長化編 ★本記事!!
7. [SSL 化編](https://qiita.com/mosyaneko/items/d6c6b63c35f9868858be)

# 目次
[1.はじめに](#1-はじめに)
[2.パブリックサブネットの作成](#2-パブリックサブネットの作成)
[3.AMI の作成](#3-AMIの作成)
[4.ALB の作成](#4-ALBの作成)
[5.503 / 504 エラーの解消法](#5-503/504エラーの解消法)
[6.ALB へのルーティング](#6-ALBへのルーティング)

# 2. パブリックサブネットの作成
現在、以下のような状況になっています。
- パブリックサブネット( 1 つ)：EC2 インタンス設置
- プライベートサブネット( 2 つ)：1 つに RDS インスタンス設置

現状、Web サーバーを 1 つのアベイラビリティゾーンにしか設置していないので、災害等あった場合にサービスが停止してしまいます。

それを防ぐために、別のアベイラビリティゾーンにもう一つパブリックサブネットを作成し、Web サーバーを設置していきたいと思います。

詳しい作成方法は第 1 弾の記事で解説していますので、ご確認ください。

[初めての AWS で Laravel API をデプロイしてみた！ - 第 1 弾：サーバー設置編](https://qiita.com/mosyaneko/items/9b0a55e4b6338801e873#6-%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E4%BD%9C%E6%88%90)

ここでは、異なる点についてのみ挙げていきます。

- サブネット名：`conduit-practice-public-subnet-1c`
- アベイラビリティゾーン：`アジアパシフィック(東京)/ap-northeast-1c`
- IPv4 subnet CIDR block：`10.0.11.0/24`

# 3. AMIの作成
既存の EC2 インスタンスから、AMI (EC2 インスタンスを生成する際の設計図)を作成します。

EC2 ダッシュボードに移動します。

作成済みのインスタンスを選択し、アクション＞イメージとテンプレート＞イメージの作成をクリックします。
![スクリーンショット 2024-02-15 21.04.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/914bc217-c68b-2c47-d7f7-99e246a71510.png)

任意の名前を付け、あとはデフォルトのままで「イメージを作成」をクリックします。
![スクリーンショット 2024-02-15 21.07.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/75d2df17-cd3f-1407-febf-a24ce144cb5d.png)

EC2 ダッシュボードの左メニュー「AMI」に、作成した AMI が表示されます。
![スクリーンショット 2024-02-15 21.09.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/9314e995-63f9-91f0-bb67-d36c686f96e4.png)

「ステータス」が「利用可能」になったら、「AMI からインスタンスを起動」をクリックして、インスタンスを作成します。
![スクリーンショット 2024-02-15 21.12.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/8592cfa2-c4d1-abef-9b27-e79459809a1a.png)

任意の名前を入力します。ここでは、最初に作成した EC2 インスタンスと同じ名前にしています。
マシンイメージでは、先程作成した AMI が表示されています。
![スクリーンショット 2024-02-15 21.14.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/097650ae-07e3-acd1-de66-27ca5cc04d42.png)

「インスタンスタイプ」は以前作成したインスタンスと同じ 「t2.micro」のままで大丈夫です。
「キーペア」は、以前作成したものを選択しました。
![スクリーンショット 2024-02-15 21.16.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/79e90e95-2b15-b4cf-746e-699d3aa9ce86.png)

「ネットワーク設定」は、右上の「編集」ボタンをクリックすると編集できます。
VPC は作成したものを、サブネットは先程作成したパブリックサブネットの 1c を選択します。
インターネット接続するので、「パブリック IP の自動割り当て」を「有効化」します。

セキュリティグループは、既存の web-sg 設定します。
![スクリーンショット 2024-02-15 21.22.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/53a014e1-484c-ff9b-ef48-1cefec768a8a.png)

「高度なネットワーク設定」は、「プライマリ IP」だけ`10.0.11.10`入力します。
その他はデフォルトのままにしました。
![スクリーンショット 2024-02-15 21.28.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/a092263e-7d76-291d-3757-216003af937d.png)


問題がなければ、「インスタンスを起動」をクリックします。
![スクリーンショット 2024-02-15 21.26.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/5d381fab-99d2-3730-4626-c3946650cdfb.png)

元のインスタンスと合わせて、２ つのアベイラビリティゾーンにインスタンスが配置されたことが確認できます。
![スクリーンショット 2024-02-15 21.31.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/49c230f4-ddf9-518e-2d9d-1845f00473c4.png)

# 4. ALBの作成
次に、２つの EC2 インスタンスにアクセスを振り分けるために **ALB** を作成します。

## ELB(Elastic Load Blancing)とは
**ロードバランサー**とは、各サーバーにアクセスを振り分け、負荷を分散する装置のことをいいます。
**ELB**は、AWS クラウド上のロードバランサーです。
ロードバランサーにはタイプが数種類あり、今回はその中の **ALB** (Application Load Balancer)を作成します。

## ロードバランサー作成
EC2 ダッシュボードのメニューから「ロードバランサー」をクリックし、「ロードバランサーの作成」に進みます。
![スクリーンショット 2024-02-10 0.58.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/10da640c-29e2-3569-77a2-cbdcd19905d5.png)

ロードバランサータイプは「Application Load Balancer」を選択します。
![スクリーンショット 2024-02-10 0.59.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/880849ab-369f-7866-dccd-cf1f640a45a3.png)
Web サービスを作る時はこちらを利用するようです。

任意の名前を入力します。
今回はインターネット向けです。
![スクリーンショット 2024-02-15 21.47.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/e7ed0ebe-d26d-83f0-81f0-53e9bf6c00e3.png)

次に、VPC とサブネットを選択します。
サブネットは 1a と 1c それぞれパブリックサブネットを選択します。
![スクリーンショット 2024-02-15 21.48.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/f3c5b242-a9f3-d14f-4d0d-5c5ba8f68abe.png)

セキュリティグループは今回新しいものを作成します。
「新しいセキュリティグループを作成」をクリックし、別タブで開かれるページで作成していきます。
![スクリーンショット 2024-02-15 21.50.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/10db66b6-19c5-0f92-30a1-805c05d6c783.png)

ALB 用のセキュリティグループだということが分かるように名前を入力します。
VPC は作成したものを選択します。
インバウンドルールに、`HTTP` の `0.0.0.0/0` を追加します。
![スクリーンショット 2024-02-15 21.52.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/0fd59699-02d7-649d-a557-1c2ea70ef525.png)
あとはそのままで、「セキュリティグループを作成」をクリックします。

ロードバランサー作成の画面に戻り、更新ボタンをクリックすると、作成したセキュリティグループが表示されるので、それを選択します。
「リスナーとルーティング」のHTTPの「デフォルトアクション」は、新しいターゲットグループを作成したいので、「ターゲットグループを作成」をクリックします。
![スクリーンショット 2024-02-15 21.56.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/94fb28d0-827d-b28b-dddc-874f611c1378.png)

インスタンスを選択し、任意の名前を入力します。

![スクリーンショット 2024-02-15 21.58.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/957ab8ad-f3d7-15ee-688a-c915fe6df981.png)

この辺はデフォルトのままです。
![スクリーンショット 2024-02-15 22.00.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/f9f05771-6264-be06-92e6-b1744f8b373e.png)
![スクリーンショット 2024-02-15 22.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/602d6b5e-699f-0e20-55d2-80281181845f.png)

ヘルスチェックの詳細設定を編集します。
検証のために、下記のように短い値にしておきました。
![スクリーンショット 2024-02-15 22.01.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/722b9874-2443-0eaa-36d1-554e186f9355.png)
「次へ」をクリック。

２つのインスタンスにチェックを入れて、「ターゲットグループの作成」をクリック。
![スクリーンショット 2024-02-15 22.05.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/34f9ccd8-11dd-89cb-72ee-e807d1648049.png)

ロードバランサー作成画面に戻り、更新ボタンをクリックして、作成したターゲットグループを選択します。
![スクリーンショット 2024-02-15 22.07.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/76b16a86-f6f7-c2b1-d44a-ed3e74b79802.png)

問題がなければ「ロードバランサーの作成」をクリックします。
![スクリーンショット 2024-02-15 22.08.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/ab6bf500-a844-b499-46be-18beeca6d604.png)

ALB が作成できました。
![スクリーンショット 2024-02-15 22.13.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/67c6398d-0f30-5882-09e9-1c5e63f71ce2.png)
この右下の DNS 名をコピーします。
これをブラウザでリクエストすることで、ページが表示されるようになっているはずです。

# 5. 503/504エラーの解消法
DNS 名でアクセスできるようになったはずなのですが、下のようなエラーが表示される場合があるようです。
私も表示されました。
![スクリーンショット 2024-02-15 22.21.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/e648fa8a-daaa-5cd8-cb4a-624182138226.png)

このエラーの解消するために、EC2ダッシュボードにアクセスし、「ターゲットグループ」から作成したターゲットグループを選択します。

作成したターゲットグループにチェックを入れて、「ターゲット」タブの右上にある「ターゲットを登録」をクリックします。
![スクリーンショット 2024-02-15 22.24.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/05bd9b6e-3ede-68f2-2367-6fd959d6a24c.png)

２つのインスタンスにチェックを入れて、画像下の「保留中として以下を含める」をクリックします。
![スクリーンショット 2024-02-15 22.26.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/b630e1aa-1ebd-5578-6464-12f8be32220a.png)
![スクリーンショット 2024-02-15 22.26.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/8e49ff81-419b-017c-df55-7c72eecbdf33.png)
これで「保留中のターゲットの登録」をクリックします。

改めて、ALB の DNS 名でアクセスできるか確認します。
![スクリーンショット 2024-02-15 22.28.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/d70f3d46-bffa-86d3-ff60-0f4b7835561c.png)
表示されました！

# 6. ALBへのルーティング
現状では、IP アドレスへのアクセスは先程の ALB にルーティングされるのですが、独自ドメインでアクセスしたときには、直接 EC2 インスタンスにルーティングされてしまいます。
なぜなら、以前 Route 53 のホストゾーンの設定で、ドメインにアクセスがあった場合に、アベイラビリティゾーン 1a の方の　EC2 インスタンスのパブリック IP にルーティングするように設定したからです。

ここで、独自ドメインへのアクセスも ALB にルーティングされるように設定します。

Route 53 のダッシュボードに移動し、「ホストゾーン」から、作成した独自ドメインのホストゾーンをクリックします。
詳細画面で、A レコードを選択し、「レコードを編集」から変更します。
![スクリーンショット 2024-02-15 22.37.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/1cfe2993-a3f1-ab9e-c698-e5db636914f1.png)

「エイリアス」にを ON にして、「トラフィックのルーティング先」に「Application Load Balancer と Classic Load Balancer へのエイリアス」、「アジアパシフィック(東京)」、作成した ALB を選択します。
![スクリーンショット 2024-02-15 22.43.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/5df40ea1-c91b-8d86-d3c1-501853862869.png)
「保存」をクリック。

これで、ドメイン名でも ABL にアクセスできるようになりました！
ALB 経由で、1a、1c どちらかの EC2 インスタンスに接続するようになります。

本記事はここまでです。
次の記事はこちら↓
[初めての AWS で Laravel API をデプロイしてみた！ - 第 7 弾：SSL 化編](https://qiita.com/mosyaneko/items/d6c6b63c35f9868858be)