SSHキーを使わずにVSCode/Jetbrains系IDEからEC2に接続する方法
背景
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*'
- 管理者権限でPowerShellを起動することが必要です。詳細はこちら
- 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...
を選択します。
続いて、先程作成したSSH Configのremote-ec2
を選択すれば接続できます。
接続確認 -- Jetbrains系IDEの場合
Jetbrains系IDEの場合、Remote Development Gatewayを使用します。
Jetbrains Gatewayを起動し、New Connection
を選択します。
続いて、Connection
のところに新しい設定を追加します。
- Host: 任意の名前、例:
remote-ec2
- Hostname: EC2のユーザー名、例:
ec2-user
- Port: 22
- Authentication:
OpenSSH config and authentification agent
追加したらTest Connection
をクリックし、接続確認をします。
最後にSSHの画面に戻り、先程作成した設定を選択してCheck Connection and Continue
をクリックすれば接続できます。
Jetbrains系IDEの場合、少ないとも2cpu,4GB以上のメモリが必要なのでご注意してください。
スペック条件はこちらを参考にしてください。
まとめ
以上で、OS別、IDE別にSSHキーを使用せずにEC2に接続する方法を紹介しました。
SSHキーの管理が不要だったり、 EC2のIPアドレスの記述も不要になるので、なかなか便利ですね。
Discussion