Systems Manager でパブリック EC2 インスタンスがマネージドインスタンスとして認識されず、ログに「lookup i/o timeout」エラーが出力されている場合の対処方法

SSM エージェントログに「lookup i/o timeout」エラーが出力されている場合は、名前解決に利用している DNS サーバーの IP アドレスを修正することでパブリック EC2 インスタンスを SSM でマネージドインスタンスとして認識させます。
2022.04.01

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

困っていた内容

AWS Systems Manager のセッションマネージャーを利用したいのですが、[フリートマネージャー]を確認したところ、対象のパブリックインスタンス(Amazon Linux 2)がマネージドインスタンスとして表示されません。

以下の公式 URL をもとに確認を行いましたが、特に設定に問題はありませんでした。

対象インスタンスにログインして/var/log/amazon/ssm配下のログを確認したところ、以下のようなエラーが出力されていました。対処方法について教えてください。

$ cat /var/log/amazon/ssm/amazon-ssm-agent.log
(省略)
RequestError: send request failed
caused by: Post "https://ssm.us-west-2.amazonaws.com/": dial tcp: lookup ssm.us-west-2.amazonaws.com on 172.31.0.0:53: read udp 172.31.2.105:42069->172.31.0.0:53: i/o timeout

どう対応すればいいの?

原因

このエラーは DNS サーバー 172.31.0.0 によるssm.us-west-2.amazonaws.comの名前解決が失敗したことを示しています。そのため、名前解決に利用している DNS サーバーの IP アドレスを修正します。

対象 EC2 インスタンスの/etc/resolv.confを確認したところ、172.31.0.0を指定していました。

$ cat /etc/resolv.conf
options timeout:2 attempts:5
; generated by /usr/sbin/dhclient-script
search us-west-2.compute.internal
nameserver 172.31.0.0

しかし、対象 EC2 インスタンスの VPC の CIDR は 172.31.0.0/16 のため、名前解決に利用する Amazon DNS サーバーは 172.31.0.2 となります。

AmazonProvidedDNS は、169.254.169.253 (および VPC IPv4 ネットワークの範囲に 2 をプラスした値のリザーブド IP アドレスで) および fd00:ec2::253 で実行する DNS サーバーにマッピングします。例えば、10.0.0.0/16 ネットワークの DNS サーバーの位置は 10.0.0.2 となります。複数の IPv4 CIDR ブロックを持つ VPC の場合、DNS サーバーの IP アドレスはプライマリ CIDR ブロックにあります。

修正方法

以下のコマンドで DNS サーバーの IP アドレスを修正します。

まずはルートユーザーに変更します。

$ sudo su -

/etc/dhcp/に移動して、cat dhclient.confで指定している IP アドレスを確認します。

# cd /etc/dhcp/
# cat dhclient.conf
supersede domain-name-servers 172.31.0.0;

vi dhclient.confで正しい IP アドレスに修正します。

# vi dhclient.conf
supersede domain-name-servers 172.31.0.2;

/etc/sysconfig/network-scriptsに移動して、cat ifcfg-eth0で PEERDNS の値が yes になっていることを確認します。

# cd /etc/sysconfig/network-scripts
# cat ifcfg-eth0
PEERDNS=yes

/etc/dhcp/dhclient.confではなく、/etc/sysconfig/network-scripts/ifcfg-*配下で DNS サーバーの IP アドレスを指定している場合は上記の方法ではなく、オプション2の方法で正しい値を指定します。

そして対象インスタンスの再起動を行います。

参考情報