[AWS]Webレイヤを冗長化する方法

**2020年2月11日現在の内容です。**

構成イメージ
<img width="1136" alt="スクリーンショット 2020-02-08 16.03.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/c3fed60b-b636-cac2-c396-fd2c9d447923.png">


## 用語説明
### 単一障害点(Single Point Of Failure)
その箇所で障害が発生すると全体が停止する箇所

### 冗長化
システムの構成要素を多重化すること
　　　　↓
ある構成要素で障害が発生しても処理を引き継げるようにすることで稼働率を高めることができる
(単一障害点をなくす)

### プロビジョニング
アクセス数などを予測し適切にリソースを準備すること

### ロードバランサー
各サーバーにアクセスを振り分け、負荷を分散させる装置

### ELB(Elastic Load Balancing)
AWSクラウド上のロードバランサー

概要

- 複数のEC2インスタンスに負荷分散する
- 複数のアベイラビリティゾーンにある複数のEC2インスタンスの中から正常なターゲットにのみ振り分ける(ヘルスチェック)

特徴

- スケーラブル：ELB自体も負荷に応じて自動でスケールアウト・スケールインする
- アベイラビリティゾーンをまたがる構成：ELBを利用する場合、1つのリージョンを選び、そのリージョン内のアベイラビリティゾーン全てを対象にする
- 名前解決：ELBにはDNS名が割り当てられる。ELBへの接続へのアクセスにはDNSを使用する
- 安価な従量課金：従量課金で利用可能
- マネージドサービス：運用が楽

## 稼働率を上げる
稼働率を高くするための考え方

- 障害発生間隔を長くする
- 平均復旧時間を短くする

稼働率を上げる具体的な方法

- 要素単体の稼働率を高くする　**(AWSでは難しい)**
- 要素を組み合わせて、全体の稼働率を高くする
- 負荷を適切なプロビジョニングで回避する

**要素を組み合わせることで、サービスの構成を冗長化する**
冗長化構成

- Active-Active：冗長化した両方が利用可能
- Active-Standby：冗長化した片方は利用不可能
    - Hot Standby：スタンバイ側は普段起動しすぐに利用可能
    - Warm Standby：スタンバイ側は普段起動しているが、利用するのに準備が必要
    - Cold Standby：スタンバイ側は普段停止している

**負荷を適切なプロビジョニングで回避する**

スケールアップ

- 個々の要素の性能を向上させる
- ある程度の規模まではスケールアップはコストパフォーマンスが良いが、一定範囲を超えると悪くなる

スケールアウト

- 個々の要素の数を増やす
- ある程度の規模を超える場合、スケールアウトで対応する
- 最低限N+1構成を用意、N+2構成であれば安心　(N=サービス提供に必要な台数)

## サーバー構成のベストプラクティス
**基本的な構成**
1台のサーバーでWebとDBを運用する
<img width="876" alt="スクリーンショット 2020-02-08 22.03.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/f4e716c2-dc4d-db70-cebf-5f287228920d.png">

**パターン：Webサーバー×1、DBサーバー×1 構成**
1台のサーバースペックが足りなくなった時に、DBを別のサーバーに切り出す
<img width="876" alt="スクリーンショット 2020-02-08 22.09.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/6fe13783-8a58-5fbd-2a1d-5029f1f27602.png">

**パターン：Webサーバー×2、DBサーバー×1 構成**
Web側の性能が足りない時に、Webサーバーを複数台使うことで、Web側の冗長化と負荷分散を行う
<img width="876" alt="スクリーンショット 2020-02-08 22.12.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/4b95248e-8b80-b761-54ad-a087ea99d2da.png">

**パターン：Webサーバー×2、DBサーバー×2 構成**
DBをマスタースレーブ方式にすることで、DBの冗長化を行う
(Webの冗長化と負荷分散、DBの冗長化ができる)
<img width="1186" alt="スクリーンショット 2020-02-08 22.25.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/1ca8fa81-9956-5557-d5bd-8bdedc383ec1.png">

## AMIからEC2を起動
**負荷分散用Webサーバーを構築する**

パブリックサブネットを作成
<img width="1680" alt="スクリーンショット 2020-02-09 9.11.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/8d7b280e-2c73-db39-4eb5-e157900a60e1.png">
<img width="1680" alt="スクリーンショット 2020-02-09 9.13.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/2ae6654b-3f32-6985-8a29-85a57a3d25c5.png">
<img width="1680" alt="スクリーンショット 2020-02-09 9.20.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/e06479ee-9144-68fa-44df-d8b4e1b76c7c.png">

ルートテーブルを関連付ける
<img width="1680" alt="スクリーンショット 2020-02-09 9.14.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/f22d6328-3059-6662-fc7f-d958cf430269.png">
<img width="1680" alt="スクリーンショット 2020-02-09 9.18.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/8d10bef4-8805-cd55-032b-10cb5769d8b1.png">
<img width="1680" alt="スクリーンショット 2020-02-09 9.21.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/a6f6ded4-e3be-47d4-7e23-0f6287c7b702.png">

EC2　→　インスタンスから負荷分散元のEC2インスタンスを選択
アクション　→　イメージ　→　イメージの作成をクリック
<img width="1680" alt="スクリーンショット 2020-02-09 9.24.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/9547a458-7140-2a27-eb65-5ee8137f4022.png">

イメージ名、イメージの説明に任意の名前を入力し、「イメージの作成」をクリック
<img width="1680" alt="スクリーンショット 2020-02-09 9.28.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/b7cb605f-9980-9670-ff77-aac5c71c277c.png">

イメージの作成を確認
<img width="1680" alt="スクリーンショット 2020-02-09 10.04.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/36e5281a-50ab-6775-e836-525dc6d524f1.png">

サイドバーから「AMI」をクリック
<img width="1680" alt="スクリーンショット 2020-02-09 10.06.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/2775bd05-b3c7-6141-12d9-5d35332e2f9c.png">

作成したAMIを選択し、「起動」をクリック
<img width="1680" alt="スクリーンショット 2020-02-09 10.09.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/5ca8fecd-94e9-b72d-010e-41a8c1670fa8.png">

タイプは「t2.micro」を選択し、「次のステップ」をクリック
<img width="1680" alt="スクリーンショット 2020-02-09 10.11.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/37cf261a-1752-b0ea-0708-a5f93339a56d.png">

以下の通り設定し、「次のステップ」をクリック
ネットワーク：作成したVPC
サブネット：作成したサブネット
自動割り当てパブリックIP：有効
キャパシティーの予約：なし
プライマリIP：10.0.11.10
<img width="1680" alt="スクリーンショット 2020-02-09 10.13.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/c458cc82-37c7-bae8-3be8-1bacf7c29209.png">
<img width="1680" alt="スクリーンショット 2020-02-09 10.19.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/d8650c28-2b11-f3ba-58e6-d45586893a23.png">

ストレージは変更せずに、「次のステップ」をクリック
<img width="1680" alt="スクリーンショット 2020-02-09 10.21.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/447bd2d5-1c87-1fd3-5f30-537461df174b.png">

タグを任意追加し、「次のステップ」をクリック
<img width="1680" alt="スクリーンショット 2020-02-09 10.22.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/f98b46c0-bba0-bd4d-1337-2262ece7b70a.png">

既存のセキュリティグループ　→　負荷分散元のEC2インスタンスと同じセキュリティグループを選択し、「確認と作成」をクリック
<img width="1680" alt="スクリーンショット 2020-02-09 10.25.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/63c7e0e6-6c3b-a8a7-d4a1-635a049bcac1.png">

設定内容に問題がないことを確認し、「起動」をクリック
<img width="1680" alt="スクリーンショット 2020-02-09 10.28.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/7d7f9f13-7fd7-1090-580e-738e449799b1.png">

既存のキーペアを選択し、「インスタンスの作成」をクリック
<img width="1680" alt="スクリーンショット 2020-02-09 10.30.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/b8f1d53b-fb2a-aee8-79cf-6d042fa0cc7a.png">

EC2インスタンスが作成されていることを確認
<img width="1680" alt="スクリーンショット 2020-02-09 10.36.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/a09e52f7-b579-f6c2-0564-e2d91f53e1af.png">

## ELBの作成
サイドバーから「ロードバランサー」をクリック
<img width="1680" alt="スクリーンショット 2020-02-11 10.05.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/23c9ad4f-986d-5a36-31bd-9ada5e88d37d.png">

「ロードバランサーの作成」をクリック
<img width="1680" alt="スクリーンショット 2020-02-11 10.06.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/9f7606ae-7e8a-4c7c-3ec4-66fe039201d5.png">

Application Load Balancerの「作成」をクリック
<img width="1680" alt="スクリーンショット 2020-02-11 10.09.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/cb68d0c4-036e-9c5b-ea5d-e5ca8437f8c3.png">

以下の通り設定し、「次の手順」をクリック
名前：任意名
VPC：EC2インスタンスを配置しているVPC
サブネット：EC2インスタンスを関連付けているパブリックサブネット
<img width="1680" alt="スクリーンショット 2020-02-11 10.12.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/70c3837c-6e25-ab97-e334-53873a1c6cb9.png">

「次の手順」をクリック
<img width="1680" alt="スクリーンショット 2020-02-11 10.30.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/c670a7c4-12e7-1cbc-9840-39cbdc33c46a.png">

新しいセキュリティグループを作成するを選択し、「次の手順」をクリック
セキュリティグループ名,説明：任意名
<img width="1680" alt="スクリーンショット 2020-02-11 10.33.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/5b3c9f93-53ca-2ac7-813b-e06c3aa6c6f0.png">

以下の通り設定し、「次の手順」をクリック
名前：任意名
詳細設定：適宜設定
<img width="1680" alt="スクリーンショット 2020-02-11 10.44.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/c395dc7b-6a59-e9dc-fe64-8b3b6ffdf635.png">

ELBの対象とするインスタンスを選択し、「登録済みに追加」をクリック
<img width="1680" alt="スクリーンショット 2020-02-11 10.48.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/7955daac-61e6-032f-dcee-451548d3e926.png">

登録済みターゲットにインスタンスが追加されていることを確認し、「次の手順」をクリック
<img width="1680" alt="スクリーンショット 2020-02-11 10.51.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/a555076e-6938-9dc4-7df7-2bed9a3433f8.png">

設定内容に問題がないことを確認し、「作成」をクリック
<img width="1680" alt="スクリーンショット 2020-02-11 10.55.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/5daa1c57-4fdd-c1a1-2377-2d20c677b65d.png">

ロードバランサーが作成されていることを確認
<img width="1680" alt="スクリーンショット 2020-02-11 11.03.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/410866e2-0f81-834e-8c14-c7ef49157ae9.png">

DNS名をブラウザでアクセスし、ELBにアクセスできることを確認
<img width="1680" alt="スクリーンショット 2020-02-11 11.05.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/e753d90a-8178-3747-b6cd-056b1ff4d4ab.png">
<img width="1680" alt="スクリーンショット 2020-02-11 11.08.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/4b02eb7c-e769-8267-2709-c5034676c4ce.png">

### 独自ドメインからELBにアクセス
AWSコンソールからRoute 53を検索し、クリック
サイドバーから「ホストゾーン」をクリック
対象のドメイン名をクリック
<img width="1680" alt="スクリーンショット 2020-02-11 11.21.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/a361cc71-5c9f-1d23-32f1-2f707a6adce5.png">
<img width="1680" alt="スクリーンショット 2020-02-11 11.14.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/2ed2df69-0db0-0f55-4a6e-45e2bb34ea67.png">
<img width="1680" alt="スクリーンショット 2020-02-11 11.16.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/425e3213-7caa-d1a7-6402-e8d5b2e13a6a.png">

Aレコードを選択
<img width="1680" alt="スクリーンショット 2020-02-11 11.24.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/5dd010bb-1ed0-4330-23f8-79bc91a5ae2f.png">

以下の通り設定し、「レコードセットの保存」をクリック
エイリアス：「はい」
エイリアス先：作成したELB
<img width="1680" alt="スクリーンショット 2020-02-11 11.26.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/e65af2cc-cacc-06b5-8875-641672663f82.png">

レコードセットが保存されていることを確認
<img width="1680" alt="スクリーンショット 2020-02-11 11.30.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/21ac2748-1b00-17ec-7a0b-305f2c830032.png">

### ヘルスチェックの確認
アベイラビリティゾーン「1a」のApacheを停止させる
<img width="1680" alt="スクリーンショット 2020-02-11 11.38.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/864ae983-49e9-a4a8-0976-6c2bb66a48cd.png">
`ssh -i test-ssh-key.pem ec2-user@18.179.167.73`
`sudo systemctl stop httpd.service`

サイドバーから「ターゲットグループ」をクリック
<img width="1680" alt="スクリーンショット 2020-02-11 11.44.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/ecf46b2f-8262-683e-12f7-726481fb2528.png">

「ターゲット」をクリック
<img width="1680" alt="スクリーンショット 2020-02-11 11.46.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/bd632811-4ab3-5b74-9bf4-55192cb56188.png">

アベイラビリティゾーン「1a」のステータスが「unhealthy」になっていることを確認
<img width="1680" alt="スクリーンショット 2020-02-11 11.48.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/f87c22eb-b6a5-7fe1-a06a-364081293144.png">

## ELBを運用する際のポイント
1. サーバーはアベイラビリティゾーンを分けて配置する
2. Webサーバーはステートレスに構築する

## おまけ（ELBからEC2インスタンスを削除）
EC2 →　ターゲットグループ　→　ターゲット　→　編集をクリック
<img width="1680" alt="スクリーンショット 2020-02-11 12.11.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/b4df7e19-6039-2971-a87c-572dfb13588c.png">

削除対象のEC2インスタンスを選択し、「削除」をクリック
<img width="1680" alt="スクリーンショット 2020-02-11 12.12.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/1fcc5e87-4474-4a37-0e3d-03372307eade.png">

EC2インスタンスが削除されたことを確認し、「保存」をクリック
<img width="1680" alt="スクリーンショット 2020-02-11 12.14.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/d722f1a8-8c43-3b9f-545b-f3fe78282a1d.png">

## 参考
[AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得](https://www.udemy.com/course/aws-and-infra/)