主題の通り、プライベートサブネットに配置したEC2インスタンスへ、SSM Session Manager で SSH 接続する方法についてです。
前提条件
- プライベートサブネットのEC2インスタンスに接続する
- パブリックサブネットは作成しない(NATゲートウェイは使用しない)
- VPCエンドポイントは使用してもよい
- EC2インスタンスは AmazonLinux2 とする
- AWS CLI が使用できる環境とする
- AWS CLI にアクセスキーが設定されており、SSMが実行できるIAMロールが割り当てられているとする
大まかな戦略
- EC2インスタンスに、SSMが接続できるようにするIAMロールを付与
- SSMのVPCエンドポイントを用意し、VPCエンドポイントを経由してSSH接続する
イメージ
大まかな手順
- VPCとプライベートサブネットを作成
- VPCエンドポイントの作成
- EC2インスタンスを作成
- IAMロールを付与
- Session Manager でEC2インスタンスがSSM接続対象になっていることを確認する
- ローカルからポートフォワーディングしてSSH接続する
詳細な手順
1. VPCとプライベートサブネットを作成
こちらは特別なことはないので省略します。
2. VPCエンドポイントの作成
VPCエンドポイントにアタッチするセキュリティグループを作成
事前に VPCエンドポイントにアタッチするセキュリティグループを作成します
- 「EC2」->「セキュリティグループ」にて、「セキュリティグループを作成」を選択
- 「VPC」には、上記で作成したVPCを選択し、
「インバウンドルール」では、プライベートサブネットのCIDRを指定し、ポートはHTTP(443)を許可とする
SSMのVPCエンドポイントを作成
- 「VPC」->「エンドポイント」にて、「エンドポイントを作成」を選択
- 「エンドポイントを作成」画面が開かれるので、「サービス」にて
com.amazonaws.ap-northeast-1.ssmmessages
を選択する - 「VPC」および「サブネット」は、EC2インスタンスを起動したVPCとサブネットをそれぞれ選択し、
「セキュリティグループ」は、上記で作成したセキュリティグループを選択する
(注:EC2インスタンスにアタッチしたセキュリティグループではない) - 上記の手順で
com.amazonaws.ap-northeast-1.ssm
とcom.amazonaws.ap-northeast-1.ec2messages
も作成する
2. EC2インスタンスを作成
EC2インスタンスがSSMと接続するためのIAMロールを作成
EC2インスタンスにIAMロールをアタッチする必要があるので、IAMロールを作成します。
作成するIAMロールはシンプルに AmazonSSMManagedInstanceCore
ポリシーを付与するだけでOKです。
ここでは、AmazonSSMManagedInstanceCore
のみを付与したIAMロールを AmazonSSMManagedInstanceCoreRole
と名づけることとします。
EC2インスタンスを起動
(こちら、画像等の説明は省略します)
以下の条件で設定してEC2インスタンスを起動します。下記以外の項目手は適当でOKです。
- OSは
AmazonLinux2
を選択する- SSM Manager が既にインストール済み
- キーペアは接続するときに使用するので、作成してもいいし既存のものを使用していもいいが、どれを使用するか覚えておく(ローカルにpemファイルを置いておく)
- ネットワーク設定で、プライベートサブネットを選択する
- IAMロールで上記の
AmazonSSMManagedInstanceCore
をアタッチする - セキュリティグループは、インバウンドルール全て拒否でも大丈夫っぽい?
- 私の環境ではインバウンドルールを全て拒否(インバウンドルールなし)にしても接続できました
- SSMで接続するのでセキュリティグループは使用しないのかもしれない??
4. Session Manager でポートフォワーディングを有効にする
- 「Systems Manager」->「フリートマネージャー」を選択
- マネージノード内に、上記で起動したEC2インスタンスが存在することを確認する
5. ローカルからポートフォワーディングしてSSH接続する
ここからは、ちょっとトリッキーですが(ポートフォワーディングするので当然なのですが・・・)、コンソール(コマンドプロンプトやpowershell)を2つ起動します。
ポートフォワーディングの実行
まず1つ目のコンソールにて、以下の AWS CLI を実行します。
# i-xxxxx は、接続先のEC2インスタンスのID
# 下記では、ポートフォワーディングとしてローカルPCのポート10022を使用する(ローカルPCにて10022が空いていることが前提)
$ aws ssm start-session --target i-xxxxx --document-name AWS-StartPortForwardingSession --parameters portNumber=22,localPortNumber=10022
これで、ローカルPCの 10022 番ポート(localhost:10022
)へアクセスすると、PC内部でSSMを経由して(踏み台にして)接続先のEC2インスタンスへ接続できるようになります。
成功すると、以下のような応答が返ります。(待ち状態になります)
Starting session with SessionId: xxxxx-xxxxx
Port 10022 opened for sessionId xxxxx-xxxxx.
Waiting for connections...
Terminate signal received, exiting.
SSH接続する
上記の状態で、2つ目のコンソールにて、以下を実行します。
# 「.\xxxx.pem」はEC2インスタンスのキーペア
$ ssh -i .\xxxx.pem ec2-user@localhost -p 10022
以上で、プライベートサブネットに配置したEC2インスタンスへローカルPCから接続できます。
コメント