AWS ELB の動的 IP に対応した nginx 設定方法

AWS ELB の動的 IP に対応した nginx 設定方法

岩佐 孝浩
岩佐 孝浩
4 min read
ELB

はじめに

AWS Elastic Load Balancer (ELB) や同様のサービスは、動的 IP アドレス に解決されるため、nginx の DNS キャッシュを適切に設定することが重要です。この問題を無視すると、nginx が古い IP を使い続けることになり、さまざまな問題が発生します。本記事では、nginx の DNS キャッシュの TTL を短縮する方法を解説します。

なぜ DNS キャッシュが重要か

Elastic Load Balancer は同じ DNS 名に対して異なる IP アドレスを返すことがあり、この場合 DNS キャッシュ は問題を引き起こします。nginx はデフォルトで DNS 解決を無期限にキャッシュするため、新しい IP に解決されても古い IP にトラフィックを送る可能性があります。

一般的な nginx 設定と DNS キャッシュの問題

以下の nginx.conf は、DNS キャッシュを考慮しない標準的な設定例です。この設定では ELB の IP アドレスが変わると問題が発生します。

location / {
    proxy_set_header Host                   $host;
    proxy_set_header X-Real-IP              $remote_addr;
    proxy_set_header X-Forwarded-Host       $host;
    proxy_set_header X-Forwarded-Server     $host;
    proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
    proxy_pass http://internal-xxx-alb-1234567890.ap-northeast-1.elb.amazonaws.com;
}

この問題は、nginx が解決済みの IP を無期限に保持し、DNS が新しい IP を返しても更新されないことに起因します。

nginx 設定を調整して DNS キャッシュの TTL を短縮する

この問題を解決するには、DNS リゾルバ を明示的に定義し、キャッシュ TTL を短縮する必要があります。以下は修正後の nginx.conf の例です。

location / {
    # キャッシュ TTL を短縮する設定
    resolver 192.168.0.2 valid=60s;
    proxy_set_header Host                   $host;
    proxy_set_header X-Real-IP              $remote_addr;
    proxy_set_header X-Forwarded-Host       $host;
    proxy_set_header X-Forwarded-Server     $host;
    proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
    proxy_pass http://internal-xxx-alb-1234567890.ap-northeast-1.elb.amazonaws.com;
}

主なポイント

  • resolver ディレクティブ: DNS サーバーを指定します。たとえば、予約済みの VPC DNS IP (192.168.0.2) を利用できます。
    • 各 VPC の DNS サーバーの IP アドレスは、VPC ネットワークのベースアドレス +2 になります。
  • valid=60s: キャッシュされた DNS 応答の TTL を 60 秒に制限し、nginx が頻繁に新しい IP に解決するようにします。

まとめ

動的 IP を解決する AWS ELB などのロードバランサーを使用する場合、nginx の DNS キャッシュ TTL を短縮することは信頼性の高いパフォーマンスを実現するために重要です。この解決策では、短い TTL を持つ resolver ディレクティブを使用し、nginx が常に最新の DNS レコードを取得するようにします。

本記事で紹介した手順を実行することで、一般的な問題を回避し、nginx とロードバランサー間のスムーズな統合を確保できます。

Happy Coding! 🚀

岩佐 孝浩

岩佐 孝浩

Software Developer at KAKEHASHI Inc.
AWS を活用したクラウドネイティブ・アプリケーションの要件定義・設計・開発に従事。 株式会社カケハシで、処方箋データ収集の新たな基盤の構築に携わっています。 Japan AWS Top Engineers 2020-2023