Application Load Balancerを経由してAmazon EC2上のWebページにアクセスする設定をまとめてみた

Application Load Balancerを経由して、Amazon EC2上のcApache HTTP ServerでホスティングされているWebページに接続してみます。
2024.03.26

Application Load Balancer経由でApache HTTP Serverのページにアクセスしたい

おのやんです。

みなさん、Application Load Balancer(以下、ALB)から、Apache HTTP Server(以下、Apache)上のWebページにアクセスしたいと思ったことはありませんか?私はあります。

AWS上でWebサーバーを構築する際のパターンとして、EC2インスタンス上でWebサーバーをホスティングする方法があります。この際、一般的にはEC2をパブリックに晒すのではなく、プライベートサブネットにEC2インスタンスを配置した上で、インターネットとEC2インスタンスの間にALBを配置する構成を取ることが多いです。この際、ApacheのWebサーバーから見られるWebページを、ALBから閲覧できるか確認する機会がありました。

ということで、今回はEC2インスタンス、ALB、Apacheを設定して、Webページにアクセスしてみようと思います。

AWS構成

今回は、マルチAZのサブネットに配置した2台のEC2インスタンスにそれぞれApacheをインストールします、それぞれのインスタンスに2種類のページを用意して、パスパターンによるルーティングを行います。

この構成をこちらに示します。VPCやSSM用のエンドポイント(参考ブログ)など、ネットワーク関連のリソースはあらかじめ構築してあるものとして進めていきます。

セキュリティグループの作成

まずは、セキュリティグループを作成します。これらは先ほどの構成図では省略していましたが、EC2インスタンスとALBにアタッチするセキュリティグループになります。

例として、ALB用のセキュリティグループをマネジメントコンソール上で作成します。セキュリティグループ名はaws-test-alb-sgで、インバウンドルールにインターネットから80番ポートへのTCP通信(HTTP通信)を許可します。また、VPCは既存のものを使用します。

同様にEC2用のセキュリティグループも作成します。こちらの名前はaws-test-ec2-sgとし、インバウンドルールにALB用セキュリティグループ(aws-test-alb-sg)から80番ポートへのTCP通信(HTTP通信)を許可します。

こちらのセキュリティグループは、両方のEC2インスタンスで使用しますので、作成するのは1個で問題ありません。

セキュリティグループ上で表示名を整えて、こちらのように2つのセキュリティグループが作成できたら完了です。

IAMロールの作成

次に、EC2インスタンスプロファイルとして設定するIAMロールを作成します。具体的には、EC2インスタンスに対してSSM経由で接続できるよう許可します。

IAMロール作成画面では、最初に信頼するエンティティを選択します。今回はEC2インスタンスプロファイルとして設定するため、EC2を選択します。

今回追加するIAMポリシーはAmazonSSMManagedInstanceCoreです。

今回作成するIAMロールの名前はaws-test-ec2-roleに設定しておきます。

このようにIAMロールを作成できたら完了です。

EC2インスタンスの作成

次にEC2インスタンスを2台作成します。1つ目に作成するEC2インスタンスはaws-test-primary-ec2という名前にしておきます。また、OSはAmazon Linux 2023にしておきましょう。

今回は検証用途ということで、インスタンスタイプはt2.microに設定しておきます。またSSM経由で接続するため、キーペアはなしで大丈夫です。セキュリティグループは、先ほど作成したaws-test-ec2-sgを選択しておきます。こちらの画面では自動で設定されていましたが、サブネットはap-northeast-1aのプライベートサブネットを選択しておきます。

IANインスタンスプロファイルに関しては、高度な詳細の項目より設定できます。これらの設定が完了したら、EC2インスタンスを作成します。

2つ目に作成するEC2インスタンスは基本的にスペックは同じです。名前はaws-test-secondary-ec2に、サブネットはap-northeast-1cのプライベートサブネットを選択しておきましょう。

Apacheの設定

次に、それぞれのインスタンスでApacheを設定します。まずはEC2インスタンスに対してSSMなどを経由して接続します。このEC2インスタンス内で、以下のコマンドを実行してApacheをインストール・起動します。

$ sudo yum update -y
$ sudo yum install -y httpd
$ sudo systemctl start httpd

こちらが完了したら、ローカルホストにリクエストを送信して、Webサーバーが起動していることを確認します。curlコマンドをこのように実行して、Apacheのデフォルトページが返ってくれば、正常にWebサーバーが起動していることが確認できます。

$ curl http://localhost
<html><body><h1>It works!</h1></body></html>

ここからは、2つのEC2インスタンスでそれぞれ異なる設定を行います。

aws-test-primary-ec2の方では、Apacheのドキュメントルートである/var/www/htmlの直下に/primary/index.htmlを作成します。

$ sudo mkdir /var/www/html/primary/
$ sudo touch /var/www/html/primary/index.html

/var/www/html/primary/index.htmlには、簡単なHTMLを記述しておきましょう。

/primary/index.html

<h1>About</h1>
This is a primary page!

こちらのパスにリクエストを送って、先ほど設定したHTMLのレスポンスが返ってくればOKです。

$ curl http://localhost/primary/index.html
<h1>About</h1>
This is a primary page!

aws-test-secondary-ec2の方では、Apacheのドキュメントルートである/var/www/htmlの直下に/secondary/index.htmlを作成します。

$ sudo mkdir /var/www/html/secondary/
$ sudo touch /var/www/html/secondary/index.html

/var/www/html/secondary/index.htmlにも、簡単なHTMLを記述しておきましょう。

/secondary/index.html

<h1>About</h1>
This is a secondary page!

こちらのパスにリクエストを送って、先ほど設定したHTMLのレスポンスが返ってくればOKです。

$ curl http://localhost/secondary/index.html
<h1>About</h1>
This is a secondary page!

ターゲットグループの作成

ALBを設定するためにはターゲットグループが必要ですので、こちらを作成します。作成するターゲットグループは、aws-test-primary-tgaws-test-secondary-tgの2つです。

まずはaws-test-primary-tgを作成します。ターゲットタイプはインスタンス、プロトコルとポートはそれぞれHTTPと80を設定しておきます。

IPアドレスはデフォルトのIPv4、VPCは既存のものを選択しておきます。またプロトコルのバージョンはHTTP1を設定します。

今回はApacheのドキュメントルート直下の/primary/index.htmlにアクセスしたいので、ヘルスチェックでもこちらの値を設定します。

ALBはターゲットグループ単位でルーティングを行うため、ターゲットとしてaws-test-primary-ec2のみを選択しましょう。

「保留中として以下を含める」ボタンを押下したら、下のターゲット確認画面にaws-test-primary-ec2が表示されますので、こちらを確認したのちターゲットグループを作成します。

同様にaws-test-secondary-tgも作成して、こちらの手順は完了です。

ALBの作成

ターゲットグループの作成が完了しましたので、続いてALBも作成していきます。ALBの名前は、今回はaws-test-albで設定します。またスキームはインターネット向け、IPアドレスタイプはターゲットグループ同様IPv4に設定しておきます。

ALBを設置するVPCは既存のものを選択し、サブネットはそれぞれのAZのパブリックサブネットを選択しておきます。

セキュリティグループは、先ほど作成したaws-test-alb-sgを選択します。

リスナーとルーティングに関しては後から変更しますので、いったんHTTP:80のリスナーに対するデフォルトアクションとして、aws-test-primary-tgを選択しておきます。これらを設定したら、ALBを作成します。

次に、ALB詳細画面の「リスナーとルール」タブを選択します。ここの「HTTP:80」を押下して、リスナールール詳細画面に移動します。

このリスナールールのうち「デフォルト」のルールを選択し、「ルールの編集」を選択します。

ここで、先ほど設定したデフォルトアクションを変更します。アクションのルーティングに関しては固定レスポンスを指定し、コードは404、コンテンツタイプはtest/plain、レスポンス本文として"Not found..."と設定しておきましょう。これらを設定できたら、変更内容を保存します。

このようにデフォルトアクションを変更できたら、次にaws-test-primary-tgaws-test-secondary-tgにルーティングするルールを追加します。リスナールールの画面から「ルールを追加する」を押下します。

リスナールールに設定する条件として、今回は「パス」を選択します。Apacheで作成したディレクトリ・ファイルに合わせて、今回は/primary/primary/*のパターンを設定します。

ターゲットグループはaws-test-primary-tgを選択しておきます。

今回は優先度は1にしておきましょう。これらの設定が完了したら、リスナールールを作成します。

同様に、/secondaryと/secondary/*のパスに対してaws-test-secondary-tgにルーティングするリスナールールも追加しておきます。

接続確認

以上の作業が終われば、Apacheのページに接続できるはずです。こちらのALBのDNS名をブラウザに打ち込んでみましょう。

最初にアクセスした場合、/primary/secondaryのパスのどれにも一致していないので、ALBの固定レスポンスが帰ってきます。

/primary/index.htmlに接続すると、aws-test-primary-ec2で設定したページが表示されます。

同様に、/secondary/index.htmlに接続すると、aws-test-secondary-ec2で設定したページが表示されます。

存在しないパスにアクセスすると、こちらもパスのパターンに一致しないため、固定レスポンスが返されます。

ALBを経由してWebページにアクセスできた

EC2やALBなどのリソースを作成して、EC2上のWebページにアクセスしてみました。またALBでルーティングの設定を行い、パスによって表示されるページを変えてみました。

EC2上でWebサーバーをホスティングするなどで、こちらの記事が参考になれば幸いです。では!