Elastic IPを使用したAWSでのNGINX Plusのアクティブ・パッシブのHA構成設定について
AWS上でのNGINX Plusの冗長構成について、HA機能およびElastic IPを利用して実現できるか検証を行いました。
はじめに
お客様からNGINX PlusはHA機能でリバースプロキシの冗長ができるか?というご質問をいただきました。F5社のWebページを確認して実現が可能であることが分かりましたので、動作確認をすることにしました。naraiさんがオンプレミスでのHA機能を確認することにりましたので、私はAWSでのElastic IPを利用したHA機能(アクティブ・パッシブ)の動作確認を行いました。
naraiさんの記事はこちらです
検証環境
AWSの機能を用いて確認するので、AWS上で検証環境を構築しました。
使用したAWSサービスは以下の三種類です。
IAM
HAを動かすためのスクリプトからAPIアクセスするためのロールおよびポリシーを作成
EC2
NGINX PlusをインストールするUbuntuサーバーを2インスタンスデプロイ
Webページを表示するためのWebサーバーとしてUbuntuサーバーを1インスタンスデプロイ
Elastic IPを一つ払い出す
VPC
プライベートネットワーク間通信用にネットワークを作成
作成した検証環境の構成図も描いたので載せておきます。
動作確認したいこと
1. NGINX01、NGINX02間でkeepalivedのやり取りができMaster、Backupが組めていること
2.クライアントPCからElastic IPに向けてコンテンツを要求し以下のとおりであることを確認する
正常時
MasterとなるNGINX01がリクエストに対しProxyを実行しWebサーバーのコンテンツを返すこと
障害時
NGINX01に障害を起こし、Elastic IPがBackupのNGINX02に割り当てられていることを確認し、
NGINX02がProxyを実行しWebサーバーのコンテンツを返すこと
復旧時
NGINX01を復旧させNGINX02に割り当てられていたElastic IP がNGINX01に割り当てられること
実際の流れ
F5社の下記ページを参考に検証を進めました。
https://docs.nginx.com/nginx/deployment-guides/amazon-web-services/high-availability-keepalived/
Step 1 – Launch Two NGINX Plus Instances
EC2にてNGINX Plusを2インスタンスデプロイ
IAMで以下の内容のポリシーを作成(JSON形式で作成)
- IAMでロールを作成し、以下のように選択する
(今回はHA-Testというロール名にした)信頼されたエンティティタイプ AWS のサービス ユースケース EC2 許可ポリシー 作成したポリシーを追加
作成したIAMロールをEC2インスタンスにアタッチする
Step 2 – Allocate an Elastic IP Address
NGINX01に対してElastic IPを割り当てる
Step 3 – Install keepalived, wget, and the AWS CLI
NGINX01、NGINX02にkeepalivedパッケージを下記コマンドでインストールする
$ sudo apt-get install keepalived wget
NGINX01、NGINX02にAWS CLIを下記コマンドでインストールする
$ sudo apt install zip
$ sudo curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ sudo unzip awscliv2.zip
$ sudo ./aws/install
$ aws --version
Step 4 – Download the HA Scripts
NGINX01、NGINX02にスクリプトを格納するディレクトリを作成する
$ sudo mkdir -p /usr/lib/keepalived
NGINX01、NGINX02にGitHubからnginx-ha-checkとnginx-ha-notifyというスクリプトをダウンロードする
$ cd /usr/lib/keepalived
$ sudo git clone https://github.com/nginxinc/aws-ha-elastic-ip.git
スクリプトファイルの格納先を下記コマンドで移動する
$ cd /usr/lib/keepalived/aws-ha-elastic-ip
$ sudo mv nginx-ha-check* nginx-ha-notify* /usr/lib/keepalived/
Step 5 – Configure keepalived and the HA Scripts
/etc/keepalivedにkeepalived.confを作成する
$ cd /etc/keepalived
$ vi keepalived.conf
nginx-ha-notifyスクリプトの値を編集
$ cd /usr/lib/keepalived
$ vi nginx-ha-notify
Testing
- NGINX01、NGINX02でkeepalivedデーモンを以下のコマンドでスタートさせる
$ sudo service keepalived start
- nginx-ha-keepalivedのステータスを以下のコマンドで確認し、NGINX01の結果がSTATE=MASTERであること、NGINX02でSTATE=BACKUPであることを確認する
$ sudo cat /var/run/nginx-ha-keepalived.state
- NGINX01に割り当てているElastic IPに対してHTTPアクセスを実行し正常にアクセスできることを確認する
-
NGINX01で以下のコマンドを実行し、NGINX02をMASTERに昇格させる
$ sudo service keepalived stop
-
nginx-ha-keepalivedのステータスを以下のコマンドで確認し、NGINX01の結果がSTATE=BACKUPであること、NGINX02でSTATE=MASTERであることを確認する
$ sudo cat /var/run/nginx-ha-keepalived.state
- NGINX01に割り当てていたElastic IPがNGINX02に割り当てられていることを確認する
- NGINX02に割り当てられたElastic IPに対してHTTPアクセスを実行し正常にアクセスできることを確認する
-
NGINX01にて以下のコマンドを実行し、正常時に戻す
$ sudo service keepalived start
-
nginx-ha-keepalivedのステータスを以下のコマンドで確認し、NGINX01の結果がSTATE=MASTERであること、NGINX02でSTATE=BACKUPであることを確認する
$ sudo cat /var/run/nginx-ha-keepalived.state
-
NGINX01に割り当てているElastic IPに対してHTTPアクセスを実行し正常にアクセスできることを確認する
ここまでで、正常時の動作・障害時の動作・復旧時の動作までの確認ができましたので切り替わり時間も見ていきました。
クライアント端末からの連続PingとNGINX01、02のSyslogメッセージのタイムスタンプを確認しながら、3回ほど障害・復旧を試したところ切り替わりは5秒以内に収まっていること確認ができました。
詳細な切り替わり時間に関してはkeepalived.conf内にあるinterval、weightの値を変更することでチューニングができるようです。
また、今回参考にした手順ではkeepalivedをコマンドで停止させることで切り替わりを行っていましたがEC2インスタンスの停止やNGINX Serviceを停止することでも切り替わりますのでご安心ください。
まとめ
複数の機能・サービスを用いることでAWS上でも問題なくNGINX PlusのHAが組めることの確認ができました。
今回は同一アベイラビリティゾーンで動作確認をしましたが、同一リージョン内であればElastic IPの付け替えは可能ですのでAZ1とAZ2などとアベイラビリティゾーンを分けてインスタンスをデプロイすることでアベイラビリティゾーン障害にも対応することができそうです。
また、今回はアクティブ・パッシブでのHA構成でしたがAWS Network Load Balancerを利用することでアクティブ・アクティブのHA構成も組めるようなので今後はそちらの動作確認も進めたいと思います。