VS CodeからAmazon EC2へ接続する場合は、Microsoftが提供している「Remote – SSH」拡張機能を利用する方法が一般的です。
Remote – SSHを利用すると、EC2上にあるファイルをローカルPCへコピーせず、VS Codeから直接開いて編集できます。
さらに、EC2上でターミナルを実行したり、Gitを操作したり、プログラムを実行したりできるため、リモートサーバーを開発環境として利用したい場合にも便利です。
ここでは、Linux系のEC2インスタンスを対象として、VS CodeからEC2へ接続する基本的な方法を解説します。
VS CodeからEC2へ接続する仕組み
VS CodeのRemote – SSHを利用すると、ローカルPCからSSH経由でEC2へ接続できます。
構成は、おおむね次のようになります。
ローカルPC
│
├─ VS Code
│ └─ Remote - SSH
│
└─ SSH接続
│
▼
EC2インスタンス
│
├─ Linux
├─ VS Code Server
└─ プロジェクトファイル
VS Codeの画面自体はローカルPC上で動作します。
一方で、EC2上のファイル操作やターミナル、一部の拡張機能、言語サーバーなどはリモート側で動作します。
そのため、SFTPでファイルを毎回アップロード・ダウンロードする方法とは異なり、EC2上の開発環境をそのままVS Codeから扱えるのが大きな特徴です。
VS CodeからEC2へ接続するために必要なもの
VS Code
最初に、ローカルPCへVisual Studio Codeをインストールします。
Windows、macOS、Linuxのいずれでも利用できます。
Remote – SSH拡張機能
VS Codeを起動し、Extensionsから「Remote – SSH」を検索してインストールします。
Remote – SSHはMicrosoftが提供しているVS Code公式のリモート開発用拡張機能です。
Remote – SSHを含む「Remote Development」拡張機能パックをインストールしても構いません。
SSHクライアント
Remote – SSHを利用するには、ローカルPCでOpenSSH互換のSSHクライアントが使用できる必要があります。
Windowsの場合は、PowerShellまたはコマンドプロンプトで次のコマンドを実行すると確認できます。
ssh -V
OpenSSHのバージョン情報が表示されれば、SSHクライアントを利用できます。
EC2インスタンス
接続先となるEC2インスタンスも必要です。
代表的なLinux系OSとしては、次のようなものがあります。
Amazon Linux
Ubuntu
Debian
Red Hat Enterprise Linux
なお、この記事ではLinux系EC2へのSSH接続を前提としています。
EC2の接続情報を確認する
VS Codeから接続する前に、AWSマネジメントコンソールでEC2の接続情報を確認します。
AWSマネジメントコンソールから次の順番で対象インスタンスを開きます。
EC2
↓
インスタンス
↓
対象のEC2インスタンス
主に確認する情報は次のとおりです。
パブリックIPv4アドレス
または
パブリックIPv4 DNS
SSHユーザー名
SSH秘密鍵
例えば、EC2のパブリックIPv4アドレスが次のような値だったとします。
203.0.113.10
一般的な構成では、このIPアドレスをSSHの接続先として指定します。
EC2のSSHユーザー名を確認する
EC2へSSH接続するときは、OSに対応したユーザー名を指定する必要があります。
Amazon Linuxの場合
Amazon Linuxでは、一般的に次のユーザー名を使用します。
ec2-user
Ubuntuの場合
Ubuntuでは、一般的に次のユーザー名を使用します。
ubuntu
その他のLinuxの場合
代表的には次のようなユーザー名が使用されます。
| OS・AMI | 代表的なユーザー名 |
|---|---|
| Amazon Linux | ec2-user |
| Ubuntu | ubuntu |
| Debian | admin |
| CentOS | centosまたはec2-user |
| Fedora | fedoraまたはec2-user |
| RHEL | ec2-userまたはroot |
| Rocky Linux | rocky |
| Bitnami | bitnami |
実際のユーザー名は使用しているAMIによって異なる場合があります。
接続できない場合は、利用しているAMIのドキュメントを確認してください。
SSH秘密鍵を準備する
EC2インスタンス作成時にキーペア認証を設定している場合は、対応するSSH秘密鍵を使用します。
AWSで作成したキーペアの場合は、次のようなファイルを利用することがあります。
example.pem
ただし、EC2へのSSH接続で.pemファイルが必ず必要というわけではありません。
OpenSSH形式の鍵を利用する場合や、EC2 Instance Connectなど別の認証方式を利用する構成もあります。
一般的なEC2キーペア認証を利用している場合は、インスタンス作成時に指定したキーペアに対応する秘密鍵を用意してください。
EC2のセキュリティグループを確認する
一般的なSSH接続ではTCPの22番ポートを使用します。
そのため、EC2に設定されているセキュリティグループで、ローカルPCからのSSH通信を許可する必要があります。
SSHのインバウンドルールを設定する
AWSマネジメントコンソールから次のように確認します。
EC2
↓
インスタンス
↓
対象インスタンス
↓
セキュリティ
↓
セキュリティグループ
↓
インバウンドルール
例えば、次のように設定します。
タイプ:SSH
プロトコル:TCP
ポート:22
ソース:自分のIPアドレス
自宅や会社のグローバルIPアドレスを指定すれば、そのIPアドレスからのみSSH接続を許可できます。
0.0.0.0/0はできるだけ避ける
次の設定を使用すると、インターネット上のすべてのIPv4アドレスからSSH接続を試行できる状態になります。
0.0.0.0/0
開発用途であっても、基本的には避けた方が安全です。
可能であれば「マイIP」などを指定し、必要な接続元だけに制限しましょう。
ターミナルからEC2へSSH接続する
VS Codeを設定する前に、ターミナルから通常のSSH接続が成功するか確認しておくことをおすすめします。
こうしておくと、接続できない場合に、
AWSやSSH設定の問題
なのか、
VS CodeのRemote - SSHの問題
なのかを切り分けやすくなります。
Amazon Linuxへ接続する場合
例えば、秘密鍵が~/.ssh/example.pemにあり、EC2のIPアドレスが203.0.113.10の場合は次のようにします。
ssh -i ~/.ssh/example.pem ec2-user@203.0.113.10
Ubuntuへ接続する場合
Ubuntuなら、次のようになります。
ssh -i ~/.ssh/example.pem ubuntu@203.0.113.10
SSH接続に成功すると、EC2側のシェルが表示されます。
SSH configを設定する
毎回長いSSHコマンドを入力する代わりに、SSHの設定ファイルへEC2を登録しておくと便利です。
一般的には次のファイルを使用します。
~/.ssh/config
Windowsでは通常、次の場所になります。
C:\Users\ユーザー名\.ssh\config
SSH configの設定例
例えば、次のように記述します。
Host my-ec2
HostName 203.0.113.10
User ec2-user
IdentityFile ~/.ssh/example.pem
それぞれの設定には次の意味があります。
Host
接続時に使用する任意の名前
HostName
EC2のIPアドレスまたはDNS名
User
SSHログインに使用するユーザー名
IdentityFile
SSH秘密鍵の保存場所
設定後は、次のコマンドだけで接続できます。
ssh my-ec2
Remote – SSHでも、このSSH configをそのまま利用できます。
VS CodeからEC2へ接続する
SSH接続が正常に動作することを確認したら、VS CodeからEC2へ接続します。
コマンドパレットを開く
WindowsやLinuxでは、次のショートカットを使用します。
Ctrl + Shift + P
macOSでは次のショートカットです。
Command + Shift + P
コマンドパレットが開いたら、次のコマンドを検索します。
Remote-SSH: Connect to Host...
接続するEC2を選択する
SSH configに、
Host my-ec2
を設定していれば、接続先一覧にmy-ec2が表示されます。
これを選択するとSSH接続が開始されます。
初回接続時にリモートOSを尋ねられた場合、Amazon LinuxやUbuntuであれば「Linux」を選択します。
ホストキーを確認する
初めて接続するEC2では、SSHホストキーの確認が表示されることがあります。
接続先が正しいことを確認したうえで承認します。
可能であれば、接続先のホストキーフィンガープリントも確認するとより安全です。
参考サイト
VSCode の Remote – SSH 機能を使って EC2 上で開発する – サーバーワークスエンジニアブログ
VS Code ServerがEC2側にセットアップされる
Remote – SSHでEC2への接続に成功すると、リモート環境でVS Codeを利用するためのVS Code Server関連コンポーネントがセットアップされます。
通常は自動的に処理されます。
接続後、VS Codeの左下などに、
SSH: my-ec2
のような表示が出ていれば、リモート接続できています。
なお、初回セットアップ時などにはVS Code Server関連コンポーネントの取得が必要です。
ネットワーク制限やプロキシがある環境でセットアップできない場合は、Remote – SSHのログを確認してください。
EC2上のフォルダをVS Codeで開く
EC2へ接続しただけでは、まだ作業対象のフォルダは開かれていません。
VS Codeから、
File
↓
Open Folder
を選択して、EC2上のプロジェクトディレクトリを指定します。
Amazon Linuxなら、例えば次のようなディレクトリです。
/home/ec2-user/myapp
Ubuntuなら次のような構成もあります。
/home/ubuntu/myapp
フォルダを開くと、通常のVS Codeと同じようにエクスプローラーからEC2上のファイルを操作できます。
VS CodeのターミナルをEC2上で利用する
Remote – SSHで接続している状態でVS Codeのターミナルを開くと、基本的にはリモート側でコマンドが実行されます。
例えば、
pwd
を実行すると、
/home/ec2-user/myapp
など、EC2側のパスが表示されます。
そのため、次のようなコマンドもEC2上で実行できます。
git pull
npm install
npm run dev
python app.py
bundle install
docker compose up
つまり、VS CodeはローカルPC上で操作しながら、実際の開発環境はEC2側に置くことができます。
VS Codeの拡張機能はローカル側とEC2側に分かれる
Remote – SSHを利用する場合、VS Code拡張機能の実行場所にも注意が必要です。
一部の拡張機能はローカルPC側で動き、一部はEC2側で動作します。
ローカル側で動作する拡張機能
テーマなど、VS Codeのユーザーインターフェースに関係する拡張機能はローカル側で動作することがあります。
EC2側で動作する拡張機能
次のような開発関連の拡張機能は、リモート側へインストールして利用する場合があります。
Python
ESLint
PHP
Ruby
Go
Remote – SSHで接続してExtensions画面を開くと、ローカル環境とSSH接続先が分けて表示されます。
利用する言語や開発環境に応じて、EC2側へ必要な拡張機能をインストールしましょう。
EC2上のWebアプリへローカルPCからアクセスする
Remote – SSHでは、SSHポートフォワーディングを利用してEC2上のWebアプリへアクセスできます。
例えば、EC2上で次のように開発サーバーを起動したとします。
npm run dev
アプリケーションがEC2側の3000番ポートで動作している場合、
EC2:3000
↓
SSHポートフォワーディング
↓
ローカルPC
という形で転送できます。
VS Codeの「Ports」機能などから3000番ポートをフォワードすれば、ローカルPCのブラウザからアプリを確認できます。
なお、ポートが常に自動転送されるとは限りません。
必要に応じてPorts画面から手動で設定してください。
EC2のIPアドレスが変わる場合の対処法
EC2に自動割り当てされる通常のパブリックIPv4アドレスは、インスタンスを停止してから再び起動すると変更される場合があります。
例えばSSH configで、
Host my-ec2
HostName 203.0.113.10
としている場合、IPアドレスが変われば設定の修正が必要になります。
Elastic IPを利用する
固定的なパブリックIPアドレスが必要なら、Elastic IPを利用する方法があります。
Elastic IPをEC2へ関連付ければ、通常の停止・起動によるIPアドレス変更を避けられます。
ただし、現在のAWSではElastic IPを含むパブリックIPv4アドレスに料金が発生する場合があります。
実際に利用する際は、最新のAWS料金体系を確認してください。
SSH秘密鍵の権限エラーを解決する
macOSやLinuxでは、秘密鍵のアクセス権限が緩すぎるとSSH接続を拒否されることがあります。
例えば、次のようなエラーです。
Permissions 0644 for 'example.pem' are too open.
その場合は、次のように権限を制限します。
chmod 400 ~/.ssh/example.pem
重要なのは、秘密鍵を他のユーザーから簡単に読み取れない状態にすることです。
Permission denied (publickey)が表示される場合
EC2への接続時に、
Permission denied (publickey)
と表示される場合があります。
主な原因としては次のようなものがあります。
SSHユーザー名が間違っている
指定している秘密鍵が違う
IdentityFileのパスが間違っている
EC2作成時のキーペアと秘密鍵が一致していない
例えばAmazon Linuxに対して、
ssh ubuntu@203.0.113.10
としている場合、接続できない可能性があります。
Amazon Linuxなら通常は、
ssh ec2-user@203.0.113.10
を使用します。
Connection timed outになる場合
次のようなエラーが表示されることもあります。
ssh: connect to host xxx.xxx.xxx.xxx port 22:
Connection timed out
この場合は、SSH認証まで到達する前のネットワーク部分で問題が発生している可能性があります。
確認するポイントは次のとおりです。
EC2インスタンスが起動しているか
IPアドレスまたはDNS名が正しいか
セキュリティグループで22番ポートが許可されているか
現在の接続元IPアドレスが許可されているか
EC2に外部から到達可能なネットワーク経路があるか
ルートテーブルが適切か
ネットワークACLでSSH通信が遮断されていないか
特に、自宅回線などではグローバルIPアドレスが変化することがあります。
セキュリティグループへ登録しているIPアドレスが古くなっていないか確認しましょう。
Remote – SSHのログを確認する
通常のSSH接続は成功するのにVS Codeから接続できない場合は、Remote – SSHのログを確認します。
VS Codeから、
View
↓
Output
を開き、出力対象として「Remote – SSH」を選択します。
ログには、例えば次のような情報が表示されることがあります。
Permission denied
Connection timed out
Could not establish connection
Failed to install VS Code Server
接続トラブルを調査するときは、このログが重要な手掛かりになります。
EC2のメモリ不足にも注意する
SSH接続自体には成功しても、EC2のメモリやCPUが不足しているとVS Code Serverや言語サーバーが正常に動作しないことがあります。
特に、小さなEC2インスタンスタイプで多数の拡張機能を利用する場合は注意が必要です。
VS Code Serverだけでなく、
Node.js
Python
Docker
データベース
言語サーバー
などを同時に動かす場合は、余裕のあるメモリ容量を確保した方が安定します。
プライベートサブネットのEC2へ接続する方法
ここまで説明した方法は、EC2にパブリックIPアドレスがあり、ローカルPCからSSH接続できる構成を主に想定しています。
本番環境では、EC2へパブリックIPを割り当てず、プライベートサブネットに配置する場合もあります。
その場合、自宅PCなどからプライベートIPへ直接SSH接続することは通常できません。
踏み台サーバーを利用する
代表的な方法の一つが、踏み台サーバーを経由する構成です。
ローカルPC
↓
踏み台EC2
↓
プライベートEC2
OpenSSHではProxyJumpを利用できます。
例えば次のように設定します。
Host bastion
HostName 203.0.113.10
User ec2-user
IdentityFile ~/.ssh/bastion.pem
Host app-server
HostName 10.0.1.100
User ec2-user
IdentityFile ~/.ssh/app.pem
ProxyJump bastion
設定後は、
ssh app-server
で踏み台サーバーを経由して接続できます。
Remote – SSHからもapp-serverを選択すれば接続できます。
EC2 Instance Connect Endpointを利用する
AWSでは、EC2 Instance Connect Endpointを利用してプライベートEC2へ接続する方法もあります。
この方法では、EC2へパブリックIPを付けずに接続できるため、踏み台サーバーを持たない構成を検討できます。
IAMやネットワーク設定と組み合わせてアクセスを管理できる点も特徴です。
VPNなどを利用する
企業環境などでは、VPNを利用してローカルPCをVPCネットワークへ接続する方法もあります。
VPN経由でEC2のプライベートIPへ到達できれば、通常のSSHと同様にRemote – SSHを利用できます。
EC2 Instance Connectと通常のSSHの違い
EC2 Instance Connectは、IAMを利用してSSH公開鍵を一時的にインスタンスへ送信できる仕組みです。
従来のSSHでは、あらかじめEC2側へ公開鍵を登録し、その公開鍵に対応する秘密鍵を使ってログインする方法が一般的です。
一方、EC2 Instance Connectでは接続時に公開鍵を送信できるため、SSH鍵管理を柔軟に行えます。
ただし、EC2 Instance Connectを利用する場合でも、SSHクライアントやSSH鍵を組み合わせる構成があります。
「秘密鍵が一切不要になる機能」と単純に考えないようにしましょう。
Systems Managerを利用する方法もある
AWS Systems Manager Session Managerを利用すれば、EC2へ管理用セッションを確立することもできます。
ただし、VS CodeのRemote – SSHがSystems Managerへ直接自動接続するわけではありません。
Remote – SSHと組み合わせる場合は、SSHのProxyCommandなどを利用した追加設定が必要になることがあります。
そのため、初めてVS CodeからEC2へ接続するのであれば、まずは通常のSSH接続から始めると理解しやすいでしょう。
VS CodeからEC2へ接続する基本的な流れ
VS CodeからEC2へ接続する基本手順をまとめると、次のようになります。
- EC2インスタンスを起動する。
- EC2へ到達できるIPアドレスやネットワーク経路を確認する。
- セキュリティグループで必要なSSH通信を許可する。
- SSH秘密鍵を準備する。
- ターミナルからSSH接続できることを確認する。
- VS CodeへRemote – SSHをインストールする。
~/.ssh/configへEC2の接続情報を登録する。- 「Remote-SSH: Connect to Host…」から接続する。
- EC2上のプロジェクトフォルダを開く。
- 必要な拡張機能をEC2側へインストールする。
Amazon Linuxへ接続するシンプルなSSH configなら、例えば次のようになります。
Host my-ec2
HostName 203.0.113.10
User ec2-user
IdentityFile ~/.ssh/example.pem
この状態でターミナルから、
ssh my-ec2
と実行して接続できれば、VS CodeのRemote – SSHからも接続しやすくなります。
VS CodeとEC2を組み合わせればリモート開発がしやすくなる
VS CodeのRemote – SSHを利用すると、ローカルPCからEC2上の開発環境を直接操作できます。
ソースコードだけでなく、
Git
Node.js
Python
Ruby
PHP
Docker
データベース
などをEC2側へまとめて配置できるため、ローカルPCの環境差異を減らしたい場合にも便利です。
一方で、インターネット上へSSHポートを無制限に公開することは避け、セキュリティグループの接続元を制限することが重要です。
また、本番環境や重要なシステムでは、パブリックIPへの直接SSHだけでなく、EC2 Instance Connect Endpoint、VPN、踏み台サーバー、Systems Managerなどを利用した構成も検討するとよいでしょう。
まずは「ターミナルからSSH接続できる状態」を作り、その後にVS CodeのRemote – SSHを設定するのが、トラブルを少なくするための基本的な進め方です。
以上、VS CodeからEC2に接続する方法についてでした。
最後までお読みいただき、ありがとうございました。









