こんにちは、SCSKでAWSの内製化支援『テクニカルエスコートサービス』を担当している貝塚です。
皆さん、Session Manager経由でインスタンスに接続できず、調べてみてやっと原因がわかったり調べてみてもさっぱり原因が分からなかったりした経験がありませんか?
- 対象インスタンスと同一VPCにssm, ssmmessages, ec2messagesのVPC Endpointを作成(インターネット接続のない環境の場合)し、
- AWSSSMManagedCorePolicyを含むRole(インスタンスプロファイル)を作成し、
- そのRole(インスタンスプロファイル)を接続対象インスタンスにアタッチし、
- EC2インスタンスからVPC EndpointへのHTTPSが許可されるようにSecurity Groupを調整する
- SSM AgentがプレインストールされたAMIを使用しており、SSM Agentが起動していないとは考えづらい
Session Managerのトラブルシューティングを調べてみてもおかしいところは見当たらず、正直もうお手上げ……そんな時に、縋る思いでこの記事をチェックしてみてください。
前提
この記事は、Session Manager経由での接続にVPCエンドポイントを使用する場合を想定しています。インターネットゲートウェイをアタッチしてインターネット接続できる環境にはあてはまりません。
名前解決に注意!
この記事で言いたいことは、名前解決に注意、です。VPC・VPCエンドポイントには、名前解決まわりのはまりポイントが3つあります。多くの場合このはまりポイントはうまく回避できているのですが、ひょんなことからはまりポイントになってしまうことがあるのです。
- VPCの属性「DNS ホスト名」が有効になっていることを確認する
- VPCの属性「DNS 解決」が有効になっていることを確認する
- VPCエンドポイントの属性「プライベート DNS 名」が有効になっていることを確認する
1. VPCの属性「DNS ホスト名」が有効になっていることを確認する
下記AWSドキュメントを読んでみると、「DNSホスト名(enableDnsHostnames)」は、パブリックIPアドレスを持つEC2インスタンスのパブリックDNS名(ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com のようなインターネットから接続可能なFQDN)を有効にするか否か(のみ)を制御しているように読めます。
VPC がパブリック IP アドレスを持つインスタンスへのパブリック DNS ホスト名の割り当てをサポートするかどうかを決定します。
ところが実際はそうではありません。
上記ドキュメントの「ルールと考慮事項」を読むと次のようなことが書かれています。(参照元ドキュメントの日本語機械翻訳がおかしいので、私の方で意味の通る日本語に翻訳し直しています)
「DNS ホスト名」「DNS 解決」のどちらかが無効に設定されている場合、Amazon Route 53 Resolver サーバーは、Amazon が提供するプライベート DNS ホスト名を解決できません。
Amazon が提供するプライベート DNS ホスト名というのは、例えばVPC内でEC2の名前解決に使用できるプライベート IP DNS 名(ip-10-xxx-xxx-129.ap-northeast-1.compute.internal のようなFQDN)などのことですが、他に、インターフェース型VPCエンドポイント名(例えば ssm.ap-northeast-1.amazonaws.com )もこれに含まれます。
以下の記事で書いた通り、本来であればAWSのパブリックIPが返ってくるはずのAWSサービスのエンドポイント※1について、Amazon Route 53 ResolverがVPCエンドポイントのプライベートIPアドレスを返すことで、インターフェース型VPCエンドポイントは機能しています。
「DNSホスト名」を無効にするとこのプライベートIPへの変換ができなくなるので、Session Manager経由の接続ができなくなります。
2. VPCの属性「DNS 解決」が有効になっていることを確認する
「DNS解決(enableDnsSupport)」の方はもっとわかりやすく、これを無効化すると、Amazon Route 53 Resolver(デフォルトで参照しているDNSサーバ)が一切名前解決をしてくれなくなります。
当然、Session Manager経由の接続に必要なVPCエンドポイントの名前解決もしてくれないので、Session Manager経由の接続ができなくなります。
3. VPCエンドポイントの属性「プライベート DNS 名」が有効になっていることを確認する
VPCエンドポイントには、例えば vpce-xxxxxxxxxxxxxxxx-xxxxxxxx.ssm.ap-northeast-1.vpce.amazonaws.com のような名前が付き、名前解決するとプライベートIPアドレスに解決されますが、その他に、ssm.ap-northeast-1.amazonaws.com (SSMエンドポイントの場合)のようなプライベートDNS名前も持ち、同じプライベートIPアドレスに解決されます。
VPCエンドポイントの「プライベートDNS名」を無効にすると、後者(ssm.ap-northeast-1.amazonaws.com)の名前解決が機能しなくなり、Session Manager経由の接続ができなくなります。
なぜ無効化されているのか?
VPC属性「DNS ホスト名」は、マネージメントコンソールからのVPC作成時に「VPCなど」(VPC作成時にサブネットやルートテーブルなども一緒に作ってくれる機能)を選択するとデフォルトで有効が選択されているので問題ありませんが、「VPCのみ」を選択するとデフォルトでは無効です(2024年4月4日時点で弊社所有の環境にて確認)。作成時に有効化できないので、「VPCのみ」作成した場合には、作成後に「DNS ホスト名」を有効化しましょう。
VPC属性「DNS 解決」は、マネージメントコンソールからのVPC作成時、「VPCなど」「VPCのみ」どちらを選択してもデフォルト有効です。
VPCエンドポイントの「プライベート DNS 名」はマネージメントコンソールからの作成時にデフォルトで有効が選択されていますが、私の経験では、有効を選択するとなぜか作成エラーになるため無効にして作成したことがありました。(そのことを失念した状態でSession Managerの接続設定をして、なんでつながらないの……とはまっていたわけです)
なお、2024年4月4日時点では「プライベート DNS 名」有効で問題なく作成できましたので通常は発生しない問題です。
まとめ
VPCを「VPCのみ」で作成したときに「DNS ホスト名」が無効になっている点ははまりどころかと思います。
また、「DNS 解決」「プライベート DNS 名」は意図的に無効化しない限りは有効になっているはずですが、私が経験したように(おそらくマネージメントコンソールのバグか何かで)無効になってしまっている可能性もあるので、チェックしてみるとよいでしょう。