EC2 インスタンスでホストされている応答しないウェブサイトのトラブルシューティング方法を教えてください。

最終更新日: 2021 年 5 月 06 日

Amazon Elastic Compute Cloud (Amazon EC2) インスタンスでホストされているパブリックウェブサイトに接続できません。解決方法を教えてください。

簡単な説明

EC2 インスタンスで実行されているウェブサイトは、いくつかの理由で到達不能になる可能性があります。以下をチェックして、インスタンスの設定が正しいことを確認してください。

  • インスタンスが実行中で、両方のステータスチェックに合格していることを確認します。
  • インスタンスが正常に起動することを確認します。
  • インスタンスのセキュリティグループおよびネットワークアクセスコントロールリスト (ACL) の設定を確認します。
  • インスタンスの DNS 設定が正しく行われていることを確認します。
  • ウェブサーバーが稼働中で、ポートへのアクセスをブロックする OS レベルのファイアウォールがないことを確認します。

注意: Linux 用 EC2 シリアルコンソールを有効にしている場合は、それを使用して、サポートされている Nitro ベースのインスタンスタイプのトラブルシューティングを行うことができます。シリアルコンソールは、起動の問題、ネットワーク設定、および SSH 設定の問題のトラブルシューティングに役立ちます。シリアルコンソールは、正常に動作するネットワーク接続を必要とすることなく、インスタンスに接続します。シリアルコンソールには、Amazon EC2 コンソールまたは AWS コマンドラインインターフェイス (AWS CLI) を使用してアクセスできます。

シリアルコンソールを使用する前に、アカウントレベルでコンソールにアクセス権を付与します。その後、IAM ユーザーにアクセス権を付与する AWS Identity and Access Management (IAM) ポリシーを作成します。また、シリアルコンソールを使用するすべてのインスタンスには、少なくとも 1 名のパスワードベースユーザーを含める必要があります。インスタンスが到達不能で、シリアルコンソールへのアクセスを設定していない場合は、方法 2、3、または 4 の手順に従います。Linux 用の EC2 シリアルコンソールの設定の詳細については、「EC2 シリアルコンソールへのアクセスを設定する」を参照してください。

注意: AWS CLI コマンドの実行時にエラーが表示される場合は、AWS CLI の最新バージョンを使用していることを確認してください

解決方法

インスタンスが実行中で、両方のステータスチェックに合格していることを確認する

インスタンスが Amazon EC2 コンソールで実行中として一覧表示されていることを確認します。

ステータスチェックの問題の解決については、「EC2 Linux インスタンスにアクセスできず、ステータスチェックの片方または両方が失敗する理由は何ですか?」を参照してください。

インスタンスが正常に起動することを確認する

インスタンスのセキュリティグループおよびネットワーク ACL の設定を確認する

インスタンスの DNS 設定が正しく行われていることを確認する

ウェブサーバーが稼働中で、ポートへのアクセスをブロックする OS レベルのファイアウォールがないことを確認する

ネットワークポートは、さまざまなサービスのリクエストの送信先にあたる通信エンドポイントです。このようなリクエストには、ユーザーのウェブサイト接続リクエストが含まれます。ウェブサーバーは、通常、HTTP トラフィックをポート 80 でリッスンし、TLS/SSL で暗号化されたトラフィックにはポート 443 を使用します。ウェブサーバーが稼働していない場合、またはこれらのポートがファイアウォールでブロックされている場合、ユーザーはウェブサイトに接続できません。

1.    SSH 経由でインスタンスにリモート接続します

2.    systemctl status httpd コマンドを実行して、ウェブサーバーのステータスを確認します。ウェブサーバーは、ポート 80 またはポート 443 でリッスンしている必要があります。次の例では、コマンドは、ウェブサーバーが非アクティブであるという情報を返します。

$ sudo systemctl status httpd
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: inactive (dead)

3.    ウェブあサーバーを再起動するには、次のコマンドを実行します。

$ sudo systemctl restart  httpd

4.    次のコマンドを実行して、ウェブサーバーが現在稼働していることを確認します。

$ sudo systemctl status httpd
 httpd.service - The Apache HTTP Server
 Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
 Active: active (running) since Thu 2020-11-19 14:40:15 UTC; 42s ago

注意: SystemV を実行している古い Linux システムでは、ウェブサーバーのステータスを確認するには次のコマンドを使用します。

$ sudo service httpd status
httpd is stopped

停止したウェブサーバーを SystemV で再起動するには、次のコマンドを使用します。

$ sudo service httpd restart
Stopping httpd:                                            [FAILED]
Starting httpd:                                            [  OK  ]

5.    次のコマンドを実行して、ウェブサーバーがポート 80 または 443 でユーザーからの受信接続リクエストをリッスンしていることを確認します。

$ sudo netstat -tulpn | grep httpd
tcp        0      0 :::80                       :::*                        LISTEN      2961/httpd

6.    OS レベルのファイアウォールのステータスを確認します。アクティブなファイアウォールが見つかった場合は、ポート 80 および 443 でのリクエストが許可されていることを確認します。

Amazon Linux、CentOS、RHEL:

1.    次のコマンドを実行して、iptables ルールがポート 80 および 443 での受信リクエストをブロックすることを確認します。

$ sudo iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

2.    次のコマンドを実行して、ポート 80 が受信 HTTP 接続リクエストを受け入れるようにします。

$ sudo iptables -A INPUT -p tcp --dport 80 --syn -m conntrack --ctstate NEW -j ACCEPT

3.    次のコマンドを実行して、ポート 443 が受信 HTTPS 接続リクエストを受け入れるようにします。

$ sudo iptables -A INPUT -p tcp --dport 443 --syn -m conntrack --ctstate NEW -j ACCEPT

Amazon Linux 2 と RHEL 7 以上:

1.    次のコマンドを実行して、firewalld が実行されていることを確認します。

$ sudo firewall-cmd --state
running

2.    ファイアウォールが実行されている場合は、次のコマンドを実行して、ポート 80 および 443 での接続を許可するように設定します。次の例の最後のコマンドは、新しいルールが有効になるように、サービスをリロードします。

$ sudo firewall-cmd --add-service=http --permanent
success
$ sudo firewall-cmd --add-service=https --permanent
success
$ sudo firewall-cmd --reload
success

Debian サーバーと Ubuntu サーバー:

1.    次のコマンドを実行して、UFW ファイアウォールを確認します。

$ sudo ufw status verbose
Status: active

2.    UFW が実行されている場合は、次のコマンドを使用して、ポート 80 およびポート 443 での受信接続リクエストを許可します。

$ sudo ufw allow in 80/tcp
Rule added
Rule added (v6)
$ sudo ufw allow 443/tcp
Rule added
Rule added (v6)

ウェブサーバーのアクセスエラーログで問題がないか確認します。ウェブサーバーのログは、通常 /var/log にあります。サーバーの設定によっては、この場所が変更される場合があります。以下は、ウェブサーバのデフォルトのログの場所を示しています。

  • Amazon Linux および RHEL: /var/log/httpd
  • Debian および Ubuntu: /var/log/apache2