ネットワーク

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に割り当てられること

 
3. ダウンタイム計測(障害時、復旧時)

 

実際の流れ


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

  1. NGINX01、NGINX02でkeepalivedデーモンを以下のコマンドでスタートさせる
    $ sudo service keepalived start
  2. nginx-ha-keepalivedのステータスを以下のコマンドで確認し、NGINX01の結果がSTATE=MASTERであること、NGINX02でSTATE=BACKUPであることを確認する
    $ sudo cat /var/run/nginx-ha-keepalived.state
  3. NGINX01に割り当てているElastic IPに対してHTTPアクセスを実行し正常にアクセスできることを確認する

  1. NGINX01で以下のコマンドを実行し、NGINX02をMASTERに昇格させる
    $ sudo service keepalived stop

  2. nginx-ha-keepalivedのステータスを以下のコマンドで確認し、NGINX01の結果がSTATE=BACKUPであること、NGINX02でSTATE=MASTERであることを確認する
    $ sudo cat /var/run/nginx-ha-keepalived.state

  3. NGINX01に割り当てていたElastic IPがNGINX02に割り当てられていることを確認する
  4. NGINX02に割り当てられたElastic IPに対してHTTPアクセスを実行し正常にアクセスできることを確認する
  5. NGINX01にて以下のコマンドを実行し、正常時に戻す
    $ sudo service keepalived start

  6. nginx-ha-keepalivedのステータスを以下のコマンドで確認し、NGINX01の結果がSTATE=MASTERであること、NGINX02でSTATE=BACKUPであることを確認する
    $ sudo cat /var/run/nginx-ha-keepalived.state

  7. NGINX02に割り当てていたElastic IPがNGINX01に割り当てられていることを確認する

  8. 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構成も組めるようなので今後はそちらの動作確認も進めたいと思います。

 

お問い合わせ

この記事に関連する製品・サービス

この記事に関連する記事