nginxでオートスケールする方法

はじめに

AWSやGCPやAzureなどには、オートスケーリング機能というものがあり、サーバーを増やすと自動的にロードバランサーのメンバーに追加してくれる機能が提供されています。
しかしながら、nginx にはオートスケーリングの機能がありません。

この方法を考えてみます。

方法

パターン① NGINX PLUS

これが本命です。

nginx の有料版「NGINX Plus」には WebAPI が提供されており、この API を使用してメンバーの追加・削除を行うことができます。
ドキュメントを読む限り使用方法も簡単で、HTTP のリクエストを送信するだけで使用できます。

curl -X POST -d '{ \
   "server": "10.0.0.1:8089", \
   "weight": 4, \
   "max_conns": 0, \
   "max_fails": 0, \
   "fail_timeout": "10s", \
   "slow_start": "10s", \
   "backup": true, \
   "down": true \
 }' -s 'http://127.0.0.1/api/9/http/upstreams/appservers/servers'

詳細は以下参照。

Dynamic Configuration of Upstreams with the NGINX Plus API | NGINX Documentation
Dynamically reconfigure the servers in an F5 NGINX Plus upstream group using the NGINX Plus API, without reloading configuration or restarting processes.

しかし、問題は価格です。

NGINX Plus は、古い情報によると約 1350ドル/年 のため、年間20万円ほどの料金となります。高い!
現在は、F5 Networks に買収されたため、価格は AWS のマーケットプレイスによると約 3500ドル/年のため、年間50万円ほどが現在の価格のようです。高い!
安く購入する方法もあるのかもしれませんが、どちらにしてもまぁまぁ高いです。

AWS Marketplace: NGINX, Inc.

オートスケーリングを使用するようなサービスレベルであれば価格としては妥当かもしれませんが、私のような個人で使っている人には厳しいものがあります。

パターン② DNSを使用する方法

次点の候補です。

NGINX には、DNS で IP アドレスを取得する機能があり、これを使用して分散先を自動的に適用することができるようです。
つまり、サーバーが増えたらDNSに追加し、サーバーが減ったらDNSから削除することで、オートスケーリングを実現できる、というものです。

location / {
        resolver 172.43.1.2 valid=10s;
        set $backend https://demo-app.com$uri$is_args$args;
        proxy_pass $backend;
        include proxy_params;
    }


Wallarm Documentation - Dynamic DNS Resolution in NGINX
If the domain name is passed in the proxy_pass directive of the NGINX configuration file, then NGINX resolves the IP address of the host only once after the sta...

デメリットは、DNS サーバーの維持管理が必要な点と、DNS への反映部分は別途実装する必要があります。
特に前者は重要で、DNS サーバーがダウンすると通信の分配が行えなくなる可能性があります。

AWS の Route53 など、高可用性+API機能を持った DNS サービスと組み合わせるといいと思います。

パターン③ 自作

APIを自作するという方法もあると思います。
しかし、Githubを調べてみた限り、同様のことをやっている方は居なかったので、あまりメジャーではないようです。

パターン④ アプライアンスLBの仮想版

NGINX ではなくなりますが、ロードバランサーが必要な場合は、F5 Networks や A10 Networks のロードバランサーの仮想マシン向けエディションを使用する方法もあります。
どちらも API 機能が標準で実装されていたはずです。

お値段も NGINX Plus とそれほど差はありません。F5に至ってはNGINX Plus より安いくらいです。通信量の制限はありますが。

F5 Networks BIG-IP Virtual Edition 200Mbps $2964/年
A10 Networks vThunder 100Mbps $5466/年

AWS Marketplace: F5 BIG-IP Virtual Edition - GOOD (PAYG, 200Mbps)
The BIG-IP Virtual Edition (VE) is the industry's most trusted and comprehensive app delivery and security solution. Providing everything from intelligent traff...

結論

結論として、私は手動のままにしておこうと思います。
今のところサーバー台数は10台ほどのため、年間50万円もかけられないためです。

ただ、さらにサーバーが増えるようであれば NGINX Plus の購入も検討しようと思います。
Active Health Check も便利ですしね。

参考

Can Nginx automatically update the upstream servers details without Nginx reload
I am seeing nginx upstream as follows upstream entities { server entities.qa.local:8888; } upstream workflow { server workflow.qa.local:9999; } Some ti...
How to automatically update nginx upstream server list when aws ec2 hostname changes or increases?
I want to setup autoscaling in AWS. I don't want to use Elastic Load Balancer. Autoscalling in Amazon creates EC2 instances seamlessly during demand spikes to ...

コメント

タイトルとURLをコピーしました