😊

SSHキーを使わずにVSCode/Jetbrains系IDEからEC2に接続する方法

2023/02/05に公開

背景

AWSのEC2にSSH接続する際、EC2のSSHキー(pemファイル)を使用して接続することが多ですが、SSHキーの管理が面倒だったり、セキュリティ的にもSSHキーを使用するのは避けたい場合があります。
この記事ではOS別、IDE別にSSHキーを使用せずにEC2に接続する方法を紹介します。

前提条件

  • Session Managerが有効化されているEC2インスタンスがあること
  • OpenSSHがインストールされていること

OpenSSHのインストール方法:

  • Windows: Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
  • Mac/Linux: brew install openssh

事前準備 - Remote拡張機能のセットアップ

VSCodeの場合、Remote-SSH拡張機能をインストールします。
Jetbrains系IDEの場合、Remote Development Gatewayを使用します。

Windowsでの設定方法

1. AWS CLIとSession Manager Pluginのインストール

wingetでより簡単にインストールできので、PowerShellを起動し、以下のコマンドを実行します。

winget install -e --id=Amazon.AWSCLI
winget install -e --id=Amazon.SessionManagerPlugin

インストール検証、 自分の場合なかなか反映されなかったので、再起動してから検証できました。

aws --version
session-manager-plugin --version

2. SSH 接続スクリプトの作成

Windowsの場合、C:\Users\<username>\.ssh\にてssm-ec2-proxy-command.ps1ファイルを作成し、下記のスクリプトを作成します。

  • AWS_PROFILE: AWSのプロファイル名
  • AVAILABILITY_ZONE: 接続先のEC2インスタンスのAZ (例:ap-northeast-1a)
  • <public key>: 自分の公開鍵のパス (例:id_rsa.pub), 公開鍵の作成はこちらを参考してください
  • <username>: Windowsのユーザー名
$AWS_PROFILE="default"
$AVAILABILITY_ZONE="" # リージョンではなくAZを指定する
$PUBLIC_KEY_PATH="file://C:\Users\<username>\.ssh\<public key>"

$ssh_user = $args[0]
$ssh_port = $args[1]
$ec2_instance_id = $args[2]

aws ec2-instance-connect send-ssh-public-key `
    --instance-id "$ec2_instance_id" `
    --availability-zone "$AVAILABILITY_ZONE" `
    --instance-os-user "$ssh_user" `
    --ssh-public-key "$PUBLIC_KEY_PATH" `
    --profile "$AWS_PROFILE"

aws ssm start-session `
  --target "$ec2_instance_id" `
  --document-name 'AWS-StartSSHSession' `
  --parameters "portNumber=$ssh_port"

3. SSH Configの設定

SSH Configに以下の設定を追加します。
Amazon Linux以外のOSはUserの値を適宜変更してください。

Windowsの場合、C:\Users\<username>\.ssh\configに以下の設定を追加します。

  • <username>: Windowsのユーザー名
  • <instance_id>: 接続先のEC2インスタンスのID
Host remote-ec2
  ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File C:\Users\<username>\.ssh\ssm-ec2-proxy-command.ps1 %r %p <instance_id>
  User ec2-user
  ForwardAgent yes
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no

Mac/Linuxでの設定方法

1. AWS CLIとSession Manager Pluginのインストール

Homebrewでインストールします。

brew install awscli session-manager-plugin

インストール検証

aws --version
session-manager-plugin --version

2. SSH 接続スクリプトの作成

Macの場合、~/.ssh/にてssm-ec2-proxy-command.shファイルを作成し、下記のスクリプトを作成します。

  • AWS_PROFILE: AWSのプロファイル名
  • AVAILABILITY_ZONE: 接続先のEC2インスタンスのAZ (例:ap-northeast-1a)
  • <public key>: 自分の公開鍵のパス (例:id_rsa.pub), 公開鍵の作成はこちらを参考してください
  • <username>: Macのユーザー名
#!/bin/bash

AWS_PROFILE=default
AVAILABILITY_ZONE= # リージョンではなくAZを指定する
PUBLIC_KEY_PATH=file:///Users/<username>/.ssh/<public key>

USER=$1
PORT=$2
INSTANCE_ID=$3

aws ec2-instance-connect send-ssh-public-key \
    --instance-id ${INSTANCE_ID} \
    --availability-zone ${AVAILABILITY_ZONE} \
    --instance-os-user ${USER} \
    --ssh-public-key ${PUBLIC_KEY_PATH} --profile ${AWS_PROFILE} > /dev/null; 

aws ssm start-session --profile ${AWS_PROFILE} \
    --target ${INSTANCE_ID} --profile ${AWS_PROFILE}  \
    --document-name AWS-StartSSHSession --parameters portNumber=${PORT}

権限付与

chmod 700 ./ssm-ec2-proxy-command.sh

2. SSH Configの設定

SSH Configに以下の設定を追加します。
Amazon Linux以外の場合はUserの値を適宜変更してください。

Macの場合、~/.ssh/configに以下の設定を追加します。

  • <instance id>: 接続先のEC2インスタンスのID
Host remote-ec2
    ProxyCommand sh -c "~/.ssh/ssm-ec2-proxy-command.sh %r %p <instance id>"
    User ec2-user
    ForwardAgent yes
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no

以上で設定は完了です。

接続確認 -- VSCodeの場合

VSCodeの場合、Remote-SSH拡張機能を使用します。
Shift + Command/Control + Pを押下し、Remote-SSH: Connect to Host...を選択します。

image
続いて、先程作成したSSH Configのremote-ec2を選択すれば接続できます。
image

接続確認 -- Jetbrains系IDEの場合

Jetbrains系IDEの場合、Remote Development Gatewayを使用します。
Jetbrains Gatewayを起動し、New Connectionを選択します。
image

続いて、Connectionのところに新しい設定を追加します。

  • Host: 任意の名前、例:remote-ec2
  • Hostname: EC2のユーザー名、例:ec2-user
  • Port: 22
  • Authentication: OpenSSH config and authentification agent

image
image

追加したらTest Connectionをクリックし、接続確認をします。
image

最後にSSHの画面に戻り、先程作成した設定を選択してCheck Connection and Continueをクリックすれば接続できます。
Jetbrains系IDEの場合、少ないとも2cpu,4GB以上のメモリが必要なのでご注意してください。
スペック条件はこちらを参考にしてください。
image

まとめ

以上で、OS別、IDE別にSSHキーを使用せずにEC2に接続する方法を紹介しました。
SSHキーの管理が不要だったり、 EC2のIPアドレスの記述も不要になるので、なかなか便利ですね。

Discussion