プライベートサブネットのEC2インスタンスに、SSM Session Manager でSSH接続する

クラウド

主題の通り、プライベートサブネットに配置したEC2インスタンスへ、SSM Session Manager で SSH 接続する方法についてです。

前提条件

  • プライベートサブネットのEC2インスタンスに接続する
  • パブリックサブネットは作成しない(NATゲートウェイは使用しない)
  • VPCエンドポイントは使用してもよい
  • EC2インスタンスは AmazonLinux2 とする
  • AWS CLI が使用できる環境とする
  • AWS CLI にアクセスキーが設定されており、SSMが実行できるIAMロールが割り当てられているとする

大まかな戦略

  • EC2インスタンスに、SSMが接続できるようにするIAMロールを付与
  • SSMのVPCエンドポイントを用意し、VPCエンドポイントを経由してSSH接続する
イメージ

VPCAWS CloudPrivate subnetAmazonLinux2SSM APIにアクセスできるようにするロールローカル環境SSH接続InternetSSM Session Manager

大まかな手順

  1. VPCとプライベートサブネットを作成
  2. VPCエンドポイントの作成
  3. EC2インスタンスを作成
    • IAMロールを付与
  4. Session Manager でEC2インスタンスがSSM接続対象になっていることを確認する
  5. ローカルからポートフォワーディングして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.ssmcom.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インスタンスが存在することを確認する
    • 私の環境では、EC2インスタンス起動後、表示されるまで30分程度のディレイが発生しました。結構タイムラグがあるようです。失敗しているのかの区別がつきにくいですが・・・とりあえず表示されていなくても即失敗というわけではなさそうです。

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から接続できます。

コメント

タイトルとURLをコピーしました