【AWS】 止まらないシステム作りを考える

はじめに
---
最近は、AWSのサービスやインフラ的な勉強を少しずつしています。
今回の内容は実際に自身が手を動かしながら学んだ内容なので、見ていただく方には何のことかよく分からないと思われてしまうかもしれません。
学んだ内容や手順を忘れないための備忘録としての投稿となりますので、ご了承ください。

ELB(Elastic Load Balancing)とは
---
外部からのリクエストを複数の装置に振り分けることで、負荷分散できるシステム。

<br>

図を見て考える
---
（問題）
世の中に公開しているサイトでEC2やRDS(DB)が一つずつしか紐づいていないと、何か不具合が起きてしまった時に、サイトが利用できなくなってしまいます。現実的ではありません。

（解決策）
つまり、同じ環境を持つEC2やRDS（DB）が複数作成していれば、ある環境で問題が起きてしまっても、システムを止めることなく安定したサービスが提供できるようになります。
図の左側が同じ環境のEC2、RDS(DB)を2つずつ用意したものです。ユーザがドメインを指定すると、ERBにリクエストが飛び通常①、②と交互に呼び出されます。
右の図では、②の方で問題が起きてしまっているという想定です。この場合、問題のある②の方は呼び出されることなく、稼働している①を常に呼び出し続けるようになります。
こうして分散させることにより、安定したサービスの供給に繋がります。
<br>

<img width="1000px" alt="[ELB_EC2.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942338/635265ab-87b9-17c1-8b26-0ca7c5495d30.png">
● リージョン
クラウドサービスで利用する、データセンターを設置している独立したエリアのこと。

● VPC (Virtual Private Cloud)
仮想ネットワーク。
ユーザー専用のプライベートなクラウド環境を提供するサービスのこと。

● アベイラビリティゾーン (AZ)
各リージョン内の複数の独立した場所で、1つ以上のデータセンターを備えている。
<br>

EC2インスタンスを作成する
---
　　
（手順）
1. EC2インスタンス画面より``インスタンスを起動``をクリック
2. ステップ1〜2 今回は無料枠を選択
3. ステップ3〜5 デフォルトのまま次のステップへ進む
3. ステップ6 ``ルールの追加``をクリックし、``HTTP``を選択
4. 確認と作成
5. ステップ7 起動
6. キーペアを選択し、作成

※ EC2インスタンスの表示画面に戻り、作成したEC2インスタンスが``保留``から``実行中``に切り替われば使用可能になります。
<br>

作成したEC2へログインし、WEBサーバーを立ち上げる
---
今回は、httpdを使用しています（nginxでも手順は変わりません）。
※ ``httpd`` ー Apacheというパッケージ名のWEBサーバ
　　

```terminal.
# EC2へログイン（パブリック IPv4 アドレス）
(ローカル)$ ssh -i ~/.ssh/(プライベートキーのファイル名) ec2-user@(IPアドレス)

# httpdをインストール
[ec2-user@ip-000-00-00-0 ~]$ sudo yum install -y httpd

# アパッチを起動させる
[ec2-user@ip-000-00-00-0 ~]$ $sudo systemctl start httpd

# ステータスを確認する
[ec2-user@ip-000-00-00-0 ~]$ systemctl status httpd
Active: active (running) => 起動中
Active: inactive (dead)  => 停止中

# 再起動しても停止しないようにする
[ec2-user@ip-000-00-00-0 ~]$ sudo systemctl enable httpd
```
　　
WEBサーバをインストールし、起動が完了したので、パブリックIPv4アドレスでページを開きます。
そうすると、初期画面が表示されます。

<img width="1000px" alt="[httpdインストール(初期画面).png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942338/20951e21-ab4d-0c43-c2cd-c62668349f62.png">

```
# htmlのフォルダへ移動
[ec2-user@ip-000-00-00-0 ~]$ cd /var/www/html/

# HTMLを作成して、内容を加える
# vimの画面に切り替わるので、iを押し、適当な文章を入力、esc + :wq で保存して終了
[ec2-user@ip-000-00-00-0 ~]$ sudo vim /var/www/html/
こんにちは                                                                               
~                                                                               
~                                                                               
~                                                                                                                                                             
~                                                                                                                                           
~                                                                               
~                                                                               
~                                                                               
~                                                                               
~                                                                               
~                                                                               
"index.html" [新ファイル] 
```
　　　
  
もう一度、パブリックIPv4アドレスでページを開きます。
そうすると内容が「こんにちは」に変わっていることが確認できます。
EC2の作成とサーバの立ち上げ、簡単にサイトの内容が完成しました。
<br>

作成したEC2からAMIを作成する
---
（前提）
今回EC2インスタンスを2つ作るのは、サイトを運営していく上で何か不具合などによりシステムが止まってしまうことを防ぐためです。
つまり、EC2インスタンスを複数作成しても、それぞれが同じ内容を保持している必要があります。
なぜなら、別々の内容を保持していると、その都度違う内容が表示され、ユーザーが困ってしまうからです。
そこで、EC2の2つ目を作成する前に、最初に作成したEC2インスタンスからAMIを作成します。
  　　
  
（手順）
1. EC2インスタンス画面より、先ほど作成したEC2インスタンスを選択し右クリック
2. ``イメージとテンプレート`` → ``イメージを作成``の順番にクリック
3. 名前をつけて、``作成``をクリック
4. AMIが作成完了
<br>

EC2をもう一つ作成
---
　　
（手順）
1. EC2インスタンス画面より先ほど作成したEC2インスタンスを選択し、``インスタンスを起動``をクリックする
2. ステップ1 画面左側にある``マイ AMI``をクリック
3. 先ほど作成したAMIの名前が表示されるので、``選択``をクリック
※ 最初に作成したEC2インスタンスの情報を引き継いでいます。
4. ステップ2 デフォルトのまま次のステップへ進む
5. ステップ3 サブネットを「ap-northeast-1c」か「ap-northeast-1d」を選択。
※ インスタンス画面で最初に作成したEC2インスタンスのアベイラビリティゾーンを確認してみると、「ap-northeast-1a」になっているはずなので、別のアベイラビリティゾーンを指定しています。
6. ステップ4〜5はデフォルトのまま次のステップへ進む
7. ステップ6 ``ルールの追加``をクリックし、``HTTP``を選択
8. ステップ7 起動
9. キーペアを選択し、作成

　　
ここで新しく作成した、EC2インスタンスのパブリックIPv4アドレスを入力し、ページを開くと...
サーバがインストール、起動した状態、かつ「こんにちは」が表示されるようになっています。
AMIを使用してEC2インスタンスを作成したことにより、中身がそっくりそのまま反映されているのです。
<br>

ロードバランサーを導入する
---
（手順）
1. EC2で開いている画面の左サイドバーの、``ロードバランサー``をクリック
2. ``ロードバランサーの作成``をクリック
3. Classic Load Balancerの``作成``をクリック
※ 種類はたくさんありますが、今回はこちらを採用しています。
4. 手順 1 ロードバランサー名を入力
5. 手順 1 ロードバランサーのプロトコルが``HTTP``80であることを確認
6. 手順 2〜3 そのまま次へ進む
7. 手順 4 高度な詳細(間隔30 → 10, 正常のしきい値10 → 2)に変更
8. 手順 5 EC2 インスタンスの追加(先ほど作成したEC2インスタンスを2つとも選択)
9. 手順 6〜7 そのまま次へ進む(作成)

ロードバランサーの作成までには少し時間がかかります。
作成したロードバランサー名をクリック、更にインスタンスをクリックすると以下のような表示がされ、確認することができます。

|インスタンス ID |名前   |アベイラビリティーゾーン  |ステータス|
|:--    |:--       |:--     |:--    |
|i-●●●●●●●●●●●●●●●●●|test1 |ap-northeast-1a　| InService |
|i-●●●●●●●●●●●●●●●●●|test2 |ap-northeast-1c  |InService  |


※ OutOfService - 起動していない
※ InService - 起動済み
<br>

ロードバランサーのDNS名でページを開いてみる
---
ロードバランサー名をクリックし、更に説明をクリックします。
そうすると、内容にDNS名という箇所が存在するので、こちらをURLのバーに入力します。
画面が読み込まれると、先ほどの「こんにちは」が表示されます。

どちらもビューには「こんにちは」と記載しているのでわかりづらいですが...
一方のビューを例えば「おはよう」に内容を変えるとします。
こうすると分かりやすいのですが、更新ボタンを押し続けると「こんにちは」と「おはよう」が交互に表示され、順番に呼び出されていることがよく分かります。
<br>

終わり
---

当初の図のEC2とELBの部分のみの内容ですが、今回は以上とさせていただきます。
最後までご覧いただきまして、ありがとうございます。
また、もし内容に誤りなどがございましたら、ご指摘いただけますと幸いです。