ELBを含めてVPC + EC2でアプリを構築する。

#はじめに
本稿は『[VPC + EC2 + Docker でアプリケーションをデプロイする。](https://qiita.com/sychocola1/items/c7364238437a507f0d63)』の補足として書いています。
何か詰まるところがあれば、上記の記事をみていただけるといいかと思います。

# 対象読者

-  **ELB**(**ALB**)の構築方法を知りたい方
-  安定したサービスをデプロイしたい方
-  自分

# 全体構造
![201111 ELBの構成図-Page-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/ca2b6c6e-df7a-5fcd-38ae-1f324b822ffb.png)




# ELB
## ELBとは
ELBとは、**Elastic Load Balancing**の略称でアプリケーションのトラフィックを自動的に複数のターゲットに分散してくれる機能です。
また、トラフィックを複数の**AZ**に分散することもできるので、瞬間的な同時アクセスや何かしらの障害によって**AZ**がダウンしたとしても、他の**AZ**さえ生き残っていればサービスを継続させることができます。すごいです。
今回は、**ELB**の3つのロードバランサーの1つである、**ALB**を使用します。
違いは、[この記事](https://qiita.com/wakky_404/items/e082b7545801cf25905c)がさっくりしていてわかりやすかったです。

## ELBを含めた設計の流れ
### VPCの構築
まずは、[前回](https://qiita.com/sychocola1/items/c7364238437a507f0d63)と同様にどおり**VPC**と**サブネット**を構築していきます。

まずはAWSのトップ画面の『**サービスを検索する**』から『**VPC**』を選択。
![スクリーンショット 2020-11-08 22.32.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/1130f4d6-668d-4537-0980-e79ef49976e8.png)
『**VPCウィザードの起動**』を押下。
![スクリーンショット 2020-11-08 22.34.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/9df60d5d-9458-3739-4818-ad8293767563.png)

『**選択**』を押下。
![スクリーンショット 2020-11-08 22.49.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/9a8722e1-3714-47ff-140c-52b5ce49e12f.png)

それぞれ以下のように記入して『**VPCの作成**』を押下。
![スクリーンショット 2020-11-08 22.50.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/9c336e71-af76-b40e-59b3-f51ddec20ff9.png)

『**OK**』を押下
![スクリーンショット 2020-11-08 22.50.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/2cc30eab-bfd5-8062-64e5-91b447c7fbd0.png)

現在のサブネットの状況です。
![スクリーンショット 2020-11-11 14.04.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/482f0211-15b4-e795-30f3-226fe62c513f.png)
着目すべきは、**IPv4**と**アベイラリティゾーン**です。
先ほど作った**サブネット**は、『**ap-northeast-1a**』という**AZ**で、『**10.0.0.0/24**』の**IP**を持っています。
では、これと被らないように他の**AZ**で**パブリックサブネット**をもう１個作ります。

**VPC**のメニューの『**サブネット**』を選択。
『**サブネットの作成**』を押下。
![スクリーンショット 2020-11-11 14.12.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/56593454-de3a-82b7-f041-a3d02c7839e3.png)

以下のようにして、2つ目の**サブネット**を作成。
**IPv4**は、『**パブリックサブネット-1a**』で『**10.0.0.0/24**』を使用しているので、今回は『**10.0.1.0/24**』を使う。
![スクリーンショット 2020-11-11 14.15.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/6fbaa955-0d66-d91d-e50f-7789bde6a68c.png)

**VPCウィザード**で構築した1つ目の**サブネット**は自動で**IGW**のルーティングがされていますが、2つ目以降は自分で行わなければいけません。
なので、この**サブネット**のルートテーブルを変更します。

**VPC**メニューから『**サブネット**』を選択。
2つ目に作成した、**サブネット**を選択。
下のメニューの中から『**ルートテーブル**』を選択して、『**ルートテーブルの関連付けの意義**』を押下。
![スクリーンショット 2020-11-11 14.28.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/1547457e-bce6-0866-6f6b-ceb35884fa0e.png)

すでに選択されている**ルートテーブル**とは違う方を選択。
（この時、このVPCには2つしか**ルートテーブル**が存在しないはず）
![スクリーンショット 2020-11-11 14.36.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/873b4a36-7b0a-548f-699d-2e5a71db7390.png)
ルートの向き先に**IGW**が存在することを確認して、『**保存**』を押下。
![スクリーンショット 2020-11-11 14.36.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/1c477962-79bb-0895-b37f-c618b5fcb1de.png)

これで今回使うサブネットの作成が完了しました。

#### 現在の構成図
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/71ce37fa-1817-6eec-0072-b60f2ae218c7.png)

### EC2の作成
[前回の記事](https://qiita.com/sychocola1/items/c7364238437a507f0d63#vpc%E4%BD%9C%E6%88%90%E7%B5%90%E6%9E%9C)と変わるところはありません。
ので、1つ目の**サブネット**にデプロイするとこまではスキップします。

#### 現在の構成図
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/ed2744f1-a236-cb42-18cf-b05ad1f19c2a.png)

### ELBの構築
いよいよ**ELB**を構築していきます。
**ELB**の細かい説明に関しては、[こちら](https://qiita.com/sychocola1/items/16a1c8bd1cfe889b679c)をご覧ください。

メインメニューから『**EC2**』を選択。
![スクリーンショット 2020-11-11 15.53.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/4d1676b0-e316-4085-4238-952246b764c4.png)

**EC2**メニューから、『**ロードバランサー**』を選択。
『**ロードバランサーの作成**』を押下。
![スクリーンショット 2020-11-11 15.54.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/10d57bf1-715d-e333-2336-250f97c65553.png)

**Application Load Balancer**の『**作成**』を押下。
![スクリーンショット 2020-11-11 15.54.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/eb974987-f54b-7496-cecf-4521abeb262b.png)

以下のように**ELB**に好きな名前をつける。
**ロードバランサー**が通信を受ける外部のポート番号を入力。
自分の**VPC**を選択。
**アベイラリティゾーン**にチェックを入れ、**ELB**につなげる**サブネット**を選択する。
『**次の手順を押下**』する。
![スクリーンショット 2020-11-17 16.58.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/1e4b12e6-ee31-bed4-79bd-43a92654aebc.png)



***
ちなみに、今回の**docker-compose.yml**は

```docker-compose.yml
version: '3.7'
services:
  web:

    ~~　　省略　　~~

    ports:
      - '3000:3000'
    environment:
      PORT: 3000
      HOST: 0.0.0.0

    ~~　　省略　　~~

```
としています。
***

『**次の手順**』を押下。
![スクリーンショット 2020-11-11 15.55.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/5618fc66-9530-e18c-82b9-24d5414f7dcf.png)

『**新しいセキュリティグループを作成する**』を選択。
『**セキュリティグループ名**』に今回のセキュリティグループの名前（説明も名前と一緒でOK）を記入。
『**タイプ**』は『**カスタムTCP**』を選択。
『**ポート範囲**』は『**80**』を選択。
『**ソース**』は『**カスタム**』『**0.0.0.0. ::/0**』を選択。
『**次の手順**』を押下。
![スクリーンショット 2020-11-17 16.58.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/fa3c3511-40c1-2b53-b131-9eada944d4a6.png)


『**新しいターゲットグループ**』を選択して名前を記入。
『**ポート**』に自分が開くポート番号を記入
『**次の手順**』を押下。
![スクリーンショット 2020-11-13 16.39.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/9173f5d9-c705-5991-c137-f348e9071dab.png)



『**登録済みに追加**』を押下。
『**登録済みターゲット**』に**EC2**のインスタンスが追加されているか確認。
『**次の手順**』を押下。
![スクリーンショット 2020-11-13 16.39.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/c1aede4c-c9e3-43f5-2fd0-b8521d0c7ba3.png)

『**作成**』を押下。
![スクリーンショット 2020-11-11 16.01.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/af8b4b23-13bb-8fa8-cde9-f6a9b9a457a7.png)

以上で**ELB**の作成が完了します。

次に、作成した**ELB**を確認します。

先ほど作成した**ELB**を選択。
![スクリーンショット 2020-11-11 16.02.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/7dec7864-974e-f179-8cff-d3be192db4fc.png)

『**リスナー**』を選択。
『**転送先**』の自分で設定したターゲット名を押下。
![スクリーンショット 2020-11-13 16.39.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/f5e904e7-8411-9e17-dc64-0db0389084d1.png)


一覧の中からさきほど作成した、**ターゲットグループ**を押下。
![スクリーンショット 2020-11-13 16.39.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/269785af-26e2-8f1c-35ad-17a7914682f8.png)

下のメニューの中にある『**Target**』を押下。
インスタンスとの接続状況は**Status**で見ることができます。
最初は『**initial**』と表示されていると思いますが、インスタンスとの接続が上手くいけば『**healthy**』になります。
![スクリーンショット 2020-11-13 16.42.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/4881846a-db02-5495-ff84-77b4bb21f774.png)

これで**ELB**の作成はいったん完成です。


#### 現在の構成図
![201111 ELBの構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/d4af5450-bead-3851-4e36-0cd4dc2b48ce.png)


### AMI
現在のままでは、**ELB**としての機能がほぼ死んでます。笑
そのため、**ELB**が結びつく先のサブネットを増やしてあげます。
増やすサブネットの内容は**パブリックサブネット-1a**と同じ物なので、そのままコピーしてきます。
この時に、使用するサービスが**AMI**です。

#### AMIとは
[公式](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instances-and-amis.html)によると、
>Amazon マシンイメージ (AMI) は、ソフトウェア構成 (オペレーティングシステム、アプリケーションサーバー、アプリケーションなど) を記録したテンプレートです。AMI から、クラウドで仮想サーバーとして実行される AMI のコピーであるインスタンスを起動します。以下の図に示すように、1 つの AMI の複数のインスタンスを起動することができます。

要するに、**Docker**のインスタンス版だと考えていいと思います。

#### AMIの作成
**EC2**メニューから『**インスタンス**』を選択。
自分の複製したい**インスタンス**を選択。
『**アクション**』を押下。
『**Image and Template**』を押下。
『**イメージを作成**』を押下。
![スクリーンショット 2020-11-15 15.33.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/26e9a161-a9b4-accb-3946-30495198d26a.png)

『**イメージ名**』『**イメージの説明**』で**AMI**につける名前・説明を記入。
『**イメージの作成**』を押下。
![スクリーンショット 2020-11-15 15.39.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/d9bb8504-a828-6dec-ce75-67daf9c997a9.png)
これで、AMIの作成が完了です。
一応確認してみます。

**EC2**メニューから『**AMI**』を選択。
先ほど作成された**AMI**のステータスが**pending**から**available**になれば、無事成功です。
![スクリーンショット 2020-11-15 15.51.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/84b6bcdd-7221-3897-ffce-434c58664aef.png)

##### 現在の構成図
![201111 ELBの構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/b1e05106-c6dd-b1df-ff55-f4552a6c2327.png)

#### 2つ目のインスタンスの作成
**AMI**を利用して、2つ目のインスタンスを作成したいと思います。

**EC2**メニューから、『**AMI**』を選択。
自分の作成した、**AMI**を選択。
『**起動**』を押下。
![スクリーンショット 2020-11-15 16.02.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/04c20097-1d6f-48d6-2015-41a54131c458.png)

今回は、『**t2.micro**』が選択されていることを確認。
『**次のステップ**』を押下。
![スクリーンショット 2020-11-15 16.08.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/a3be164b-a0ff-5547-167d-1eff243f00e0.png)

『**ネットワーク**』に今回使用する**VPC**を、『**サブネット**』に今回使用する**サブネット**をそれぞれ選択。
『**自動割り当てパブリックIP**』は『**有効**』にしておく。
『**次のステップ**』を押下。
![スクリーンショット 2020-11-15 16.02.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/045c90d4-1657-69ff-97b6-c68b7e89430e.png)

そのまま『**次のステップ**』を押下。
![スクリーンショット 2020-11-15 16.02.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/9bc785c4-5445-d309-2eff-7589e5962455.png)

好みでタグをつけておく。
今回は以下のようにしておく。
![スクリーンショット 2020-11-15 16.03.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/a1e65a73-1a92-d7b4-bf72-b7fe1b6c491e.png)

『**既存のセキュリティグループを選択する**』を選択。
1つ目の**インスタンス**と同じ**セキュリティグループ**を選択。
『**確認と作成**』を押下。
![スクリーンショット 2020-11-15 16.25.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/4af5bf9b-a89e-3cfc-4203-ac3b88879abe.png)

そのまま『**起動**』を押下。
![スクリーンショット 2020-11-15 16.04.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/ed320916-5b17-3d64-bbe1-2dc3140839b8.png)

そのまま『**インスタンスの表示**』を押下。



##### 現在の構成図
![201111 ELBの構成図-Page-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/93ea8580-6ca7-e580-1791-5998135eed4e.png)

### 2つ目のインスタンスをELBに追加
上の構成図を見ると残った工程は、2つ目の**インスタンス**を**ELB**の行先に追加してあげることのみです。
では早速やっていきましょう。

**EC2**メニューから『**ターゲットグループ**』を選択。
今回使用する**ターゲットグループ**を押下。
![スクリーンショット 2020-11-18 13.16.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/da0492a4-235c-e287-bc91-7017016d728c.png)

『**Target**』を選択。
『**Register targets**』を押下。
![スクリーンショット 2020-11-18 13.16.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/0cfea318-1d69-c0df-1ea3-78febcf6e777.png)

2つ目のインスタンス（**ap-northeast-1c**）を選択。
『**Include as pending below**』を押下。
![スクリーンショット 2020-11-18 13.20.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/692dfebf-db04-8aee-f153-375214f16049.png)

このように『**Targets**』に2個**インスタンス**が出てくればOK。
![スクリーンショット 2020-11-18 13.20.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/9b750043-4d72-4f07-8732-81994809ccac.png)

[前回記事](https://qiita.com/sychocola1/items/c7364238437a507f0d63#ec2%E3%81%AE%E4%BD%9C%E6%88%90)と同じように2つ目の**インスタンス**にssh接続して docker を起動すれば**ELB**の接続が完了です。

#### 現在の構成図
![201111 ELBの構成図-Page-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412378/411f683b-4f2a-c265-dff9-030a2aa67cea.png)


# まとめ
以上で**ELB**を使ってデプロイすることができました。
次回は、**Route53**を使って、**DNS**を構築していきたいと思います。