やりたかった事
- VPC private subnetで起動しているセキュアなEC2インスタンスにVPC外からSSHで接続したい
- インターネットに面する踏み台サーバーを用意したり、ポート解放はしたくない
前提
ec2側
- ec2 はAmazonlinux2で作成
- ec2 にssm-agent 最新版を導入済み
- ec2 インスタンス自体はPrivat subnetにあってインターネットからアクセス不可能であっても、natgatewayやvpcエンドポイント経由でSSMエンドポイントにアクセス可能である
- ec2 作成時に指定した ec2-user のキーペア秘密鍵などssh接続に必要な情報は手元にある。
- ec2 のsshdでは鍵認証での接続が可能な状態にある
作業者端末側
- 接続元の端末は今回は macを使用して検証した
- 接続したいec2のインスタンスID、ユーザー名、接続用の鍵の情報は確保済み。
- aws cli環境は整備済みで使える状態にある。
という状態からレッツトライ
まずは公式の情報源
やった事
1. EC2 に付与している インスタンスプロファイルの設定確認
- インスタンスプロファイル内に
AmazonSSMManagedInstanceCore
ポリシーがあるか。 - なければ追加する。
2. 手元の端末で .ssh/config に公式のDocから設定をコピペして追加
- ~/.ssh/config を編集。内容は最新のドキュメントを確認。
# SSH over Session Manager
host i-* mi-*
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
3. 手元の端末から sshで接続
- 接続したいEC2インスタンスのインスタンスIDを確認する。マネジメントコンソールでもcliでも好きな方法で。
- sshコマンドで osのユーザー名、インスタンスID、ユーザーの秘密鍵を使って接続。やったね。
$ ssh ec2-user@<i-から始まるインスタンスID> -i <秘密鍵>
おま環で少しハマったところ
- aws cli 利用時に profileを指定する必要があったので ~/.ssh/config の設定を少し調整
# SSH over Session Manager
host i-* mi-*
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --profile <profile名>"
参考にした記事
その他
- IAMの設定でポリシーでアクセスを許可するインスタンス制御もできるっぽい。
感想
- 思ったより簡単に実現できてとてもよかった。満足