AWSウェブサーバーの構成要素について理解する

## はじめに
クラウド環境でシステムを構築する際、ネットワーク基盤に続いて重要となるのが、ウェブサーバーの構成です。前回の記事「AWSネットワークの構成要素について理解する」では、VPC、サブネット、インターネットゲートウェイなど、ネットワークの基盤となる構成要素について解説しました。

https://qiita.com/ARISA1115/items/c1905d22a03a806f8f1f

今回は、その基盤の上に構築するEC2インスタンスやアプリケーションロードバランサーなど、ウェブサーバーの構成要素についてまとめました。これらの要素を適切に組み合わせることで、障害に強く、トラフィックの増加にも柔軟に対応できるウェブシステムを構築できるようになります。

## なぜAWSウェブサーバーを理解する必要があるのか
クラウドでは、ウェブサービスを物理サーバーなしで提供するために、仮想マシンやロードバランサー、スケーリング機能などを組み合わせて設計する必要があります。これらの仕組みは「目に見えない仮想サーバー」で構成されているため、正しく理解して設計することが重要です。

AWSのウェブサーバー構成を正しく理解することで、次のようなメリットが得られます：
- #### 負荷分散
    - 特定のインスタンス（Webサーバー）に負荷が集中し、サービスが停止する
    リスクを低減できる
- #### 耐障害性
    - サーバーが故障したときのダウンタイムを最小限にできる
- #### 拡張性（スケーラビリティ）
    - サーバーの台数を自動的に増やすことで、トラフィックが急増しても
    遅延（レイテンシ）やエラーが発生しないようにできる
- #### 高可用性
    - 万が一、どこか1つのサーバーや機能に障害が起きても、別のサーバーが
    代わりに動くことで、サービスを止めずに運用を継続できる
    - これにより、「1ヶ所の障害でシステム全体が停止してしまう」という 
**単一障害点（SPOF：Single Point of Failure）** を回避できる

ネットワークと同様に、ウェブサーバーの構成もオンプレミスとは仕組みが異なります。
違いを理解することで、上記のメリットを生かした設計が可能になります。

## オンプレミスとAWSウェブサーバーを比較
オンプレミスとAWSにおけるウェブサーバー構成の対応関係は以下の通りです：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958955/9ddcd72d-aa2c-46f0-9bd3-863b1fcc5051.png)

#### 1. 物理サーバー ⇔ EC2インスタンス
物理サーバーがCPU、メモリ、ストレージなどが物理的に内蔵されているハードウェア機器に対して、EC2インスタンスはクラウド上の仮想サーバーです。

#### 2\. サーバークラスター管理装置 ⇔ オートスケーリンググループ(ASG)
オンプレミス環境では、サーバークラスター管理装置を用いて、事前に設置された物理サーバーを人の手で起動・停止して管理する必要があります。対してAWSのオートスケーリンググループは、トラフィックの増減に応じた自動スケーリングが可能です。

#### 3\. 負荷分散装置 ⇔ アプリケーションロードバランサー（ALB）
オンプレミス環境における負荷分散装置は、リクエストを分散させるための専用ハードウェア機器です。自分で機器を設置し、詳細な設定や管理を行う必要があります。一方、ALBはAWSが提供するマネージドサービスとして、画面上の操作だけで設定できる仮想の負荷分散装置です。

#### 4\. サーバー振り分け設定	 ⇔ ターゲットグループ
オンプレミスでは、負荷分散装置に対してサーバーごとに個別の振り分けルールを設定する必要があります。一方AWSでは、ターゲットグループとしてまとめて管理できるため、設定や運用がより簡単に行えます。

#### 5\. セッション維持機能 ⇔ スティッキーセッション
セッション維持機能は、アプリケーションやブラウザ、サーバー側でユーザーのログイン状態や操作情報を保持するための、全体的な仕組みです。つまり、「状態をどう保持するか」を管理します。一方、AWSのスティッキーセッションは、ALBの機能で、同じユーザーからのリクエストを常に同じサーバーに振り分けることで、セッション情報の維持をサポートする仕組みです。

:::note info
ポイント
- セッション維持機能
    - ユーザーのログイン状態や操作情報など「**何を保持するか**」を管理する
- スティッキーセッション
    - 同じユーザーからのリクエストを「**どのサーバーに送るか**」を制御する
:::

## AWSウェブサーバー構成の全体像
AWSでは、ロードバランサーや自動スケーリングなどの機能がマネージドサービスとして提供されており、画面上の設定や簡単な操作だけで利用を開始できます。そのため、複雑な構成を一から構築せずに、信頼性の高いシステムを効率よく作ることが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958955/766537d5-8a74-4c2e-90bc-689367361967.png)

:::note info
本構成のポイント
- マルチAZ構成により、単一障害点を排除し、高可用性を実現
- IGWを介して外部からのトラフィックを受け取り、ALBがパブリックサブネットでリクエストを処理
- ALBはターゲットグループを通じて、各AZのプライベートサブネット内のEC2にトラフィックを分散
- NATゲートウェイを通じて、EC2からのアウトバウンド通信が可能
- Auto Scaling Groupにより、EC2の台数が自動調整される
:::

## 各ウェブサーバー構成要素

### EC2インスタンス（EC2: Elastic Compute Cloud）
EC2インスタンスは、AWSが提供する仮想サーバーサービスです。
ユーザーは必要なときにコンピューティングリソースを利用し、
必要がなくなれば停止または終了することで、柔軟にリソースを管理できます。
EC2インスタンスは、Webサーバー、アプリケーションサーバー、データベースサーバー
など、さまざまな用途に利用できます。

 #### EC2の構成要素：
- #### インスタンスタイプ
    - CPUやメモリ、ストレージ、ネットワーク性能などを用途に応じて
    選択可能なサーバーのスペック種類

- #### AMI（Amazon Machine Image）
    -  EC2を起動するためのテンプレートとなる仮想マシンのイメージ
  
- #### EBS（Elastic Block Store）
    -  EC2に接続されるストレージ（＝ハードディスクのようなもの）

###  オートスケーリンググループ(ASG：Auto Scaling Group)
EC2の自動スケーリングサービスです。
トラフィックの増減によって、EC2の数（サーバーの台数）を自動的に調整することで、
アプリケーションの可用性を確保します。ASGは、ALBと連携して動作することが多いです。

### アプリケーションロードバランサー(ALB：Application Load Balancer)
ALBは、AWSが提供するロードバランサーサービスの1つです。OSI参照モデルのアプリケーション層（Layer７）で動作し、HTTP/HTTPS通信に特化した負荷分散を行います。つまり、ALBは、URLのパスやリクエストヘッダー、HTTPメソッドなど、HTTP/HTTPSの通信内容を基にして、どのサーバーにリクエストを送るかを決めることができ、適切なサーバーに振り分けます。

### ターゲットグループ（Target Group）
ターゲットグループは、ALBがトラフィックを転送する先のEC2インスタンスやIPアドレスなどの宛先（＝ターゲット）をまとめたグループです。ALBは、受け取ったリクエストの内容に応じて、あらかじめ設定されたターゲットグループにトラフィックをルーティングします。  

### スティッキーセッション（Sticky Session）
スティッキーセッションは、特定のユーザーからのリクエストを常に同じWebサーバーに送信する機能です。ユーザーのセッション情報をEC2のメモリに保存する場合に有効です。

## まとめ
今回はAWSウェブサーバーの構成要素について紹介しました。

- **EC2**：
AWSが提供する仮想サーバーで、Webサーバーやアプリケーションサーバーとして
リクエストの内容に応じた処理を行う

- **ASG（Auto Scaling Group）**：
アクセスの増減に応じて、サーバーの台数を自動で調整する仕組み

- **ALB（Application Load Balancer）**：
ユーザーからのリクエストを複数のサーバーに分散して処理させる負荷分散装置

- **ターゲットグループ**：
ALBがリクエストを振り分ける宛先をまとめたグループ

- **スティッキーセッション**：
同じユーザーからのリクエストを、常に同じサーバーに送る機能

これらの構成要素を適切に組み合わせることで、スケーラブルで可用性の高いウェブシステムを構築できます。

https://docs.aws.amazon.com/

https://aws.amazon.com/jp/ec2/features/?trk=ec2_landing

https://aws.amazon.com/jp/autoscaling/

https://aws.amazon.com/jp/elasticloadbalancing/features/

https://dev.classmethod.jp/articles/configuration-pattern-alb-sticky-sessions-cannot-be-used/

https://dev.classmethod.jp/articles/introduction-to-aws-networking-and-autoscaling-web-server/

https://classmethod.jp/articles/aws-webserver-build/

https://qiita.com/hz1_d/items/ca24e1d131bf475e23b1