ELB や動的 DNS バックエンド向けの nginx リゾルバー設定
nginx が ELB などの動的 DNS バックエンドの背後にある場合、古い IP アドレスを保持し続けないようにリゾルバー設定を行う方法。
AWS Elastic Load Balancer(ELB)のような、動的な IP アドレスに名前解決されるサービスを利用する場合、nginx が DNS キャッシュを適切に管理するよう設定することが重要です。これに対処しないと、nginx が古い IP を使い続けてしまい、問題が発生する可能性があります。
DNS キャッシュが重要な理由
Elastic Load Balancer は、同じ DNS 名に対してしばしば異なる IP アドレスを返すため、DNS キャッシュが問題になりやすいです。デフォルトでは、nginx は DNS の解決結果を無期限にキャッシュするため、古い IP へトラフィックを送り続けてしまうことがあります。
以下の 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;}DNS キャッシュの TTL を短縮するための nginx 設定調整
これに対処するには、キャッシュ TTL を短縮した DNS リゾルバーを明示的に定義します。
location / { # Added to shorten cache 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 アドレスは、VPC のネットワーク範囲のベースアドレスに 2 を加えたものです(例:
192.168.0.2)。 - 詳細は公式ドキュメントを参照してください。
valid=60s:- キャッシュされた DNS レスポンスの TTL を 60 秒に制限し、nginx が頻繁に最新の IP を解決するようにします。
まとめ
短い TTL を指定した resolver ディレクティブを明示的に追加することで、ロードバランサーがアドレスをローテーションした後も nginx が古い ELB の IP へプロキシし続ける事態を防げます。これがなければ、nginx は proxy_pass 内のアップストリームホスト名を起動時またはリロード時に一度だけ解決し、その IP を無期限にキャッシュしてしまうため、ELB が変わった瞬間に静かに壊れます。resolver 192.168.0.2 valid=60s; — 常にネットワークのベースアドレスに 2 を加えたものになる VPC の DNS サーバーを指定する設定です — によって、nginx は 60 秒ごとに再解決するようになり、ELB が現在使用している IP に追従し続けます。この設定は ELB に限らず、動的な IP に解決される任意のアップストリームに対しても適用する価値があります。ホスト名の向こう側に何があっても、基盤となるキャッシュの挙動自体は変わらないためです。
Related posts
Cognito User PoolsとOIDCでSlackサインインを実装する
Cognito user poolをOIDC経由でSlackと連携させ、"Sign in with Slack"をAmplifyでNext.jsアプリに組み込みます。
Lambda Web AdapterでFastAPIをAWS Lambdaにデプロイする
Lambda Web Adapterを使うと、FastAPIで書いたAPIバックエンドをコンテナのまま単一のLambda関数にデプロイできます。
API Gateway WebSocket:モック統合の実装
バックエンドのLambdaを一切使わず、モック統合のみでAPI Gateway WebSocket APIを構築し、あらかじめ用意されたレスポンスを返します。
CloudFront署名付きURL経由でS3にアップロードする
CloudFrontの署名付きURLを使えば、独自ドメイン経由でS3にアップロードできます。S3の直接の署名付きURLが使えない場合に有用です。
AWS EventBridge Scheduler:スケジュールに沿ってEC2を起動・停止する
Lambdaを介さずEventBridge SchedulerがEC2 APIを直接呼び出すことで、cronスケジュールに従ってEC2インスタンスを起動・停止します。
