AWS-Systems-Manager

Session Manager接続ができない想定外の落とし穴

ご挨拶

お疲れさまです、寺井です。

普段よく使用するSSMの一機能であるSession Managerにおいて、想定外の設定ミスで手間取ってしまったため、備忘録としてブログに残しておこうと思います。

経緯と課題

NAT Gatewayを経由したパブリックなインターネットを介さずに、AWSのサービスエンドポイントと疎通する検証のために、まずはSSMのSession Managerでインスタンスに接続しようとしたところで躓きました…。

よくあるSSM接続のトラブルシューティングは全て確認済。

EC2がSSMを実行するための適切な権限が付与されたIAMロールの割り当て

  • [AmazonSSMManagedInstanceCore]AWSマネージドポリシーをアタッチ

VPCエンドポイント(Interface)

  • [com.amazonaws.ap-northeast-1.ssm], [com.amazonaws.ap-northeast-1.ssmmessages]の2つを対象のEC2が設置されているプライベートサブネット内に作成
  • 対象のVPCでは「DNS名を有効化」がオンになっている状態
  • リソースポリシーは設定無し(全て許可)

ステップ 2: VPC エンドポイントを作成する

443ポートによる各所セキュリティグループの設定

  • EC2:アウトバウンド すべてのポート・送信先
  • VPCエンドポイント:インバウンド 属しているVPC CIDR範囲からの443ポート

「はいはい、いつものやつね」と確認を進めていたのですが、どれを確認しても問題は見受けられず頭を抱えました。

結論

まずはこちらのVPC詳細画面をご覧ください。

お分かりいただけただろうか……………………………

結論、VPCの名前解決(DHCPオプションセット)に問題がありました😕

本来デフォルトの設定のままであれば、DHCPオプションセットには『Amazon Provided DNS (現:Amazon Route 53 Resolver)』 が割り当てられています。

Amazon Provided DNSは作成したVPCの内部(VPC CIDRアドレス +2)からアクセスできるため、パブリックなインターネットに出ることなく、プライベートサブネット内での名前解決が可能になります。

今回は別の検証の兼ね合いで、別のパブリックDNSを参照させるために、DHCPオプションセットを変更していたことから発生した問題でした。😋
NAT Gatewayを設置していないプライベートサブネットからのトラフィックがパブリックDNSへ到達せず、SSMのエンドポイントの名前解決に失敗していたようです。

完全に想定外でした…。

調査

以降は問題解決に至った経緯をつらつらと載せていきます。

OSは「Amazon Linux 2023」を使用しています。(SSMエージェントがインストール済)
今回はSSMのトラブルシュートに焦点を当ててますので、EC2の起動方法やその他設定周りに関しては言及していません。

パブリックサブネットに設置した踏み台EC2からSSH接続

同VPC内のパブリックサブネットに踏み台サーバを設置して、プライベートサブネットのEC2にSSHアクセスして調査します。

◯各インスタンスのプライベートIP

  • 踏み台サーバのプライベートIP:10.0.15.220
  • 接続先サーバのプライベートIP:10.0.132.208

SCP等で接続用の秘密鍵を設置し、対象のサーバにSSH接続します。

$ chmod 600 {秘密鍵のパス}
$ ssh -i {秘密鍵のパス} ec2-user@10.0.132.208

SSMエージェントの状態を確認

$ sudo systemctl status amazon-ssm-agent
● amazon-ssm-agent.service - amazon-ssm-agent
     Loaded: loaded (/usr/lib/systemd/system/amazon-ssm-agent.service; enabled; preset: enabled)
     Active: active (running) since Mon 2024-05-20 02:19:56 UTC; 2h 14min ago
   Main PID: 1594 (amazon-ssm-agen)
      Tasks: 9 (limit: 1060)
     Memory: 22.5M
        CPU: 557ms
     CGroup: /system.slice/amazon-ssm-agent.service
             mq1594 /usr/bin/amazon-ssm-agent

May 20 03:07:05 ip-10-0-132-208 amazon-ssm-agent[1594]: caused by: Post "https://ssm.ap-northeast-1.amazonaws.com/": dial tcp: lookup ssm.ap-northeast-1.amazonaws.com on 8.8.4.4:53: read udp 10.0.132.208:34921->8.8.4.4:53: i/o timeout
May 20 03:07:05 ip-10-0-132-208 amazon-ssm-agent[1594]: 2024-05-20 03:07:05 INFO [Registrar] sleeping for 34.68333333333333 minutes before retrying registration
May 20 03:41:46 ip-10-0-132-208 amazon-ssm-agent[1594]: 2024-05-20 03:41:46 INFO [EC2Identity] Checking disk for registration info
May 20 03:41:46 ip-10-0-132-208 amazon-ssm-agent[1594]: 2024-05-20 03:41:46 INFO [EC2Identity] No registration info found for ec2 instance, attempting registration
May 20 03:41:46 ip-10-0-132-208 amazon-ssm-agent[1594]: 2024-05-20 03:41:46 INFO [EC2Identity] Found registration keys
May 20 03:41:46 ip-10-0-132-208 amazon-ssm-agent[1594]: 2024-05-20 03:41:46 INFO [EC2Identity] Checking write access before registering
May 20 03:41:46 ip-10-0-132-208 amazon-ssm-agent[1594]: 2024-05-20 03:41:46 INFO [EC2Identity] Registering EC2 instance with Systems Manager
May 20 03:42:34 ip-10-0-132-208 amazon-ssm-agent[1594]: 2024-05-20 03:42:34 ERROR [Registrar] failed to register identity: error calling RegisterManagedInstance API: RequestError: send request failed
May 20 03:42:34 ip-10-0-132-208 amazon-ssm-agent[1594]: caused by: Post "https://ssm.ap-northeast-1.amazonaws.com/": dial tcp: lookup ssm.ap-northeast-1.amazonaws.com on 8.8.4.4:53: read udp 10.0.132.208:40670->8.8.4.4:53: i/o timeout
May 20 03:42:34 ip-10-0-132-208 amazon-ssm-agent[1594]: 2024-05-20 03:42:34 INFO [Registrar] sleeping for 80.91666666666667 minutes before retrying registration

『ssm.ap-northeast-1.amazonaws.com』の名前解決のために『8.8.4.4:53』にアクセスしようとしてタイムアウトエラーが発生してますね…。

名前解決してみる

$ dig
; <<>> DiG 9.16.48-RH <<>>
;; global options: +cmd
;; connection timed out; no servers could be reached

当然ですが到達しませんでした。

修正

VPCのDHCP オプションセットを変更

対象のVPCを選択 →VPC の設定を編集 →デフォルト(※)のDHCP オプションセットに変更
※ドメインネームサーバーが「AmazonProvidedDNS」となっているもの



インスタンスのDNS設定を再読み込み

インスタンスを再起動するだけでOKでした。
停止~開始は必要ないみたいですね。(ヘェ~

(再)名前解決

$ dig

; <<>> DiG 9.16.48-RH <<>>
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49304
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;.                              IN      NS

;; ANSWER SECTION:
.                       20      IN      NS      b.root-servers.net.
.                       20      IN      NS      c.root-servers.net.
.                       20      IN      NS      d.root-servers.net.
.                       20      IN      NS      e.root-servers.net.
.                       20      IN      NS      f.root-servers.net.
.                       20      IN      NS      g.root-servers.net.
.                       20      IN      NS      h.root-servers.net.
.                       20      IN      NS      i.root-servers.net.
.                       20      IN      NS      j.root-servers.net.
.                       20      IN      NS      k.root-servers.net.
.                       20      IN      NS      l.root-servers.net.
.                       20      IN      NS      m.root-servers.net.
.                       20      IN      NS      a.root-servers.net.

;; Query time: 0 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Mon May 20 07:32:14 UTC 2024
;; MSG SIZE  rcvd: 239

無事10.0.0.2(AmazonProvidedDNS)で名前解決が成功しました!👏

SSMエージェントのステータスチェック

$ systemctl status amazon-ssm-agent
● amazon-ssm-agent.service - amazon-ssm-agent
     Loaded: loaded (/usr/lib/systemd/system/amazon-ssm-agent.service; enabled; preset: enabled)
     Active: active (running) since Mon 2024-05-20 07:32:04 UTC; 1min 8s ago
   Main PID: 1576 (amazon-ssm-agen)
      Tasks: 18 (limit: 1060)
     Memory: 58.4M
        CPU: 315ms
     CGroup: /system.slice/amazon-ssm-agent.service
             tq1576 /usr/bin/amazon-ssm-agent
             mq1623 /usr/bin/ssm-agent-worker

May 20 07:32:04 ip-10-0-132-208 amazon-ssm-agent[1576]: 2024-05-20 07:32:04 INFO [EC2Identity] EC2 registration was successful.
May 20 07:32:04 ip-10-0-132-208 amazon-ssm-agent[1576]: 2024-05-20 07:32:04 INFO [amazon-ssm-agent] Registration attempted. Resuming core agent startup.
May 20 07:32:04 ip-10-0-132-208 amazon-ssm-agent[1576]: 2024-05-20 07:32:04 INFO [CredentialRefresher] credentialRefresher has started
May 20 07:32:04 ip-10-0-132-208 amazon-ssm-agent[1576]: 2024-05-20 07:32:04 INFO [CredentialRefresher] Starting credentials refresher loop
May 20 07:32:04 ip-10-0-132-208 amazon-ssm-agent[1576]: 2024-05-20 07:32:04 INFO EC2RoleProvider Successfully connected with instance profile role credentials
May 20 07:32:04 ip-10-0-132-208 amazon-ssm-agent[1576]: 2024-05-20 07:32:04 INFO [CredentialRefresher] Credentials ready
May 20 07:32:04 ip-10-0-132-208 amazon-ssm-agent[1576]: 2024-05-20 07:32:04 INFO [CredentialRefresher] Next credential rotation will be in 29.999991199883333 minutes
May 20 07:32:05 ip-10-0-132-208 amazon-ssm-agent[1576]: 2024-05-20 07:32:05 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] [WorkerProvider] Worker ssm-agent-worker is not running, starting worker process
May 20 07:32:05 ip-10-0-132-208 amazon-ssm-agent[1576]: 2024-05-20 07:32:05 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] [WorkerProvider] Worker ssm-agent-worker (pid:1623) started
May 20 07:32:05 ip-10-0-132-208 amazon-ssm-agent[1576]: 2024-05-20 07:32:05 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] Monitor long running worker health every 60 seconds

SSMエージェントのステータスも問題なさそうです。😌

マネジメントコンソールのSSM接続画面からも対象のインスタンスが確認できました💪

余談

完全に余談ですが、パブリックサブネットにあるEC2からエンドポイント名を名前解決したときの挙動って、エンドポイントの有り無しで変わるのかな?と思って試してみました。
パブリックな解決 or プライベートな解決 どっちが勝つんでしょうか?🤔

VPCエンドポイントがないとき

$ dig +short ssm.ap-northeast-1.amazonaws.com.
52.119.221.73

$ dig +short ssm.ap-northeast-1.amazonaws.com.
99.77.58.18

当然ですけどパブリックIPが帰ってきますよね。
2つのIPで冗長化されているみたいでした。

VPCエンドポイントがあるとき

$ dig +short ssm.ap-northeast-1.amazonaws.com.
10.0.10.235

プライベートIPが返されました!
ちゃんと優先して使用されるようですね。

よくよく考えたら、ロンゲストマッチでインターネット向けの経路(0.0.0.0/0 -> IGW)より、エンドポイント向けの経路(10.0.0.0/16 -> local)が優先されたってことでしょうか。

感想

気づいたらなんてことはないんですけど、完全に死角で結構な時間を費やしてしまいました…。

これからはもっと視野を広く確認すべきだなぁと実感しました。

ありがとうございました!👏

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA