EC2 Windowsでインスタンスタイプを変更したらDNSサーバ設定がリセットされた話

EC2のインスタンスタイプを変更する際、場合によってはWindowsのネットワークアダプタについても変更が発生します。このとき個別に設定しているDNSサーバ設定がリセットされることがあります。DNSサーバ設定はDHCPオプションセットを使って設定しましょう。
2020.09.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

清水です。先日、OS上で個別にDNSサーバ設定をしたEC2 Windowsにてインスタンスタイプ変更を行ったところ、参照先となるDNSサーバの設定がリセットされるという事象に遭遇しました。原因はインスタンスタイプ変更にともないネットワークアダプタが変更されたことで、その結果ネットワークアダプタに対して設定していた参照先DNSサーバの設定が無効になった、ということだったのですが、備忘録として事象や回避策などをまとめておきたいと思います。

発生した事象と環境

まずは発生した事象やその環境についてです。OSとしてはWindows Server 2016 (日本語版)を利用しました。具体的には以下のAMIで事象を確認しています。

またVPCとして10.82.0.0/16のCIDRのものを使用、DHCPオプションセットはデフォルトのものを使用しています。

インスタンスタイプをm4.largeに設定してEC2インスタンスを起動後、ipconfig /allコマンドでネットワーク状況を確認してみると以下のような具合です。DNSサーバはAmazon Provided DNS (Route 53 Resolover)、VPCネットワーク範囲に2をプラスした値の10.82.0.2が指定されていますね。

ネットワークアダプタのプロパティ画面から、インターネット プロトコル バージョン 4 (TCP/IPv4)のプロパティも確認してみましょう。以下のようにDNSサーバのアドレスはDHCPサーバから自動的に取得するように設定されています。

この状態から、参照するDNSサーバまわりの設定をしていきます。Active DirectoryのドメインにWindowsを参加させるケースで遭遇した事象ということもあり、ドメイン参加についても進めていきます。検証の際のActive DirectoryについてはAWS Directory ServiceのSimple ADを使用しました。以下のように、10.82.31.9810.82.32.206がDNSアドレスとなります。

Windowsのネットワークアダプタ、TCP/IPv4のプロパティ画面から優先DNSサーバ、代替DNSサーバを指定します。

そしてコンピュータをドメインに参加させます。

またホスト名のみで名前解決を行いたいため、ドメインサフィックスとしてad.example.netを指定しておきました。

ipconfig /allコマンドで確認すると以下の具合です。

以上の状態で、インスタンスタイプの変更を行います。m4.largeからm4.xlargeに変更した場合は特にネットワークまわりで変わった点は見られなかったのですが、その後m4.xlargeからr4.largeに変更したところで、今回の問題となる事象が発生しました。設定してあるはずの優先DNSサーバ、代替DNSサーバの設定がリセットされており、「DNSサーバのアドレスを自動的に取得する」状態になっています。

ipconfig /allコマンドで確認すると、以下のようにDNSアドレスとしてSimple ADのDNSアドレスではなく、Amazon Provided DNSが指定された状態となっています。参加先のドメインの設定やドメインサフィックスの設定については、維持されたままでした。

このように、インスタンスタイプをm4系からr4系(具体的にはm4.xlargeからr4.larege)に変更した際に、個別に設定したDNSサーバ情報がリセットされ、「DNSサーバのアドレスを自動的に取得する」設定に戻ってしまっていたことが、今回の事象となります。

発生原因はネットワークアダプタの変更

発生原因について調査したところ、本事象はネットワークアダプタの変更に起因していることが確認できました。以下、具体的に原因箇所を確認していきます。

m4系インスタンスのネットワークアダプタ

まずはインスタンスタイプ変更前、m4.largeのデバイスマネージャ、ネットワークアダプタの項目です。Intel(R) 82599 Virtual Functionが利用されていることがわかります。

コントロールパネルで確認してみると、「イーサネット 2」の表示と、やはりIntel(R) 82599 Virtual Functionとなっていることがわかります。

上記はm4.xlargeでも同じでした。 ただし後述しますが、すべてのm4系インスタンスで同じとは限りません。

r4系インスタンスのネットワークアダプタ

続いて、インスタンスタイプ変更後となるr4.largeのネットワークアダプタを確認します。デバイスマネージャで確認すると、以下のようにAmazon Elastic Network Adapterが利用されていることがわかります。

コントロールパネルでも確認してみましょう。Amazon Elastic Network Adapterであること、また「イーサネット 3」となっていることがわかります。m4系インスタンスとは別のネットワークアダプタが使用されている、というわけです。そしてDNSサーバ設定についてはネットワークアダプタ毎に異なるものが使用されるため、r4系インスタンスに変更したタイミングで個別に設定してたDNSサーバ設定情報は適用されなくなり、ネットワークアダプタのデフォルト設定である「DNSサーバのアドレスを自動的に取得」する状態になってしまっていた、というわけです。

ENA: Elastic Network Adapter

r4.largeで使用されていたAmazon Elastic Network Adapter、より高性能なパフォーマスをもつネットワークインターフェイスとして拡張ネットワーキングで使用されるもの、という認識です。

上記2つ目のリンク先に記載がありますが、サポートされているインスタンスタイプはNitro世代のほか、今回確認したr4系、そしてm4.16xlargeも含まれています。つまりm4系でもインスタンスタイプが異なればネットワークアダプタが変わり、今回の事象が発生していた、という可能性があります。(実際に確認はしておりませんが。)

再度m4.largeに戻した場合

r4.largeにインスタンスタイプを変更し、ネットワークアダプタがAmazon Elastic Network AdapterになりDNSサーバ設定がリセットされた後、再度m4.largeに戻すとどうなるでしょうか。確認したところ、ネットワークアダプタはr4.large変更前の Intel(R) 82599 Virtual Function に戻り、またDNSサーバ設定もこのネットワークアダプタに設定したものが復活する、という挙動となりました。

その他のネットワークアダプタ

確認した限りでは、m4系ではIntel(R) 82599 Virtual Function、r4系ではAmazon Elastic Network Adapterというネットワークアダプタが使われていました。後者はENAという名称から、Nitro世代などのインスタンスタイプでも使用されるのかな、と推測しています。では他のネットワークアダプタが設定される可能性はあるのでしょうか。ざっと確認した限りですが、インスタンスタイプがt2.largeの場合では、以下のようにAWS PV Network Device #0というネットワークアダプタが使用されていました。

m4.largeからt2.largeに変更した場合、つまり上記AWS PV Network Device #0のネットワークアダプタに変更した場合でも、今回のDNSサーバ設定がリセットされる、という挙動が発生しました。また確認はできていませんが、他にもネットワークアダプタはあるのかもしれません。

DNSサーバ設定がリセットされるのを回避するためのDHCPオプションセットの利用

さて、このようなネットワークアダプタ変更によるDNSサーバ設定のリセットに備える場合、DHCPオプションセットが活用できます。(そもそもEC2インスタンス側でのDNSサーバを個別に変更するのではなく、DHCPオプションセットでデフォルトで割り当てられるDNSサーバ情報を変更することが推奨されるかと思います。 *1

今回の環境で、DHCPオプションセットを適切に設定した場合に事象が解決されるか確認してみました。まずはDHCPオプションセットの設定です。DHCPオプションセットは設定変更ができないため、新しくDHCPオプションセットを作成、VPCに紐づけるDHCPオプションセットを変更する、という流れになります。

マネジメントコンソールからDHCPオプションセットを作成を進めます。今回はドメイネームサーバの項目のみ、設定を行いました。

続いて、VPCに紐づけるDHCPオプションセットをデフォルトのものから変更します。

この状態で、個別にDNSサーバ設定をしていないネットワークアダプタとなるインスタンスタイプでEC2を起動してみます。以下のようにTCP/IPv4プロパティ画面で「DNSサーバのアドレスを自動的に取得する」の状態ですが、ipconfig /allコマンドで参照するDNSサーバを確認してみるとDHCPオプションセットで指定したDNSサーバのアドレス10.82.31.9810.82.32.206になっていることが確認できます。

DHCPオプションセットでDNSサーバを設定することで、インスタンスタイプを変更して使用するネットワークアダプタが変わっていも、指定したDNSサーバを参照できることが確認できました。

まとめ

EC2 Windowsにてインスタンスタイプ変更を行った際に遭遇した、OS上で個別に設定した参照先DNSサーバ情報がリセットされてしまうという事象について、原因であるネットワークアダプタの変更と回避策を確認してみました。恥ずかしながらこれまで、DHCPオプションセットのDNSサーバ設定機能について、個別にDNSサーバを設定するのを省略できるというぐらいのイメージしかなかったのですが、その重要性を感じることができました。DNSサーバをAmazon Provided DNS (Route 53 Resolover)以外のものにする場合、まずはDHCPオプションセットでのDNSサーバ設定を検討しましょう。またVPC内の一部EC2インスタンスで個別にDNSサーバを設定したいなどの場合には、DHCPオプションが使用できず、やはりOS上で個別に設定することとなるかと思います。その場合には、今回のような系統の異なるインスタンスタイプへの変更など、何らかのトリガでネットワークアダプタが変わり、参照先のDNSサーバ設定がリセットされる可能性がある、ということに十分留意しておきましょう。DNSサーバ設定を自動でチェック、設定するスクリプトなどを仕込むことができれば、万全かなと思います。 *2

また今回の事象、本エントリ中ではすぐに発生原因を特定しているような書き方になってしまっていますが、事象に遭遇した直後はとても困惑しました。社内Slackで同様の事象に遭遇したことがないか、原因として考えられることなどないか、などヘルプを求めてみたところ、すばらしい同僚のみなさまからのアドバイスでネットワークアダプタまわりが怪しいことがわかり、解決に至ったしだいです。アドバイスくれたみなさま本当にありがとうございました!!!!

脚注

  1. 例えば「AWS Directory ServiceでActive Directoryを立ててWindowsを参加させる | Developers.IO」の冒頭にも記載がありますね。(このエントリ、動作確認の過程で参照したのですが、まさに本エントリのようなケースがあるのかなと。)
  2. Windows EC2インスタンスのDNS設定をPowerShellから行う | Developers.IO