Amazon EC2 Linux インスタンスで DNS 解決が失敗しないようにするにはどうすればよいですか?

最終更新日: 2022 年 8 月 15 日

Amazon Elastic Compute Cloud (Amazon EC2) Linux インスタンスで DNS 解決が失敗しないようにしたいと考えています。 これを行うにはどうすればよいですか?

簡単な説明

CPU とネットワークの使用量を減らし、DNS 解決が失敗しないようにするには、DNS キャッシュを適用します。

DNS キャッシュを使用して外部 DNS リソースをクエリする場合、キャッシュは、ネットワーク経由で DNS リゾルバーとやり取りすることなく、繰り返されるほとんどの DNS クエリについてローカルで応答します。クエリできる外部 DNS リソースの例は次のとおりです。

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

次の手順は、Amazon Linux のすべてのバージョンに当てはまります。別のディストリビューションを使用している場合は、次のリストからディストリビューションのドキュメントを選択してください。

解決方法

dnsmasq (DHCP およびキャッシュ DNS サーバー) を使用してローカル DNS キャッシュをセットアップします。dnsmasq の概要については、dnsmasq のドキュメントをご参照ください。

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"

注: DNS サーバーの場所の詳細については、「What is DHCP」(DHCP とは) を参照してください。次のシナリオで、そのネットワークのネームサーバーを使用するように /etc/resolv.dnsmasq ファイルを調整します。

  • dnsmasq キャッシュを持つインスタンスから AMI を作成し、別の CIDR を持つ別の VPC で起動する。
  • DHCP オプションでカスタム DNS サーバーが指定されている。

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 リゾルバーとして設定します。

注: /etc/dhcp/dhclient.conf ファイルを変更または作成することによって、DHCP が提供するデフォルトの DNS リゾルバーを抑制する必要があります。詳細については、「プライベート Amazon EC2 インスタンスが Amazon Linux、Ubuntu、または RHEL で実行中です。再起動中も持続する 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) <<<-------
...

オートメーション

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

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

どちらのファイルも、Amazon DNS サーバーの代替アドレス 169.254.169.253 を使用するため、VPC インスタンスで実行できます。

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

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

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


請求に関するサポートまたは技術サポートが必要ですか?