内容
Network Load Balancer(NLB)の先にWEBシステムを構築。www.example.co.jp
にアクセスするとNLB作成時に自動的に払い出されるNLBのDNS名(test-lb-xxx.elb.ap-northeast-1.amazonaws.com
)にアクセスする環境を想定します。この場合、www.example.co.jp
の名前解決が必要となりますが、Route53のホストゾーンにレコードを登録する方式ではなく、オンプレミスのDNSサーバにCNAME(別名レコード)を登録する方法を検証します。www.example.co.jp
にアクセスするとCNAMEとして定義された、test-lb-xxx.elb.ap-northeast-1.amazonaws.com
にアクセス。その後、test-lb-xxx.elb.ap-northeast-1.amazonaws.com
の名前解決が行われ、NLBのIPアドレスを取得する流れとなります。なお、オンプレミス環境はインターネット接続出来ない環境を想定しています。
構成
下記の図でEC2がオンプレミス側のDNSサーバ想定環境になります。検証で使用するDNSサーバはLinux環境にbindをインストールします。ECサーバ内部から赤線の流れでwww.example.co.jp
の名前解決が行われ、黄色線の流れでECサーバからNLBが提供するWEBシステムにアクセスする環境を想定します。EC2サーバ内部からの名前解決の流れは下記のようになります。
- EC2サーバから
nslookup www.example.co.jp
コマンドを実行します。 -
/etc/resolv.conf
には問合せ先のDNSサーバを指定します。EC2内に構築したDNSサーバに問合せを行うため、ここはEC2サーバのローカルのIPアドレスとなります。 -
nslookup www.example.co.jp
コマンドを実行した際、/etc/resolv.conf
を参照し、172.20.1.10(ローカルにインストールされたDNSサーバ)に名前解決のリクエストを送信します。 - DNSサーバには
www.example.co.jp
⇒test-lb-xxx.elb.ap-northeast-1.amazonaws.com
といったCNAMEレコードが存在するためtest-lb-xxx.elb.ap-northeast-1.amazonaws.com
にアクセスします。
test-lb-xxx.elb.ap-northeast-1.amazonaws.com
はインターネット上に存在するゾーンです。通常、インターネットに接続可能な環境ではこの後、test-lb-xxx.elb.ap-northeast-1.amazonaws.com
の名前解決は可能ですが、未接続の環境ではインターネット上のamazonaws.com
が名前解決出来ません。ここでインターネット上の名前解決を行うために、DNSインバウンドエンドポイントを使用します。該当ドメインをDNSインバウンドにフォワードすることによって、インターネット上の名前解決が可能になります。そのため、オンプレミスのDNSサーバにamazonaws.com
ドメインはDNSインバンドエンドポイントに転送するといったルールを記載します。
-
test-lb-xxx.elb.ap-northeast-1.amazonaws.com
の名前解決が行われ、NLBのIPアドレスを取得します。これにより、NLBにアクセスが可能となります。
環境構築
前提
- インバウンドエンドポイントが作成済みである。
- VPCおよびEC2が作成済みである。
- セキュリティグループ、ルートテーブルの設定などが適切にされている。
上記準備が完了している状態でEC2にbindのインストール、設定を行っていきます。
構築
- bindのインストール
yum install -y bind bind-utils
- リゾルバの設定
EC2サーバ内から名前解決する時、問合せ先のDNSサーバを指定します。VPC内のデフォルトDNSサーバが設定されているため、EC2のIPアドレスに設定します。
vi /etc/resolv.conf
nameserver 172.20.1.10
- インターネット向けの名前解決が出来ないため、NLBの名前解決出来ない状態です。
nslookup test-lb-xxx.elb.ap-northeast-1.amazonaws.com
;; communications error to 172.20.1.10#53: timed out
;; communications error to 172.20.1.10#53: timed out
;; Got SERVFAIL reply from 172.20.1.10
Server: 172.20.1.10
Address: 172.20.1.10#53
- named.confに下記を追加、amazonaws.com宛の通信をDNSインバウンドエンドポイントにフォワードするルールを追加後、bindの再起動を行います。
vim /etc/named.conf
zone "amazonaws.com" IN {
type forward;
forward only;
forwarders { 172.20.1.20; 172.20.1.30; };
};
systemctl restart named
- DNSインバウンドエンドポイント経由でNLBの名前解決が出来るようになりました。
nslookup test-lb-xxx.elb.ap-northeast-1.amazonaws.com
Server: 172.20.1.10
Address: 172.20.1.10#53
Non-authoritative answer:
Name: test-lb-xxx.elb.ap-northeast-1.amazonaws.com
Address: 172.20.1.40
Name: test-lb-xxx.elb.ap-northeast-1.amazonaws.com
Address: 172.20.1.50
- まだこの状態ではCNAMEレコード未追加のため、www.example.co.jpの名前解決を行うことが出来ません。
nslookup www.example.co.jp
;; communications error to 172.20.1.10#53: timed out
;; communications error to 172.20.1.10#53: timed out
;; Got SERVFAIL reply from 172.20.1.10
Server: 172.20.1.10
Address: 172.20.1.10#53
** server can't find www.example.co.jp: SERVFAIL
- named.confにexample.co.jpのゾーン情報を追加します。
vim /etc/named.conf
zone "example.co.jp" IN {
type master;
file "example.co.jp.zone";
};
- また/var/named/example.co.jp.zoneを作成しCNAMEレコードを定義後、bindの再起動を行います。
vim /var/named/example.co.jp.zone
$TTL 86400
@ IN SOA ns1.local.net. root.local.net. (
2024031701
3600
900
604800
86400 )
;
@ IN NS ns1.local.net.
ns1 IN A 172.20.1.10
www IN CNAME test-lb-xxx.elb.ap-northeast-1.amazonaws.com.
systemctl restart named
- これでwww.example.co.jpの名前解決が出来るようになりました。
nslookup www.example.co.jp
Server: 172.20.1.10
Address: 172.20.1.10#53
www.example.co.jp canonical name = test-lb-xxx.elb.ap-northeast-1.amazonaws.com.
Name: test-lb-xxx.elb.ap-northeast-1.amazonaws.com
Address: 172.20.1.50
Name: test-lb-xxx.elb.ap-northeast-1.amazonaws.com
Address: 172.20.1.40