AWS EC2にALBを導入し、Webサーバーのロードバランシングを実現する手順

インフラ

こんにちは。Enjoy IT Life管理人の仁科(@nishina555)です。

今回はロードバランサーを利用したWebサーバーをAWS環境に構築する手順について紹介します。
具体的にはALB(Application Load Balancer)とEC2の連携方法について説明します。

今回のゴール
  • ALBの概要について理解する
  • ALBとEC2の連携方法について理解する
  • ALBを利用したWebサーバーにアクセスできる

今回作成するAWS環境

今回作成するAWS環境のイメージ図は以下の通りです。

補足説明は以下の通りです。

  • パブリックサブネットにEC2(踏み台サーバー用)とNAT Gatewayを配置
  • プライベートサブネットにEC2(Webサーバー用)を配置
  • WebサーバーへのSSH接続は踏み台サーバー経由で行う
  • WebサーバーへのHTTPアクセスはALB経由で行う
  • NAT Gateway経由でWebサーバーからインターネットへのアウトバウンド通信(yumコマンドなど)を実現する

事前準備: ロードバランシング対象のEC2インスタンスを作成する

ALBを導入する前に、まずはALBのロードバランシング対象のWebサーバーを作成します。

ALBを利用する場合HTTPアクセスはALB経由で行われるため、Webサーバーは直接インターネットとつながっている必要はありません。
そこで今回はプライベートサブネットにEC2を配置します。

今回は『踏み台サーバーとNAT Gatewayを利用したセキュアなAWS EC2環境構築手順』の記事で紹介している環境が既に構築されている前提で話を進めます。

踏み台サーバーとNAT Gatewayを利用したセキュアなAWS EC2環境構築手順

2020年6月1日

EC2を含む、検証用VPCの構築手順については上記の記事を参考にしてください。

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

セキュリティグループとはグループ外との通信を制御するためのファイアウォールです。『インバウンド』と『アウトバウンド』の制御をすることができます。

ALBを作成する過程でセキュリティグループが必要になるため、まずはセキュリティグループの準備を行います。

『VPCダッシュボード』を開き、『セキュリティグループ』→『セキュリティグループを作成』を選択します。

必要事項を入力し、『セキュリティグループを作成』を選択します。

各項目の意味は以下の通りです。

  • セキュリティグループ名: セキュリティグループの識別子
  • 説明: セキュリティグループの説明
  • VPC: セキュリティグループ作成対象のVPC
  • インバウンドルール: 外からの通信に対するルール
  • アウトバウンドルール: 外への通信に対するルール

今回はALB用のセキュリティグループのため、インバウンドルールで任意のアクセス元からのHTTPとHTTPSの許可を設定しました。
セキュリティグループ名はsample-albとし、今回利用するVPCsample-devで利用できるように設定しました。

ターゲットグループの作成をする

ターゲットグループとはロードバランシング対象のEC2インスタンス郡の総称です。
ALBの作成をする過程でターゲットグループを設定する必要があるため、まずはターゲットグループを事前に作成しておきます。

AWSマネージメントコンソールでEC2を選択します。

『EC2ダッシュボード』を開き、『ターゲットグループ』→『ターゲットグループの作成』を選択します。

必要事項を入力し、『作成』を選択します。
プロトコルは『HTTP』、ポートは『80』、ターゲットの種類は『インスタンス』にします。

ターゲットグループ名をsample-webとし、今回利用するsample-devという名前のVPCで利用できるように設定しました。

ターゲットグループにEC2を紐づける

先ほど作成したターゲットグループをチェックし、『ターゲット』タブの『編集』を選択します。

ターゲットグループに紐づけるEC2にチェックをし、『登録済みに追加』を選択します。
今回はsample-webという名前のEC2を追加しました。

登録後、『保存』を選択します。

ALBを作成する

AWSのロードバランサー機能を提供するサービスはELB(Elastic Load Balancing)と呼ばれています。
ロードバランサーを利用することでサーバーの負荷分散やサーバーの台数増強ができるようになります。

今回はELBのうち、もっともポピュラーなALB(Application Load Balancer)を利用したいと思います。
なお、2020年6月現在、ELBにはALBのほか、CLB(Classic Load Balancer、ALB登場前の旧ELB)とNLB(Network Load Balancer)があります。
ELBの詳細および各種ロードバランサーの違いについてはAWS『Elastic Load Balancing の特徴』をご覧ください。

『EC2ダッシュボード』を開き、『ロードバランサー』→『ロードバランサーの作成』を選択します。

『Application Load Balancer』の『作成』を選択します。

スキームは『インターネット向け』、IPアドレスタイプは『ipv4』とします。

リスナーのプロトコルは『HTTP』を追加します。

ここで注意点があります。
ALBを配置する際は2つ以上のアベイラビリティゾーンからサブネットを指定する必要があります。
VPC内のサブネットが1箇所のアベイラビリティゾーンのみで構成されている場合は、異なるアベイラビリティゾーンのサブネットを作成してください。

サブネットの作成方法は【AWS環境構築手順】VPCとEC2を作成し、実際にアクセスしてみるの『サブネットを作成する』の項目を参考にしてください。

セキュリティグループは『既存のセキュリティグループを選択する』をチェックし、事前に作成したsample-albを選択してください。

ルーティングの設定については、ターゲットグループは『既存のターゲットグループ』、名前は先ほど作成したsample-webを選択します。

Webサーバー(EC2)のセキュリティグループを編集

ALB経由からのHTTPアクセスを許可するようにWebサーバーのセキュリティグループを編集します。

Webサーバーのセキュリティグループの『インバウンドルール』にALBのセキュリティグループからのHTTP通信を許可する設定を追加します。

動作確認

ここまでで冒頭で紹介したAWSの環境を構築することができました。

ここからは実際にALB経由でWebサーバーにアクセスできるか確認をしていきます。

事前準備: EC2にnginxをインストールする

動作検証をする前にまずはプライベートサブネットに配置したEC2にnginxをインストールし、Webサーバーとして稼働できるようにします。

SSHでEC2にログイン後、以下のコマンドでnginxをインストールを行います。

### yumの更新
$ sudo yum update

### extrasで提供されているnginxの確認
$ amazon-linux-extras | grep nginx

38 nginx1 available [ =stable ]

### extrasからnginxをインストール
$ sudo amazon-linux-extras install nginx1

### バージョンの確認
$ nginx -v
→ バージョンが表示されていればOK

nginx version: nginx/1.16.1

### 起動
$ sudo systemctl start nginx

### プロセス確認
$ ps -ef |grep nginx
→ nginxのプロセスが実行されていればOK

root 22032 1 0 15:16 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 22034 22032 0 15:16 ? 00:00:00 nginx: worker process
ec2-user 22036 3738 0 15:16 pts/0 00:00:00 grep --color=auto nginx

### (必要であれば) 自動起動設定
$ sudo systemctl enable nginx

ALBのDNS名でアクセスできるか確認する

ALBのDNS名はALBの詳細で確認できます。

http://[DNS名]でアクセスし、ブラウザに以下の画面が表示されればOKです。

まとめ

以上でALBを利用したWebサーバー環境の構築手順について紹介を終わります。

今回のまとめ
  • ALBを利用することでサーバーの負荷分散やサーバーの台数増強ができるようになる
  • ALBを作成する際は2つ以上のアベイラビリティゾーンからサブネットを指定する必要がある
  • ALBのターゲットグループにEC2を登録することでALBとEC2の連携が可能になる
  • ALBを利用する場合、EC2のインバウンドアクセスでALBからのHTTP(S)が許可されていることを確認する

この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!