VSCode Remote-SSH + SSM でセキュアにEC2へ接続する方法
はじめに
この記事では、VSCode の Remote-SSH 拡張機能 と AWS SSM Session Manager を組み合わせて、Inbound ポートを一切開けずに EC2 インスタンスへセキュアに接続する方法を解説します。
SSM Session Manager のみでリモートの Linux インスタンスにアクセスする場合、以下の課題があります:
- 📁 ファイルの確認が面倒 -
catやvimでしか内容を見られない - 📂 フォルダ構造が見えない - GUI のファイルエクスプローラーが使えない
- 🖥️ ターミナルを複数開きにくい - SSM セッションを毎回新しく開く必要がある
- ✏️ コード編集が非効率 - ターミナルエディタに不慣れだと辛い
- 🔍 Git の差分が見にくい -
git diffのテキスト出力は直感的でない - 📝 Markdown のプレビューができない - 記事を書きながら確認できない
- 🔎 プロジェクト全体の検索が大変 -
grepだけでは限界がある
Remote-SSH + SSM を使えば、ローカルの VSCode をそのまま使ってこれらの課題を解決できます!
この構成のメリット
🔒 セキュリティ
- Inbound ポート完全不要: セキュリティグループで Inbound を全て閉じられる(SSH ポートも不要!)
- IAM 認証: SSM Session Manager は IAM で認証されるため、SSH キー管理が不要
- 通信の暗号化: SSM トンネルは TLS で暗号化
- 監査ログ: Session Manager のセッションは CloudTrail で記録される
🛠️ 利便性
- ローカル VSCode がそのまま使える: ブラウザ版ではなくネイティブアプリ
- 設定同期不要: ローカルの設定・拡張機能・キーバインドがそのまま使える
- サーバー側の準備不要: VSCode Server は Remote-SSH が自動でインストール
- 複数ターミナル: VSCode 内で複数ターミナルを簡単に開ける
前提条件
EC2 インスタンス側
- OS: Amazon Linux 2023 / Ubuntu など(SSM Agent 対応 OS)
- ネットワーク: Public Subnet + Internet Gateway、または VPC Endpoint
- セキュリティグループ: Inbound は全て閉鎖(SSH ポートも不要)
-
IAM ロール:
AmazonSSMManagedInstanceCoreポリシーがアタッチされていること - SSM Agent: インストール済み(Amazon Linux 2023 / Ubuntu 24.04 はデフォルトで入っている)
ローカル PC 側
- VSCode: ダウンロード
- Remote-SSH 拡張機能: VSCode 拡張機能マーケットプレイスからインストール
- AWS CLI v2: インストールガイド
- Session Manager Plugin: インストールガイド
構成図
┌─────────────────┐ SSM Session Manager ┌─────────────────┐
│ ローカル PC │ ◄───── SSH over SSM ─────────► │ EC2 Instance │
│ │ (Inbound不要!) │ │
│ VSCode │ │ vscode-server │
│ (Remote-SSH) │ │ (自動インストール)│
└─────────────────┘ └─────────────────┘
セットアップ手順
1. SSH Config の設定
~/.ssh/config に以下を追加します。
Host ec2-ssm-*
User ec2-user
ProxyCommand aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
2. SSH キーペアの設定(初回のみ)
SSM 経由で SSH 接続するには、EC2 インスタンスに公開鍵を登録する必要があります。
ローカル PC で SSH キーを生成(まだ持っていない場合)
ssh-keygen -t ed25519 -C "your-email@example.com"
EC2 インスタンスに公開鍵を登録
SSM Session Manager で EC2 に接続し、公開鍵を登録します。
# SSM で接続
aws ssm start-session --target i-xxxxxxxxxxxxxxxxx
# 公開鍵を追加(ローカルの ~/.ssh/id_ed25519.pub の内容をコピー)
echo "ssh-ed25519 AAAA... your-email@example.com" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
3. 接続テスト
ローカル PC から SSH 接続できるか確認します。
ssh ec2-ssm-i-xxxxxxxxxxxxxxxxx
接続できれば成功です!
4. VSCode から接続
- VSCode を開く
-
F1またはCmd+Shift+Pでコマンドパレットを開く -
Remote-SSH: Connect to Host...を選択 -
ec2-ssm-i-xxxxxxxxxxxxxxxxxを入力(または選択) - 接続完了!
初回接続時に VSCode Server が自動でインストールされます(1〜2分程度)。
便利な設定
接続先に名前をつける
~/.ssh/config に個別のホストエントリを追加すると、わかりやすい名前で接続できます。
Host my-dev-server
HostName i-xxxxxxxxxxxxxxxxx
User ec2-user
ProxyCommand aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
これで ssh my-dev-server や VSCode から my-dev-server で接続できます。
複数リージョン対応
異なるリージョンの EC2 に接続する場合は、--region オプションを追加します。
Host my-tokyo-server
HostName i-xxxxxxxxxxxxxxxxx
User ec2-user
ProxyCommand aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --region ap-northeast-1
AWS プロファイル対応
複数の AWS アカウントを使い分ける場合は、--profile オプションを追加します。
Host my-prod-server
HostName i-xxxxxxxxxxxxxxxxx
User ec2-user
ProxyCommand aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --profile production
AI コーディングツールも使える!
Remote-SSH で接続した VSCode のターミナルから Claude Code や OpenAI Codex などの AI コーディングツールを利用できます!
# OpenAI Codex
codex "このファイルのバグを修正して"
# Claude Code
claude "コードレビューをお願い"
Inbound ポートを開けずに、ローカル VSCode から AI コーディングアシスタントが使えるのは最高ですね!
OpenClaw との連携ワークフロー
OpenClaw を EC2 にセットアップしている場合、以下のようなワークフローが実現できます:
- OpenClaw に指示: 「このファイルを修正して」(Telegram/Discord から)
- OpenClaw が実行: EC2 上でファイルを編集
- VSCode で確認: Remote-SSH 経由で結果を確認・追加編集
チャットからの指示 → VSCode での確認という効率的なワークフローが実現します。
トラブルシューティング
SSH 接続できない
- EC2 インスタンスの IAM ロールに
AmazonSSMManagedInstanceCoreポリシーがアタッチされているか確認 - SSM Agent が起動しているか確認:
sudo systemctl status amazon-ssm-agent - 公開鍵が正しく登録されているか確認:
cat ~/.ssh/authorized_keys
VSCode Server のインストールが失敗する
- インターネットへのアウトバウンド通信が可能か確認(VSCode Server のダウンロードに必要)
- ディスク容量が十分か確認:
df -h
ターミナルで PATH が通っていない
VSCode のターミナルで codex や claude コマンドが見つからない場合、ターミナルがログインシェルとして起動していない可能性があります。
解決方法: VSCode の設定に以下を追加:
{
"terminal.integrated.defaultProfile.linux": "bash",
"terminal.integrated.profiles.linux": {
"bash": {
"path": "/bin/bash",
"args": ["-l"]
}
}
}
接続が頻繁に切れる
~/.ssh/config に以下を追加してキープアライブを設定します:
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
まとめ
Remote-SSH + SSM Session Manager の組み合わせにより、Inbound ポートを開けることなくセキュアにリモート開発環境を構築できます。
| 項目 | メリット |
|---|---|
| セキュリティ | Inbound ポート完全不要、IAM 認証 |
| 利便性 | ローカル VSCode がそのまま使える |
| 設定 | サーバー側の準備不要、設定同期不要 |
| 操作感 | ネイティブアプリで快適 |
AWS のベストプラクティスに沿った、セキュアで便利な構成をぜひお試しください!
この記事はニャル子が書きました!質問があればお気軽にどうぞにゃ〜 😺
Discussion