AWSではじめて冗長構成を構築をしてみた。超ざっくりまとめてみた。

今回、AWSの基礎を学ぶ目的で以下のような Web/APサーバのAuto Scaling＋DBサーバの冗長化構成を作成しました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/8b1a9c04-34be-db03-2826-d11c83ffbe77.png)


細かい作業過程は割愛しますが環境構築で理解した基本構成の概要を自分の理解を深めるために、超ざっくりと基本要素をまとめます。

これを見れば、何の目的のために何を作るのか、一目で思い出せるはず！

また、この記事が、これからAWSの基礎学習を始める方の理解の助けとなり、AWSを触るハードルを下げる助けとなれば幸いです。私も初心者です。みなさん頑張りましょう！
    <img width="200" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/94dddfb7-7b35-c5bf-4d1e-d95415dae66f.png">

---
- 説明を極力シンプルにするために、AWSのアカウント作成、IAMユーザの登録は完了している状態から始めます。
- 作図には [AWS 公式アイコンセット](https://aws.amazon.com/jp/architecture/icons/)を利用してます
- 全般的に概念的な説明のみとしています。
- 詳細な設定/オペレーションを知りたい方は、他サイトをご覧ください。
    - [この記事](https://qiita.com/Hiroaki_jr/items/253bf9d833ffe154304d)に画面キャプチャ付きで細かく説明されてました！
    - その他は[ここ(Auto Scaling)](https://qiita.com/y-u/items/4fb2c65510b018fb9eb0)とか、[ここ(RDS)](https://qiita.com/seri1234/items/645f50bea3a898ceb6fc)とか、[ここ(AMIイメージ/ロードバランサ作成)](https://qiita.com/tseno/items/2041e82a7f2f8e721a18)とか．．．ググったりとかして細かいことは補ってください．．．


超ざっくりまとめ
---

超ざっくりと説明すと、以下を行うだけです。
 1. 自分用のネットワーク(VPC、サブネット)/サーバ(EC2インスタンス)を作成する
 2. DB(RDS)を作成し冗長構成をとる
 3. ロードバランサー(ELB)を作成し負荷分散を行う＋Auto Scalingの設定を行う

これだけで、さくっと作れてしまいます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/99989eb8-5b7e-9cfe-a63f-a4842633c778.png)<BR>簡単な設定だけで<BR>必要になれば自動で|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/72bd300f-5e61-bcbf-efb8-33e24376f859.png)<BR>映画マトリックス レボリューションズ<BR>のエージェントのように増加していく．．．|
|:---|:---:|

*あくまでも個人的な Auto Scaling のイメージです。

 1. 自分用のネットワーク(VPC、サブネット)/サーバ(EC2インスタンス)を作成する
---
まず、VPC、サブネット、EC2を作成します。作成に関しては[前回記事](https://qiita.com/sat4038/items/a94f3ff551353cb1bdb0)を参照ください。

ここまでで以下構成が作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/0067a00e-c192-e1fe-b0ea-95ff507326da.png)


 2.  DB(RDS)を作成し冗長構成をとる
---
####RDSとは？

RDSとは、AWSが提供する『マネージド型データベースサービス』です。
簡単に言うと、AWSがセキュリティ、バックアップ等を担ってくれるデータベースといったイメージです。
※Paasサービス。管理はAWSがやってくれて利用者はDBを使うことに専念できる。

####RDSの作成
RDSで冗長構成を構築する際は、AWSマネジメントコンソールで簡単に構築できます。
主な設定項目は以下の通りです。

 - データベースエンジン
<img width="800" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/4cad5f4f-2bdc-6f94-8d06-7ffe4e52e362.png">
 - インスタンス識別子(インスタンス名)
 - CPU/メモリ
 - ストレージ
 - スタンバイインスタンスを作成する/しないの指定　※今回はするを選択
 - サブネットグループ(DBインスタンスがMain-Standby構成をとるサブネット範囲)
 - DB配置先のAZ

上記指定で、サブネットグループ内に、Main-Stanby構成でデータベースが作成されます。

####EC2インスタンスからRDSへの接続設定
RDSは起動するとエンドポイントが発行されます。EC2インスタンス上で稼働するプログラムで、RDSへの接続先をエンドポイント指定(ex.myexampledb.xxxx.us-east-1.rds.amazonaws.com)とすることで、AWSが自動的にMainのRDSに接続をしてくれます。またMainのデータベースに障害が起きた時には、standbyのデータベース(RDS)に接続が自動的に切り替わります。

ここまでで以下構成となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/2f857635-8dcd-96ac-f0ea-440452713818.png)




 ３. ロードバランサー(ELB)を作成し負荷分散を行う＋Auto Scalingの設定を行う
---
####そもそも、ELBの目的/特徴は？
- 負荷分散
    - サーバ処理の負荷分散を行う
- サービス可用性の向上
    - サーバーの冗長化と組み合わせ、システム全体が停止しない仕組みを作る
    - ヘルスチェックを行い、正常なターゲットにのみトラフィックをルーティングする
- 通信セキュリティ
    - ELB側でSSL/TLS認証を行うことが可能
- スティッキーセッション
    - 同一ユーザーから来たリクエストを同じターゲットに送信
    - Webアプリでセッション情報などをターゲットが保持する作りの場合に使用する


####ELBの作成

AWSでは3つのロードラバランサを選択可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/74221a4d-fa63-9a80-b398-455becf462d2.png)

- ALB (Application Load Balancer)
    - CLBよりも高性能でAWS WAFやターゲットグループ等が使用できる
    - L7レイヤーをサポート
- NLB(Network Load Balancer)
    - 大量トラフィック用のELB
    - L4レイヤーをサポート
- CLB (Classic Load Balancer)
    - 旧型の汎用LB
    - L4/L7レイヤーをサポート

Webサーバでは、主にALB (Application Load Balancer)を使用します。
以下のようにWebサーバとAPサーバを分け、3階層構造とする場合は、WebサーバにはALBをAPサーバにはNLBを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/de735e76-c2bd-ef6f-8944-e253dbd5f71a.png)
※[動画学習サービス「AWS CloudTech」](https://aws-cloud-tech.com/)より画像引用

上記から今回の構成では、ALBを使用します。

ALBもAWSマネジメントコンソールから構築します。
主な設定項目は以下の通りです。

- ①リスナー
    - Listenするプロトコルとポート番号
- ②アベイラビリティゾーン
    - ELB配置先のアベイラビリティゾーン、サブネット
- ③ターゲットグループの作成
    - ターゲット：ELBがトラフィックを転送するEC2インスタンスなどのリソースやエンドポイントの決定(どのサーバをELBの対象に含めるかを決定)
    - ターゲットに対する通信プロトコル/ポート番号を設定
- ④ヘルスチェック内容の指定
    - チェック対象のリソースパスとチェックに使用するプロトコル
    - チェックOK/NGの判断仕様(閾値、チェック間隔、チェック成功コード)
- ⑤インストールするSSL証明書(HTTPS通信の場合)
- ⑥セキュリティグループの設定
    - 許可するプロトコル、ポート(Webアプリならばhttp or httpsのみ許可する)


<img width="800" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/71b94e4b-eb01-4df2-88dc-1227f14bc284.png">
[AWS Black Belt Online Seminar Elastic Load Balancing (ELB)より画像引用](https://d1.awsstatic.com/webinars/jp/pdf/services/20191029_AWS-Blackbelt_ELB.pdf)


そして、Internet Gatewayの配置、ルーティングテーブルの設定で外部からアクセスできるようにします。
この部分に関しては[前回記事](https://qiita.com/sat4038/items/a94f3ff551353cb1bdb0)を参照ください。
また、最低限の通信を許可することでセキュリティを高めます。
具体的には、Public subnetのEC2のセキュリティグループでは、ELBからの通信のみを許可し、RDSのセキュリティグループでは、EC2からの通信のみを許可するように設定します。

ここまでの作業で以下が作成できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/3dda7b91-377d-17e3-57c4-4aff2753013e.png)

ゴールは目の前。あと一息です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/689543be-de5d-ae38-8c49-bdf5605148fd.png)


#### サーバ追加のための元ネタ(AMIイメージ、起動テンプレート)を作成
サーバ自動追加時に作成したい内容のEC2インスタンスを元にして、AMIイメージ、起動テンプレートを作成します。これも、AWSマネジメントコンソールで簡単に作成できます。
具体的な操作は、以下の記事が参考になります。
- [AMIイメージ作成](https://qiita.com/tseno/items/2041e82a7f2f8e721a18#13-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0ami%E3%81%AE%E4%BD%9C%E6%88%90)
- [起動テンプレート作成](https://qiita.com/Hiroaki_jr/items/253bf9d833ffe154304d#1-%E8%B5%B7%E5%8B%95%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)


#### ELBに対して、Auto Scalingの設定を行う(Auto Scaling Group作成)
以下を行うことでAuto Scalingの設定が完了します。

- Auto Scalingグループの作成
    - オートスケール対象の指定(ターゲットグループの指定)
    - EC2インスタンスの最少数、最大数、希望する数を指定
- CloudWatchで監視の設定
    - アラームの作成を行う
        - 「CPU稼働が70%より大きい」「CPU稼働が30%より小さい」という基準を設ける
        - これらの基準に満ちた場合は、アラームを発生させる設定を組む(＝アラームの作成)
    - アラームを作成するとCloudWatchが監視を開始する
- Auto Scalingのポリシーの追加
    - スケーリングポリシーの作成を行う
        - Auto Scalingをいつ、どのタイミグで実施するかの条件を指定(先に作成したCloudWatchアラームを指定)
        - 上記イベント発生時のアクション(インスタンス追加/削除)を設定する

※上記作成のイメージ図
<img width="1000" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/cb70c8ff-034f-1f28-222a-35431d77fc5e.png">


これで完成です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/5c0cfaf5-f475-db28-97e0-bb9e8ba41dcd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/4c0adec6-c46b-ac34-14c7-c45858f50ccb.png)

この状態でEC2インスタンスに負荷をかけ、CPU使用率を70%以上にすると自動でサーバが２台まで追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/e25d8dad-ec4d-1982-092d-553812c6884b.png)


やり残したこと
---
ALBのみPublic Subnetに、Webサーバは Private Subnet に配置した方がよりセキュリティレベルが高まる。あとで、その構成も構築してみる。


さいごに
---
この記事はAWS初学者を導く体系的な動画学習サービス[「AWS CloudTech」](https://aws-cloud-tech.com/)の課題カリキュラムで作成しました。

このサービスは、テンポの良い/わかりやすい動画説明をもとに、気軽に実践を積み、自分の血肉とできるオンラインスクールです。
コミュニティも存在し、Slackで会員通しの情報交換/質問も気楽にできます。
<img width="100" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/8889d9eb-2c72-293d-fda8-73dbd95eb1ab.png">

書籍を購入するような値段で学習ができ、とてもお得です。(個人的な感想です)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038334/1b330d17-6e3f-50ab-d6f1-2a96300cd626.png)

では、また次回お会いしましょう！
次回は、Route53によるドメイン設定とサイト障害時のSORRYページ表示の予定．．．です！