ELB や動的 DNS バックエンド向けの nginx リゾルバー設定
nginx から ELB などの IP アドレスが変化するバックエンドへプロキシする際に、DNS レコードを更新するための設定方法を解説します。
nginx から AWS Elastic Load Balancer(ELB)などの IP アドレスが変化するサービスへプロキシする場合は、DNS の名前解決を適切に設定する必要があります。設定しないと、nginx が古い IP アドレスへトラフィックを送り続ける可能性があります。
DNS キャッシュが重要な理由
Elastic Load Balancer は、同じ DNS 名に対して異なる IP アドレスを返すことがあります。proxy_pass にホスト名を直接記述すると、nginx は設定の読み込み時に名前解決を行い、DNS レコードの TTL に従って自動更新しません。
以下の nginx.conf では ELB のアドレス変更が考慮されていないため、起動時またはリロード時に解決したアドレスを使い続ける可能性があります。
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 の名前解決を行う設定
短い有効期間を指定した DNS リゾルバーを定義し、アップストリームのホスト名を変数経由で proxy_pass に渡します。これにより、nginx が実行時に名前解決を行います。
location / { # Added to shorten cache TTL resolver 192.168.0.2 valid=60s; set $backend internal-xxx-alb-1234567890.ap-northeast-1.elb.amazonaws.com; 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://$backend;}resolver:- DNS サーバーを指定します。
- 各 VPC の DNS サーバーの IP アドレスは、VPC のネットワーク範囲のベースアドレスに 2 を加えたものです(例:
192.168.0.2)。 - 詳細は公式ドキュメントを参照してください。
valid=60s:- キャッシュされた DNS レスポンスの TTL を 60 秒に制限し、nginx が頻繁に最新の IP を解決するようにします。
まとめ
proxy_pass で変数を使用し、resolver ディレクティブを設定すると、nginx は実行時に ELB の IP アドレスを更新できます。
resolver 192.168.0.2 valid=60s; は VPC の DNS サーバーを指定し、応答を 60 秒間キャッシュします。ホスト名を $backend に代入することで、proxy_pass は設定の読み込み時に取得したアドレスだけに依存せず、このリゾルバーを使用します。
同じ設定は、DNS 名の解決先 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 にデプロイする
FastAPI で書いた API バックエンドをコンテナ化し、Lambda Web Adapter と AWS CDK を使って単一の 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 インスタンスを起動・停止します。
