目次Category
はじめに
今回AWS技術研修で行った、EC2を使ったWebサーバーの構築、Application Load Balancerによる負荷分散、EC2 Auto Scalingによるインスタンス管理に関してまとめさせていただきます。
主な作業内容は以下のとおりです。
EC2を使ったWebサーバーの構築
ALBを使った負荷分散
EC2 Auto Scalingの実装
今回の内容では、EC2・ALB・Auto Scalingをそれぞれ単体で操作するだけではなく、各サービスがどのように関連してWebシステムを構成しているのかを確認することができます。
記事を作成するにあたって参考とした、DevelopersIOのAWSネットワークとAuto Scalingに関するハンズオン記事も、VPC・EC2・ALB・Auto Scalingを順番に組み合わせる構成となっており、今回の研修内容を整理するうえで参考になりました。
今回の構成
今回作成した構成のイメージは次のとおりです。

VPC内に異なるアベイラビリティーゾーンのサブネットを2つ作成し、それぞれにEC2インスタンスを配置しました。
ALBは利用者からのHTTPリクエストを受け取り、ターゲットグループに登録された正常なEC2インスタンスへリクエストを振り分けます。
ターゲットグループでは、登録されたEC2に対して定期的にヘルスチェックが実行されます。
1. EC2でWebサーバーを構築する
EC2の概要
Amazon EC2は、AWS上に仮想的なサーバーを作成できるサービスです。
用途に合わせてCPUやメモリ、OS、ストレージ、ネットワークなどを設定でき、自由に、素早くリソースを拡張・縮小できます。
ここからは実際の作業手順に入ります。
1-1. VPCの作成
最初に、EC2やALBを配置するネットワークとしてVPCを作成します。
※今回の記事では研修での命名規則に則り、リソース名は”ojt-リソース名-[name]-01”のような形で記載します。
皆様が作成する際は自身で決めたリソース名を使ってください。
AWSコンソールから以下の手順で進みます。
1.検索バーから”VPC”を検索し、押下 (☆マークをクリックしておく)
2.リソースを作成を押下
設定内容は以下のとおりです。
作成方法:VPCのみ 名前:ojt-vpc-[name]-01 IPv4 CIDR:10.0.0.0/24
VPCはAWS上に作成する仮想ネットワークです。
今回作成するサブネット、ルートテーブル、セキュリティグループ、EC2、ALBは、すべてこのVPC内に作成します。
1-2. サブネットの作成
次に、VPC内に2つのサブネットを作成します。
AWSコンソールから以下の手順で進みます。
1.検索バーから”VPC”を検索し、押下 (☆マークをクリックしておく)
2.画面左、”サブネット”を押下
3.画面右上の”サブネットを作成”を押下
設定は以下のとおりです。
サブネット1
名前:ojt-subnet-[name]-01 アベイラビリティーゾーン:例)ap-northeast-1a(利用するリージョン内のAZ) VPC CIDR:10.0.0.0/24 サブネットCIDR:10.0.0.0/28
サブネット2
名前:ojt-subnet-[name]-02 アベイラビリティーゾーン:例)ap-northeast-1c(サブネット1と異なる利用するリージョン内のAZ) VPC CIDR:10.0.0.0/24 サブネットCIDR:10.0.0.16/28
アベイラビリティーゾーンを別々に指定しました。
これによりEC2インスタンスを1か所に集中させず、複数のアベイラビリティーゾーンへ分散できます。
1-3. ルートテーブルの作成
続いて、サブネットの通信経路を制御するルートテーブルを作成します。
AWSコンソールから以下の手順で進みます。
1.検索バーから”VPC”を検索し、押下 (☆マークをクリックしておく)
2.画面左の”ルートテーブル”を押下
3.画面右上の”ルートテーブルを作成”を押下
設定は以下のとおりです。
名前:ojt-rtb-[name]-01 VPC:ojt-vpc-[name]-01
ルートテーブル作成後、先ほど作成した2つのサブネットを関連付けます。
ルートテーブルを作成しただけではサブネットに適用されないため、サブネットとの関連付けを忘れないようにする必要があります。
1-4. ゲートウェイの作成
VPC内のリソースをインターネットと通信させるため、インターネットゲートウェイを作成します。
名前:ojt-igw-[name]-01
インターネットゲートウェイ作成後、次の操作を行います。
1.インターネットゲートウェイをVPCにアタッチする
2.ルートテーブルにインターネット向けの経路を追加する追加したルートは以下のとおりです。
送信先:0.0.0.0/0 ターゲット:ojt-igw-[name]-01
0.0.0.0/0は、VPC内部に定義された経路以外のすべてのIPv4アドレスを表します。
1-5. セキュリティグループの作成
次にEC2やALBへの通信を制御するため、セキュリティグループを作成します。
今回の通信はHTTPの80番ポートを使用しています。
ALBのリスナー、ターゲットグループ、ApacheはいずれもHTTP 80を使用する構成です。
ALB用セキュリティグループ
名前:ojt-sgp-[name]-01 VPC:ojt-vpc-[name]-01
インバウンドルールの例は以下のとおりです。
HTTP / TCP / 80 / マイIP
アクセス元を自分の環境だけに限定する場合は、送信元にマイIPを指定し、一般公開するWebサイトの場合は、HTTPの送信元に0.0.0.0/0を指定します。
EC2用セキュリティグループ
名前:ojt-stg-[name]-02 VPC:ojt-vpc-[name]-01
インバウンドルールの例は以下のとおりです。
HTTP / TCP / 80 / ALB用セキュリティグループ
ICMP / マイIP
SSH / TCP / 22 / Instance Connect用プレフィックスリスト
EC2のHTTP通信については、送信元をマイIPだけにするとALBからEC2へ接続できません。
1-6. 1台目のEC2を起動する
Webサーバーとして使用する1台目のEC2インスタンスを作成しました。
名前:ojt-ec2-[name]-01 AMI:Amazon Linux 2023 インスタンスタイプ:t3.micro パブリックIPの自動割り当て:有効 セキュリティグループ:作成済みのものを選択 キーペア:なしで続行
EC2起動後、EC2 Instance Connectなどを使って接続し、Apacheをインストールします。
※ 以下コードを順に実行してください。
次にテスト用のHTMLファイルも作成します。echo "<h1>Hello World from EC2-01</h1>" \
| sudo tee /var/www/html/index.html
以下のコマンドで、EC2内部からApacheの動作を確認します。
curl http://localhost
Hello World from EC2-01が表示されれば、Apacheが正常に動作していると判断して問題ありません。
1-7. 2台目のEC2を起動する
2台目のEC2では、ユーザーデータを使用してWebサーバーの構築を自動化しました。
基本的な設定は1台目と同じです。
名前:ojt-ec2-[name]-02 AMI:Amazon Linux 2023 インスタンスタイプ:t3.micro パブリックIPの自動割り当て:有効
ユーザーデータには、以下のスクリプトを設定します。
ユーザーデータを利用すると、EC2の初回起動時にスクリプトが自動実行されます。
これでApacheのインストール、サービスの起動、自動起動設定、HTMLファイルの作成を自動化できました。
(番外)負荷分散を確認しやすくする方法
2台のEC2で同じHTMLを表示すると、ブラウザから見ただけではどちらのEC2が応答したのか判断できません。
そのため、実際の負荷分散確認では次のようにホスト名を表示すると分かりやすくなります。
2. ALBで負荷分散する
ALBの概要
Application Load Balancerは、サービスへのHTTP・HTTPSアクセスを複数のサーバーへ振り分けるロードバランサーです。
1台のEC2だけにアクセスが集中するのを防ぎ、正常に動作しているEC2へリクエストを転送します。
2-1. ターゲットグループの作成
最初に、ALBがリクエストを転送するEC2を管理するターゲットグループを作成します。
設定内容は以下のとおりです。
ターゲットタイプ:インスタンス 名前:ojt-tgroup-[name]-01 プロトコル:HTTP ポート:80 IPアドレスタイプ:IPv4 VPC:ojt-vpc-[name]-01 プロトコルバージョン:HTTP1 ヘルスチェックプロトコル:HTTP ヘルスチェックパス:/ オプティマイザー:オフ
設定後、作成した2台のEC2インスタンスにチェックを入れ、「保留中として以下を含める」を選択して登録します。
2-2. Application Load Balancerの作成
続いて、ALBを作成します。
ロードバランサーの種類:Application Load Balancer 名前:ojt-alb-[name]-01 スキーム:インターネット向け IPアドレスタイプ:IPv4 VPC:ojt-vpc-[name]-01 サブネット: ・ojt-subnet-[name]-01 ・ojt-subnet-[name]-02 セキュリティグループ:ojt-sgp-[name]-01 リスナー:HTTP 80 転送先:ojt-tgroup-[name]-01
ALBでは、異なるアベイラビリティーゾーンにある2つのサブネットを選択します。
リスナーはALBがリクエストを受け付ける設定です。
今回はHTTPの80番ポートでリクエストを受け取り、ターゲットグループへ転送するように設定しました。
2-3. 負荷分散の動作確認
ALB作成後、詳細画面に表示されているDNS名をブラウザで開きます。
http://ALBのDNS名
Webページが表示されれば、次の通信経路が正常に動作しています。
ブラウザ → ALB → ターゲットグループ → EC2 → Apache
ホスト名をHTMLに表示する設定を行っている場合は、複数回アクセスすることで、異なるEC2からレスポンスが返されることを確認できます。
ALB構築で発生しやすい問題
ターゲットがunhealthyになった場合は、次の項目を確認します。
・Apacheが起動しているか ・EC2がポート80で待ち受けているか ・/var/www/html/index.htmlが存在するか ・ヘルスチェックパスが正しいか ・ALBからEC2へのHTTP通信が許可されているか ・ALBとEC2が同じVPCに存在するか
EC2内部で次のコマンドを実行し、正常にHTMLが返る場合は、Apacheより前段のネットワーク設定に問題がある可能性があります。
curl http://localhost
3. EC2 Auto Scalingを実装する
Auto Scalingの概要
EC2 Auto Scalingはシステムへのアクセス量やサーバー負荷などに応じて、EC2インスタンスの台数を調整する仕組みです。
Auto Scalingグループでは、最低限維持する台数、通常時の台数、最大台数を設定できます。また、スケーリングポリシーを設定することで、負荷に応じたインスタンス数の増減も可能です。
3-1. 起動テンプレートの作成
Auto ScalingでEC2を起動するには、どのような設定のインスタンスを作成するかを定義する必要があります。
今回は、作成済みのEC2インスタンスから起動テンプレートを作成しました。
EC2の管理画面で対象のインスタンスを選択し、次の順に操作します。
インスタンスを選択
↓
アクション
↓
イメージとテンプレート
↓
インスタンスからテンプレートを作成
設定する名前と説明は次のとおりです。
名前:ojt-template-[name]-01 説明:ojt-template-[name]-01
起動テンプレートには、次のような情報が含まれます。
・AMI
・インスタンスタイプ
・セキュリティグループ
・ストレージ
・キーペア
・ユーザーデータ
起動テンプレートにはバージョンがあり、更新時にはAuto Scalingグループがどのバージョンを参照しているか確認する必要があります。
3-2. Auto Scalingグループの作成
作成した起動テンプレートを使用して、Auto Scalingグループを作成していきます。
主な設定内容は以下のとおりです。
Auto Scalingグループ名:ojt-asg-[name]-01 起動テンプレート:ojt-template-[name]-01 VPC:ojt-vpc-[name]-01 サブネット: ・ojt-subnet-[name]-01 ・ojt-subnet-[name]-02 ロードバランサー:既存のターゲットグループにアタッチ ターゲットグループ:ojt-tgroup-[name]-01
容量については、研修で指定された最小容量、希望する容量、最大容量を設定します。
最小キャパシティ:最低限維持するEC2の台数
希望するキャパシティ:現在起動しておくEC2の台数
最大キャパシティ:増やすことができるEC2の上限
ALBのターゲットとしてAuto Scalingグループを関連付ける場合は、ALB側でEC2を1台ずつ登録するのではなく、Auto Scalingグループ側でターゲットグループを設定します。
この関連付けにより、Auto Scalingで新しく作成されたEC2は自動的にターゲットグループへ登録されます。
3-3. Auto Scalingの動作確認
今回は、Auto Scalingグループの希望する容量を変更することで、EC2が自動的に増減する動作を確認します。
希望する容量を2台から3台に変更すると、起動テンプレートの設定をもとに新しいEC2が起動します。
確認したポイントは以下のとおりです。
・指定した数のEC2が自動的に起動したか
・異なるサブネットにEC2が配置されたか
・新しいEC2がターゲットグループへ登録されたか
・ヘルスチェックがhealthyになったか
・ALB経由でWebページを表示できるか
その後希望する容量を元の値に戻すと、余分なEC2が自動的に終了します。
まとめ
AWS研修2日目では、EC2、ALB、EC2 Auto Scalingを組み合わせたWebサーバー環境を構築しました。
今回実施した内容は以下のとおりです。
・VPC、サブネット、ルートテーブルの作成
・インターネットゲートウェイの設定
・EC2上へのApache Webサーバー構築
・ユーザーデータを使った構築の自動化
・ターゲットグループの作成
・ALBによる複数EC2への負荷分散
・起動テンプレートの作成
・Auto ScalingによるEC2台数の管理
・パブリックIPを使用しないEC2接続方法の確認
今回の研修を通して、各サービスの設定項目だけではなく、利用者からEC2までの通信経路を意識することが重要だと学びました。
利用者
↓
Internet Gateway
↓
ALB
↓
ターゲットグループ
↓
セキュリティグループ
↓
EC2
Webページが表示されない場合も、Apache、EC2、セキュリティグループ、ターゲットグループ、ALBという順番で確認することで、問題が発生している場所を切り分けやすくなりました。
参考にしたDevelopersIOの記事
「Application Load Balancerを経由してAmazon EC2上のWebページにアクセスする設定をまとめてみた」
https://dev.classmethod.jp/articles/access-apache-page-via-alb/「[入門] AWSのネットワークとAutoScalingなWebサーバーを作るハンズオンを作りました」
https://dev.classmethod.jp/articles/introduction-to-aws-networking-and-autoscaling-web-server/?utm_source=chatgpt.com「ALBのターゲットにEC2 Auto Scaling Groupを設定する方法」
https://dev.classmethod.jp/articles/alb-ec2-auto-scaling-group/?utm_source=chatgpt.com「EC2 Instance Connect エンドポイント登場!踏み台サーバー不要でパブリックIPのないEC2にSSH・RDPできるようになりました」
https://dev.classmethod.jp/articles/ec2-instance-connect-endpoint-private-access/?utm_source=chatgpt.com「EC2 Instance Connect EndpointとSession Managerの違いを整理してみた」
https://dev.classmethod.jp/articles/compare-eic-endpoint-and-session-manager/?utm_source=chatgpt.com
同じカテゴリーの記事
同じカテゴリの記事を読む