NAT Gateway もないプライベートサブネットの EC2 に、Session Manager を使って閉域性を保ちながら、インターネットから EC2 へ SSH で接続してみます。
Session Manager を閉域で使う手順
- プライベートサブネットに ssm, ssmmessages, ec2messagesサービスへの VPC エンドポイントを作成
- Session Manager を使うのに必要な権限を持つ IAM ロールを作成し、EC2 へアタッチする
- aws ssm コマンドが許可されているクレデンシャルを取得する(IAM Identity Center で認証するなど)
- プライベートサブネットの EC2 が VPC エンドポイント経由で Session Manager に接続しにいくので、インターネット側からも適切なクレデンシャルがあれば Session Manager に接続できるので、Session Manager 経由で EC2 への接続が確立する
- EC2 へ SSH する際に ProxyCommand として aws ssm start-session を渡すと、Session Manager の上に SSH トンネルが張れる
- あとは煮るなり焼くなり
概要図は以下のとおりです。
VPC エンドポイントの作成
Session Manager を使うのに必要なエンドポイントは以下の 3 つ 2 つです。東京リージョンを例とします。
- com.amazonaws.ap-northeast-1.ssm
- com.amazonaws.ap-northeast-1.ssmmessages
- com.amazonaws.ap-northeast-1.ec2messages
watany さんから、VPC エンドポイントは 2 つで行けるとコメントいただきました。早速 ec2messages の VPC エンドポイントを削除してから Session Manager で接続したところ、問題なく接続できましたので、一部修正しました。watany さんありがとうございました!
IAM ロールの作成
IAM ロールに手っ取り早く AWS マネージドポリシーの AmazonSSMManagedInstanceCore を許可ポリシーに設定したものを作成し、EC2 へアタッチします。
EC2 が VPC エンドポイント経由で Session Manager に接続できるようになると、マネジメントコンソールでは以下のような表示となります。
SSH の ProxyCommand に Session Manager の start-session を設定
今度はインターネット側のクライアントの設定になります。AWS CLI がインストールされていることが前提です。
EC2 に SSH する前に Session Manager へアクセス権限のあるクレデンシャルを取得しておきます。
クレデンシャルの取得ができたら、SSH コマンドに以下を渡します。こちらも東京リージョンを例にしています。
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --region ap-northeast-1 --profile プロファイル名"
私は上記を ~/.ssh/config に書くようにしています。
これで Session Manager の上に SSH を通してプライベートサブネットの EC2 に接続できるようになりました。
注意点
この方法はクレデンシャルの取得方法を IAM Identity Center 認証など安全なものにすればセキュアにプライベートサブネットの EC2 インスタンスをリモート操作できます。
ただし、環境によっては外部からアクセスできないよう Session Manager 自体を SCP などで制限している場合があり、この場合はこの方法が使えないので注意しましょう。
EC2 Instance Connect Endpoint について
ホワバ先輩から、EC2 Instance Connect Endpoint についてコメントいただきました(ありがとうございます!)
こちらも同じくインターネット経由で安全にプライベートサブネットの EC2 にアクセス出来て、踏み台ホストが要らないかつエンドポイント利用料もかからないというメリットが大きいサービスになっています。
EC2 Instance Connect エンドポイントの使用に追加コストはかかりません。
Session Manager と EC2 Instance Connect ではエンドポイントへのアクセス制限の方法が異なるなど、要件に合わせて選択すると良さそうです。
自分みたいに個人の検証環境ユースだと、EC2 Instance Connect の方がメリットが大きそうです。
SSM エンドポイントは 3 つも要らなかったんや!




