EC2 Linux での DNS 解決の失敗を回避する方法を教えてください。

最終更新日 : 2019 年 10 月 1 日

Amazon Elastic Compute Cloud (Amazon EC2) Linux での DNS 解決の失敗を回避する方法を教えてください。 

簡単な説明

CPU とネットワークの使用率を減らし、DNS 解決の失敗を回避するには、DNS キャッシュを適用します。

DNS キャッシュを使用すれば、繰り返し行われる DNS リクエストには、ネットワーク経由で DNS リゾルバーとやり取りしなくても、キャッシュがローカルで応答します。DNS キャッシュとしては、以下の AWS のサービスの 1 つを使用します。

  • Amazon Relational Database Service (Amazon RDS)
  • Amazon ElastiCache
  • Amazon Simple Storage Service (Amazon S3)

次の手順は、Amazon Linux のすべてのバージョンに当てはまります。別のディストリビューションを使用している場合は、以下を参照してください。

解決方法

dnsmasq (DHCP およびキャッシュ DNS サーバー) を使用してローカル DNS キャッシュをセットアップします。

1.     次のコマンドを実行して dnsmasq サーバーをインストールします。

sudo yum install -y dnsmasq

2.     次のコマンドを使用して dnsmasq を実行する専用のシステムユーザーを作成します。

sudo groupadd -r dnsmasq
sudo useradd -r -g dnsmasq dnsmasq

注意 : dnsmasq は通常 root ユーザーとして実行されますが、起動後に別のユーザーに変更することで root 権限を削除します (デフォルトでは、ユーザーは「nobody」です)。

3.     次のコマンドを使用して dnsmasq.conf ファイルのコピーを作成します。

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig

4.     テキストエディタ (例えば vim) を使用して、設定ファイルを開きます。

sudo vim /etc/dnsmasq.conf

5.     /etc/dnsmasq.conf ファイルを次のように編集します。

# Server Configuration
listen-address=127.0.0.1
port=53
bind-interfaces
user=dnsmasq
group=dnsmasq
pid-file=/var/run/dnsmasq.pid

# Name resolution options
resolv-file=/etc/resolv.dnsmasq
cache-size=500
neg-ttl=60
domain-needed
bogus-priv

6.     /etc/resolv.dnsmasq ファイルを作成し、Amazon DNS サーバーまたは DHCP オプションセットで指定したカスタムドメインネームサーバーを設定します。

sudo bash -c "echo 'nameserver 169.254.169.253' > /etc/resolv.dnsmasq"

注意 : EC2-Classic の場合、Amazon DNS サーバーは 172.16.0.23 です。EC2 VPC の場合の、DNS サーバーの場所の詳細については、DHCP オプションセットを参照してください。dnsmasq キャッシュを持つインスタンスから AMI を作成し、別の CIDR を持つ別の VPC で起動する場合、または DHCP オプションで指定したカスタム DNS サーバーがある場合は、そのネットワークのネームサーバーを使用するように /etc/resolv.dnsmasq ファイルを調整します。

7.     次のコマンドを使用して、dnsmasq サーバーを再起動し、起動時にサービスが開始されるように設定します。

Amazon Linux 1

sudo service dnsmasq restart
sudo chkconfig dnsmasq on

Amazon Linux 2

sudo systemctl restart dnsmasq.service
sudo systemctl enable dnsmasq.service

8.     dig コマンドを使用して、dnsmasq が正しく動作していることを確認します。

dig aws.amazon.com @127.0.0.1

次のような応答が返れば、dnsmasq キャッシュは正しく動作しています。

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.56.amzn1 <<>> aws.amazon.com @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25122
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;aws.amazon.com.            IN    A

;; ANSWER SECTION:
aws.amazon.com.        41    IN    A    54.239.31.69

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
...

9.     dnsmasq DNS キャッシュをデフォルトの DNS リゾルバーとして設定します。

注意 : DHCP が提供するデフォルトの DNS リゾルバーは、/etc/dhcp/dhclient.conf ファイルを変更または作成して、抑制する必要があります。詳細については、Ubuntu、RHEL、または Amazon Linux が実行されているプライベート Amazon EC2 インスタンスに静的 DNS サーバーを割り当てる方法を教えてくださいを参照してください。

10.    次のコマンドを使用して、デフォルトの DNS リゾルバーをフォールバックオプションとして設定します。

sudo bash -c "echo 'supersede domain-name-servers 127.0.0.1, 169.254.169.253;' >> /etc/dhcp/dhclient.conf"

11.    変更を適用するには、dhclient コマンドを実行するか、インスタンスを再起動します。

sudo dhclient

- または -

sudo reboot

dig コマンドを実行して、インスタンスが DNS キャッシュを使用していることを確認します。

dig aws.amazon.com

応答により、DNS リクエストに応答しているサーバーが 127.0.0.1 であることが示されている場合には、DNS キャッシュは正常に動作しています。

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.56.amzn1 <<>> aws.amazon.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1028
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;aws.amazon.com.            IN    A

;; ANSWER SECTION:
aws.amazon.com.        55    IN    A    54.239.31.69

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) <<<-------
...

オートメーション

以下のいずれかを使用すれば、dnsmasq のインストールと設定を自動化し、Amazon Linux で DNS リゾルバーとして動作させることができます。

他の Linux ディストリビューションで dnsmasq のインストールを自動化する場合は、いずれかのファイルを参考にし、必要に応じてカスタマイズしてください。

どちらのファイルも、Amazon DNS サーバーの代替アドレス として VPC では 169.254.169.253、EC2-Classic では 172.16.0.23 を使用しているので、VPC インスタンスまたは EC2-Classic で実行できます。

どちらのファイルも、ユーザーデータフィールドにファイルの内容を渡すことによって、起動時に実行できます。Bash スクリプトは、スタンドアロンスクリプトとして、または AWS Systems Manager Run Command を使用することにより既存のインスタンスでアクションを実行できます。

Bash スクリプトをスタンドアロンスクリプトとして実行するには :

1.    スクリプトをインスタンスでダウンロードし、実行可能にします。

wget https://raw.githubusercontent.com/awslabs/aws-support-tools/master/EC2/AutomateDnsmasq/AutomateDnsmasq.sh
chmod +x AutomateDnsmasq.sh

2.    root ユーザーとして、または sudo を使用して、次のコマンドを実行します。

sudo ./AutomateDnsmasq.sh

この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合