【AWS】ELBについてまとめてみた


前提として

RDSは、「エンドポイント通信」という機能で、
AZ(1a)のRDSに障害が起きた場合は、
自動的にAZ(1c)のRDSに繋ぐことができます。

しかし、EC2はダウンした時にサポートできるものがないため、
こちらがダウンしたらRDSも使えなくなります。

これを単一障害点と言います。

「じゃあ、RDSみたいにEC2もAZ(1c)に複製すればいいじゃん」と考えるのですがこちらはNGです。
なぜダメなのかというと以下の3点の理由からです。

①アクセスポイントが複数になってしまう。
→上記の例で言うと、10.0.0.0/24と10.0.1.0/24の2つです。

②サーバーが正常かどうかチェックしないといけない。
→AZ(1a)がエラーのときは、AZ(1c)に転送したり、通信自体をキャンセルできるようにしないといけない。

③セキュリティの問題
→直接WEBサーバーにアクセスできるというのはセキュリティ面から見て不安であり、負荷がかかってしまう。

上記の問題を解決するために使われるのがELB

ELBとは?

ELBは、Elastic Load Balancingという名前です。
主な機能としては3つです。
①ELBにはDNSのアクセスポイントが付与されます。
つまり、アクセスポイントを1つにして負荷を分散させることができます。

②ヘルスチェック機能がある
異常なインスタンスを発見したら通信をキャンセルしてくれます。

③ELBに証明書を付与することでSSL通信の終端になってくれる
HTTPS通信を復号する処理を担当してくれる。
つまり、internet gatewayの段階ではHTTPSだが、サブネット内ではHTTP通信となる。

構成図

よく使われる構成図

①ELBのみパブリックサブネットに配置する

②FrontendとAPIを分けて3層で構築する

Privateサブネット内にELBを配置します(=内部ロードバランサーと言います)

では実際に作ってみましょう!

1. AWSへログイン

2. 東京リージョンになっていることを確認

3. VPCを作成(IP:10.0.0.0/21)

■ルート
コンソールで「VPC」と検索→左ペイン内の「VPC」を選択→「VPCを作成」を選択

4. サブネットを作成(IP:10.0.0.0/24, 10.0.1.0/24, 10.0.2.0/24, 10.0.3.0/24)

■ルート
コンソールで「VPC」と検索→左ペイン内の「サブネット」を選択→「サブネットを作成」を選択

Public Subnetを作成

WordPressに使うサブネットを作成します。

Private Subnetを作成

RDB(MySQL)に使うサブネットを作成します。

5. Publicサブネット内にEC2を構築

■ルート
コンソールで「EC2」と検索→左ペイン内の「インスタンス」を選択→「インスタンスを起動」を選択

■ステップの流れ
STEP1 Amazon Linux 2 AMI
STEP2 t2.micro
STEP3 「ネットワーク」、「サブネット」、「パブリックIP」を変更

STEP4 そのままでOK
STEP5 Name=WEBSERVER1で設定
STEP6 セキュリティグループを変更

STEP7 キーペアの作成

AMIの作成

作成したWEBSERVER1を停止してAMIを作成します。
■ルート
コンソールで「EC2」と検索→左ペイン内の「インスタンス」を選択→「インスタンスの状態」から停止を選択
コンソールで「EC2」と検索→左ペイン内の「インスタンス」を選択→「アクション」から「イメージを作成」を選択

では作成したAMIを使ってインスタンスを作成しましょう。
ステップ5のタグは、Name=WEBSERVER2とします。

6. Publicサブネットをインターネットに接続するためにInternet Gatewayを作成

■ルート
コンソールで「VPC」と検索→左ペイン内の「インターネットゲートウェイ」を選択→「インターネットゲートウェイの作成」を選択

これではVPCとアタッチできていないので、インターネットへ接続できません。
なのでアタッチさせましょう!

これでアタッチしました。

7. EC2がインターネット接続するためにルートテーブルを作成

■ルート
コンソールで「VPC」と検索→左ペイン内の「サブネット」を選択→「Public-Subnet1」を選択→「ルートテーブル」を選択→「ルート」へ移動→「ルートを編集」を選択

8. SSH接続でログイン

ターミナル
// ①キーペアがあるところへ移動
$ cd desktop

// ②キーペア発見
$ ls -l keypair.pem
-rw-r--r--@ 1 ryo  staff  1704  5  1 14:38 keypair.pem

// ③権限を400に変更
$ chmod 400 keypair.pem

// ④SSH接続
$ ssh -i keypair.pem ec2-user@(パブリックIPアドレス)

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

9. PrivateサブネットにRDSを構築

RDSには、エンドポイント通信という機能がありました。
もし通信障害などが発生して、親のRDSが使えなくなった時子のRDSに接続してくれる機能です。
つまり、このことから異なるAZにサブネットがないとRDSは使えません

ということで複数のサブネットにまたがる形でRDSは構築されるので、
サブネットグループというものが必要になります。

■ルート
コンソールで「RDS」と検索→左ペイン内の「サブネットグループ」を選択→「DB サブネットグループを作成」を選択

それでは次に、DBを作成していきましょう。
■ルート
コンソールで「RDS」と検索→左ペイン内の「データベース」を選択→「データベースの作成」を選択





次にRDSで作ったセキュリティグループを修正します。
■ルート
コンソールで「VPC」と検索→左ペイン内の「セキュリティグループ」を選択→「RDS-SG-1」を選択

DBは重要な情報が入っているため誰でも彼でもアクセスできると困ります。
なので、PublicサブネットのEC2(セキュリティグループ→WEB-SG-1)からしか触れないように修正します。

10. EC2にWordPressを導入

ターミナル
// 権限が足りないので権限をrootに移動
$ sudo su -

// EC2のパッケージを最新の状態にアップデート
$ yum -y update

// WordPressが動くために必要なツールをダウンロード(PHP, Apache, MySQL)
$ amazon-linux-extras install php7.2 -y
$ yum -y install mysql httpd php-mbstring php-xml gd php-gd

// Apacheが再起動後も自動的に動くようにする
$ systemctl enable httpd.service

// Apacheをスタート状態に
$ systemctl start httpd.service

// カレントディレクトリにWordPressの最新パッケージを入れる
$ wget http://ja.wordpress.org/latest-ja.tar.gz ~/

// あるか確認する
$ ls -l
total 16076
-rw-r--r-- 1 root root 16458939 Apr 21 00:00 latest-ja.tar.gz(あった)

// 拡張子がgzなので展開しましょう
$ tar zxvf ~/latest-ja.tar.gz

// ディレクトリごと/var/www/htmlへコピーする
$ cp -r ~/wordpress/* /var/www/html/

// /var/www/htmlをapacheのユーザーに権限変更
$ chown apache:apache -R /var/www/html

11. ロードバランサーを導入

■ルート
コンソールで「EC2」と検索→左ペイン内の「ロードバランサー」を選択→「ロードバランサーの作成」を選択




12. RDSのサイトアドレスをロードバランサーのDNSに書き換え

ターミナル
// ①RDSへログイン
$ mysql -h database-1.xxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -u wordpress -p

// ②WordPressのテーブルを使用
MySQL [(none)]> USE wordpress

// ③指定のカラム
MySQL [(none)]> SELECT * FROM wp_options WHERE option_name IN ('siteurl', 'home');
+-----------+-------------+-----------------------+----------+
| option_id | option_name | option_value          | autoload |
+-----------+-------------+-----------------------+----------+
|         2 | home        | http://13.231.153.132 | yes      |
|         1 | siteurl     | http://13.231.153.132 | yes      |
+-----------+-------------+-----------------------+----------+

// ④ロードバランサーのDNS名に置き換える
MySQL [(none)]> UPDATE wp_options SET option_value = 'http://xx.xx.xx.xx' WHERE option_name IN ('siteurl', 'home');

13. EC2のセキュリティグループのアクセス許可をロードバランサーからに変更する

■ルート
コンソールで「EC2」と検索→左ペイン内の「セキュリティグループ」を選択→「WEB-SG-1」を選択

14. RDSも冗長化構成へ変更

■ルート
コンソールで「RDS」と検索→左ペイン内の「データベース」を選択→「database-1」を選択