🔐

VSCode Remote-SSH + SSM でセキュアにEC2へ接続する方法

に公開

はじめに

この記事では、VSCode の Remote-SSH 拡張機能AWS SSM Session Manager を組み合わせて、Inbound ポートを一切開けずに EC2 インスタンスへセキュアに接続する方法を解説します。

SSM Session Manager のみでリモートの Linux インスタンスにアクセスする場合、以下の課題があります:

  • 📁 ファイルの確認が面倒 - catvim でしか内容を見られない
  • 📂 フォルダ構造が見えない - 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 側

構成図

┌─────────────────┐      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 から接続

  1. VSCode を開く
  2. F1 または Cmd+Shift+P でコマンドパレットを開く
  3. Remote-SSH: Connect to Host... を選択
  4. ec2-ssm-i-xxxxxxxxxxxxxxxxx を入力(または選択)
  5. 接続完了!

初回接続時に 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 CodeOpenAI Codex などの AI コーディングツールを利用できます!

# OpenAI Codex
codex "このファイルのバグを修正して"

# Claude Code
claude "コードレビューをお願い"

Inbound ポートを開けずに、ローカル VSCode から AI コーディングアシスタントが使えるのは最高ですね!

OpenClaw との連携ワークフロー

OpenClaw を EC2 にセットアップしている場合、以下のようなワークフローが実現できます:

  1. OpenClaw に指示: 「このファイルを修正して」(Telegram/Discord から)
  2. OpenClaw が実行: EC2 上でファイルを編集
  3. 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 のターミナルで codexclaude コマンドが見つからない場合、ターミナルがログインシェルとして起動していない可能性があります。

解決方法: 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