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 アドレスが変化するほかのアップストリームにも適用できます。
関連記事
Docker 環境で Greengrass コンポーネントをビルド・デプロイする
Greengrass Core Docker イメージを使い、AWS IoT Greengrass コンポーネントをローカルで開発します。
aws-vault から Granted に移行した話
aws-vault の開発終了をきっかけに Granted へ移行しました。ロールの切り替えやコンソールの開き方の違いと、認証情報や既存の設定を引き継ぐ際の注意点をまとめます。
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 を構築し、あらかじめ用意したレスポンスを返します。
