EC2へのSSH接続が失敗する原因を特定し、5分で復旧させる方法

AWS EC2インスタンスへのSSH接続エラーは、セキュリティグループ設定、キーペア権限、インスタンスの状態など複数の原因が考えられます。この記事では、最も一般的な7つの原因と実践的な解決手順を紹介します。これらの対策を順に実施すれば、ほぼすべてのSSH接続問題を解決できます。

SSH接続エラーの診断フロー

まず、以下のコマンドで接続を試みます。エラーメッセージを記録してください。

# 詳細ログを表示して接続を試みる
ssh -vvv -i /path/to/key.pem ec2-user@your-instance-public-ip

-vvvフラグで詳細なデバッグ情報が表示され、問題の特定が容易になります。表示されるエラーメッセージから、以下の原因のいずれかを判定します。

原因1: セキュリティグループのインバウンドルール設定ミス

症状と確認方法

「Connection timed out」や「No route to host」と表示される場合、セキュリティグループでSSHポート(22番)がブロックされている可能性があります。

AWS管理コンソールで以下を確認してください:

  • EC2インスタンスの詳細ページから「セキュリティグループ」を確認
  • 「インバウンドルール」タブを開く
  • プロトコルがTCP、ポートが22、ソースが適切に設定されているか確認

解決手順

セキュリティグループが正しく設定されていない場合、ルールを追加します:

  1. AWS管理コンソールから該当のセキュリティグループを選択
  2. 「インバウンドルール」→「ルールを編集」をクリック
  3. 「ルールを追加」をクリック
  4. 以下のように設定:
    • タイプ:SSH
    • プロトコル:TCP
    • ポート範囲:22
    • ソース:自分のIPアドレス(xxx.xxx.xxx.xxx/32)または特定のセキュリティグループ
  5. 「ルールを保存」をクリック

セキュリティベストプラクティス: 0.0.0.0/0(すべてのIPアドレス)からのアクセスを許可するのは避けてください。必ず特定のIPまたは社内ネットワークに限定してください。

原因2: キーペアファイルのパーミッション設定エラー

症状と確認方法

「Permission denied (publickey)」というエラーが出る場合、キーペアファイルのパーミッションが正しくない可能性があります。

以下のコマンドでファイルのパーミッションを確認してください:

ls -la /path/to/key.pem

正しいパーミッションは-rw-------(600)です。他の形式(640、644など)ではSSH接続が拒否されます。

解決手順

# キーペアのパーミッションを600に設定
chmod 600 /path/to/key.pem

# 確認
ls -la /path/to/key.pem
# -rw------- 1 user group 1697 Dec 10 14:00 /path/to/key.pem

Windowsユーザーの場合、GitBashやPowerShellで同様の設定が可能です。

原因3: インスタンスのパブリックIPアドレスが割り当てられていない

症状と確認方法

「Could not resolve hostname」というエラーが出る場合、インスタンスにパブリックIPが割り当てられていない可能性があります。

AWS管理コンソールで確認する方法:

  • EC2ダッシュボード→「インスタンス」を選択
  • 対象インスタンスをクリック
  • 詳細ページの「パブリックIPv4アドレス」フィールドを確認
  • 「割り当てなし」と表示されている場合、パブリックIPが未割り当て

解決手順

Elastic IPアドレスを割り当てる方法:

  1. 左メニューから「ネットワークとセキュリティ」→「Elastic IP」を選択
  2. 「Elastic IPアドレスを割り当てる」をクリック
  3. デフォルト設定のまま「割り当てる」をクリック
  4. 割り当てたElastic IPを選択し、「アクション」→「アドレスの関連付け」をクリック
  5. インスタンスを選択して「関連付ける」をクリック
# AWS CLIで確認する方法
aws ec2 describe-instances --instance-ids i-1234567890abcdef0 \
  --query 'Reservations[0].Instances[0].[PublicIpAddress,PrivateIpAddress]'

原因4: キーペアのホストキー検証エラー

症状と確認方法

「Host key verification failed」というメッセージが表示される場合、known_hostsファイルに該当ホストの公開鍵が登録されていません。

解決手順

# 初回接続時に自動的にホストキーを追加
ssh -o StrictHostKeyChecking=accept-new -i /path/to/key.pem ec2-user@your-instance-public-ip

# または、known_hostsから該当エントリを削除して再接続
ssh-keygen -R your-instance-public-ip
ssh -i /path/to/key.pem ec2-user@your-instance-public-ip

原因5: インスタンスが実行中でない、またはステータスチェック失敗

症状と確認方法

AWS管理コンソールで以下を確認してください:

  • インスタンスのステータス(緑色の「running」であることを確認)
  • ステータスチェック結果(システムステータスチェック、インスタンスステータスチェックが「passed」であることを確認)

「impaired」や「stopped」と表示されている場合、インスタンスが正常に起動していません。

解決手順

# AWS CLIでインスタンス状態を確認
aws ec2 describe-instances --instance-ids i-1234567890abcdef0 \
  --query 'Reservations[0].Instances[0].[State.Name,InstanceStatus.SystemStatus.Status]'

# インスタンスが停止している場合は起動
aws ec2 start-instances --instance-ids i-1234567890abcdef0

ステータスチェックが「failed」の場合、通常インスタンスの再起動が必要です:

aws ec2 reboot-instances --instance-ids i-1234567890abcdef0

原因6: キーペアファイルの形式が正しくない

症状と確認方法

古い形式のキーペア(PuTTYやその他ツールで生成)を使用している場合、OpenSSHフォーマットに変換が必要な場合があります。

# キーペアのフォーマットを確認
head -1 /path/to/key.pem

# OpenSSH形式の場合:-----BEGIN OPENSSH PRIVATE KEY-----
# PEM形式の場合:-----BEGIN RSA PRIVATE KEY-----

解決手順

PEM形式をOpenSSH形式に変換する場合:

ssh-keygen -p -N "" -m pem -f /path/to/key.pem

逆に、OpenSSH形式をPEM形式に変換する場合:

ssh-keygen -p -N "" -m pem -f /path/to/key.pem

原因7: ユーザー名が誤っている

症状と確認方法

「Permission denied (publickey)」が表示される場合、SSH接続時のユーザー名が正しくない可能性があります。AMI(Amazon Machine Image)によってデフォルトユーザーが異なります。

AMIの種類 デフォルトユーザー
Amazon Linux 2 ec2-user
Ubuntu ubuntu
CentOS centos
RHEL ec2-user
Windows RDPを使用(SSHではない)

解決手順

# Amazon Linux 2の場合
ssh -i /path/to/key.pem ec2-user@your-instance-public-ip

# Ubuntuの場合
ssh -i /path/to/key.pem ubuntu@your-instance-public-ip

# CentOSの場合
ssh -i /path/to/key.pem centos@your-instance-public-ip

トラブルシューティングのチェックリスト

以下の順序で確認してください。多くの場合、この順序で問題が特定できます。

# 1. インスタンスが実行中か確認
aws ec2 describe-instances --instance-ids i-1234567890abcdef0 \
  --query 'Reservations[0].Instances[0].State.Name'

# 2. パブリックIPアドレスを確認
aws ec2 describe-instances --instance-ids i-1234567890abcdef0 \
  --query 'Reservations[0].Instances[0].PublicIpAddress'

# 3. セキュリティグループを確認
aws ec2 describe-security-groups --group-ids sg-1234567890abcdef0 \
  --query 'SecurityGroups[0].IpPermissions'

# 4. キーペアのパーミッションを確認
ls -la /path/to/key.pem

# 5. 詳細ログで接続を試みる
ssh -vvv -i /path/to/key.pem ec2-user@your-instance-public-ip

よくある質問

このエラーは通常、ネットワークの断続的な問題またはセッションタイムアウトを示しています。クライアント側のSSH設定でキープアライブ間隔を調整してください。

K
AWS・Python・生成AIを専門とするソフトウェアエンジニア。AI・クラウド・開発ワークフローの実践ガイドを執筆しています。詳しく見る →