EC2へのSSH接続が失敗する原因を特定し、5分で解決する方法

このブログでは、AWS EC2インスタンスへのSSH接続が失敗する際の原因特定から解決までを、実践的なチェックリスト形式で解説します。セキュリティグループ設定、キーペアの権限、インスタンスの状態確認など、よく見落とされる項目を順番に診断することで、最短で接続を復旧できます。

SSH接続失敗の主な原因と優先順位

EC2への SSH接続ができない場合、以下の優先度順に確認していくことが効率的です。大半のケースは上位3項目で解決します。

  • インスタンスが実行中か確認(stopped状態だと接続不可)
  • セキュリティグループのインバウンドルール(ポート22許可が必須)
  • 秘密鍵ファイルの権限(600以下である必要あり)
  • ネットワークインターフェイス(ENI)の状態
  • キーペアと秘密鍵の一致

ステップ1: インスタンスの基本状態を確認する

AWSコンソールでの確認方法

まずはインスタンスが起動しているか、ネットワークが正常か確認します。

  1. AWSマネジメントコンソールにサインイン
  2. EC2ダッシュボード → インスタンス一覧を開く
  3. 対象インスタンスの「インスタンスの状態」が「running」であることを確認
  4. 「ステータスチェック」の項目で「2/2チェック合格」と表示されていることを確認

インスタンスが「stopped」状態の場合は、インスタンスを選択して「インスタンスの状態 → 開始」をクリックして起動させてください。

CLIでの確認方法

AWSコマンドラインツールがインストール済みの場合、以下で状態確認が可能です。

# インスタンスの状態確認
aws ec2 describe-instances \
  --instance-ids i-0123456789abcdef0 \
  --query 'Reservations[0].Instances[0].[InstanceId,State.Name,PublicIpAddress]' \
  --output table

# 出力例:
# |  InstanceId      |  State  |  PublicIpAddress  |
# |  i-0123...      |  running |  203.0.113.45     |

ステップ2: セキュリティグループのインバウンドルールを確認

セキュリティグループの設定確認

SSH接続にはポート22への通信許可が必須です。セキュリティグループの設定を確認してみましょう。

  1. EC2インスタンスの詳細画面を開く
  2. 「セキュリティ」タブ → セキュリティグループ名をクリック
  3. 「インバウンドルール」タブを選択
  4. 以下のような SSH ルールが存在することを確認:
    • プロトコル: TCP
    • ポート範囲: 22
    • ソース: 0.0.0.0/0(任意のIPから許可)または特定のIP CIDR

SSH ルールが見当たらない場合、以下の手順で追加します。

# AWS CLIでセキュリティグループのインバウンドルール追加
aws ec2 authorize-security-group-ingress \
  --group-id sg-0123456789abcdef0 \
  --protocol tcp \
  --port 22 \
  --cidr 0.0.0.0/0

# 実行後、成功メッセージが表示されます
# {
#     "Return": true,
#     "SecurityGroupRules": [...]
# }

セキュリティに関する注意: 本番環境では 0.0.0.0/0(すべてのIPを許可)ではなく、あなたのIPアドレスまたは組織のネットワークCIDRに限定することを推奨します。例: 203.0.113.0/24

ステップ3: 秘密鍵ファイルの権限を修正する

よくあるハマりポイント: 秘密鍵の権限が緩い場合

秘密鍵のファイル権限が 600 より緩い(777や644など)場合、SSH は接続を拒否します。以下のコマンドで権限を確認・修正してください。

# 秘密鍵の権限確認
ls -l ~/.ssh/my-key-pair.pem

# 出力例(権限が644の場合 - これはNG):
# -rw-r--r-- 1 user group 1674 Jan 10 10:00 my-key-pair.pem

# 権限を600に修正
chmod 600 ~/.ssh/my-key-pair.pem

# 修正後の確認
ls -l ~/.ssh/my-key-pair.pem
# -rw------- 1 user group 1674 Jan 10 10:00 my-key-pair.pem ✓

権限が正しくない場合、以下のようなエラーが発生します:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'my-key-pair.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.

ステップ4: SSH接続テストとトラブルシューティング

詳細なデバッグ情報を表示してSSH接続

接続がまだ失敗する場合、-v オプションで詳細ログを表示して原因を特定します。

# 基本的なSSH接続コマンド
ssh -i ~/.ssh/my-key-pair.pem ec2-user@203.0.113.45

# 詳細なデバッグ情報を表示(1段階)
ssh -v -i ~/.ssh/my-key-pair.pem ec2-user@203.0.113.45

# より詳細なデバッグ情報を表示(3段階)
ssh -vvv -i ~/.ssh/my-key-pair.pem ec2-user@203.0.113.45

よく出現するエラーメッセージと対応策

エラー: "Permission denied (publickey)"

  • 秘密鍵のパス指定が誤っている → パスを再確認
  • キーペアと秘密鍵が一致していない → キーペアを再作成
  • インスタンスの初期ユーザー名が誤っている → ec2-user、ubuntu、admin など OS により異なる

エラー: "Connection refused" または "No route to host"

  • セキュリティグループにポート 22 のインバウンドルールがない → ステップ2を確認
  • インスタンスがprivateサブネットにあり、NAT Gateway がない → パブリックサブネットへ移行

エラー: "Connection timed out"

  • ネットワークACLでTCPポート22が拒否されている → NACLを確認・修正
  • VPC外からの接続で Elastic IP が割り当てられていない → Elastic IP を割り当て

インスタンスのOSユーザー名を確認する

AMI の種類によりデフォルトユーザー名が異なります。よく使用される値を以下に示します。

AMI デフォルトユーザー名
Amazon Linux 2 ec2-user
Ubuntu ubuntu
Red Hat Enterprise Linux (RHEL) ec2-user
CentOS centos
Debian admin

ステップ5: ネットワーク周辺の設定を確認

Elastic IPの確認と割り当て

プライベートサブネットのインスタンスへ接続する場合、Elastic IP の割り当てまたは踏み台サーバ(Bastion Host)経由での接続が必要です。

# Elastic IPを割り当て(AWS CLI)
aws ec2 allocate-address --domain vpc

# 出力例
# {
#     "InstanceId": "i-0123456789abcdef0",
#     "PublicIp": "203.0.113.45",
#     "AllocationId": "eipalloc-0123456789abcdef0",
#     ...
# }

# Elastic IPをインスタンスに関連付け
aws ec2 associate-address \
  --instance-id i-0123456789abcdef0 \
  --allocation-id eipalloc-0123456789abcdef0

ネットワークACLの確認

VPC のネットワークACLがポート 22 への通信をブロックしている可能性があります。

  1. EC2インスタンスの詳細画面 → 「ネットワークインターフェイス」セクションをクリック
  2. ENI の詳細ページ → 「ネットワークACL」タブを開く
  3. インバウンドルールに TCP ポート 22 の許可ルールが存在することを確認

実行環境でのトラブルシューティング実例

テスト環境: macOS 14.2 / AWS CLI 2.13.5 / Amazon Linux 2 AMI

以下は、筆者が実際に遭遇した接続失敗と解決策です。

# 初期接続試行(失敗)
$ ssh -i ~/keys/my-key.pem ec2-user@203.0.113.45
ssh: connect to host 203.0.113.45 port 22: Connection refused

# 原因特定:セキュリティグループの確認
$ aws ec2 describe-security-groups \
  --group-ids sg-0123456789abcdef0 \
  --query 'SecurityGroups[0].IpPermissions' \
  --output table
# SSH ルールが見当たらず

# 対応:SSH ルールを追加
$ aws ec2 authorize-security-group-ingress \
  --group-id sg-0123456789abcdef0 \
  --protocol tcp --port 22 --cidr 0.0.0.0/0

# 再試行(成功)
$ ssh -i ~/keys/my-key.pem ec2-user@203.0.113.45
[ec2-user@ip-10-0-1-100 ~]$ ✓

使うべき場面と使うべきでない場面

EC2 SSH接続を使うべき場面

  • アプリケーションログの確認やトラブルシューティングが必要な場合
  • セキュリティグループやネットワーク設定を動的に変更する必要がある場合
  • 開発・テスト環境で頻繁にインスタンスにアクセスする場合

別の方法を検討すべき場面

  • 本番環境での頻繁な管理作業 → AWS Systems Manager Session Manager の使用を推奨(キーペア不要)
  • 複数インスタンスへの同時コマンド実行 → AWS Systems Manager Run Command を検討
  • ログ取得が主目的 → CloudWatch Logs への集約を推奨

よくある質

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