とあるプライベートネットワークな環境で SSM エージェントが応答しないインスタンスがあったのでちょっと調べた。
サブネットにはインターネットゲートウェイや NAT ゲートウェイなどはなく完全に閉鎖空間。そのため、VPC にはインターフェイスタイプの SSM エンドポイントが設置されている。
SSM エージェントのログを見てみたところ ssm.ap-northeast-1.amazonaws.com と通信が出来ていない模様。IP を確認してみるとパブリックな IP で、VPC エンドポイントを作成しているにも関わらずパブリックなエンドポイントを参照している。DNS サーバを確認してみると手動で設定されていることがわかった。
VPC エンドポイントの DNS 名のうち、vpce- から始まる DNS に関してはローカルネットワークを参照している模様。SSM エージェントに手動でこのエンドポイントを指定できれば良さそう。
調べてみたところ、amazon-ssm-agent.json で Ssm.Endpoint を指定すれば良さそう。
{ "Ssm": { "Endpoint": "エンドポイントの DNS 名" } }
あとはサービスを再起動すれば良い。
CloudWatchAgent に関しては設定方法が無いっぽい?
ちなみにプロキシ配下で 169.254.169.254 にアクセス出来ない場合は AmazonSSMAgent と AmazonCloudWatchAgent それぞれに no_proxy 環境変数を設定することが出来るのでこれで回避可能。
Linux では systemd のファイルで Service セクション、Windows では HKLM:\SYSTEM\CurrentControlSet\Services\AmazonSSMAgent 等に no_proxy= を設定する。