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 インスタンスにアクセスできず、ステータスチェックの片方または両方が失敗する理由は何ですか?」を参照してください。
インスタンスが正常に起動することを確認する
インスタンスのシステムログで起動エラーがないか確認します。
- Kernel panic エラーについては、「カーネルをアップグレードするか、EC2 Linux インスタンスを再起動しようとすると、「Kernel panic」エラーが発生します」を参照してください。この解決方法を教えてください。
- その他のオペレーティングシステムのエラーについては、「オペレーティングシステムの問題により、EC2 Linux インスタンスでインスタンスのステータスチェックが失敗しました」を参照してください。この解決方法を教えてください。
インスタンスのセキュリティグループおよびネットワーク ACL の設定を確認する
- インスタンスの関連付けられているセキュリティグループとネットワーク ACL で、ポート 80 および 443 のトラフィックが許可されていることを確認します 。
- インスタンスのサブネットのルートテーブルに、 インターネットゲートウェイへのデフォルトルートがあることを確認します。
インスタンスの DNS 設定が正しく行われていることを確認する
- ウェブサイトが Route 53 DNS サービスを使用している場合は、DNS レコードが正しく設定されていることを確認します。
- インスタンスに Elastic IP アドレスが割り当てられていることを確認します。インスタンスを停止して起動すると、Elastic IP アドレスはインスタンスに関連付けられたままになります。
- パブリック IP アドレスまたは Elastic IP アドレスが A レコードにマッピングします。
ウェブサーバーが稼働中で、ポートへのアクセスをブロックする OS レベルのファイアウォールがないことを確認する
ネットワークポートは、さまざまなサービスのリクエストの送信先にあたる通信エンドポイントです。このようなリクエストには、ユーザーのウェブサイト接続リクエストが含まれます。ウェブサーバーは、通常、HTTP トラフィックをポート 80 でリッスンし、TLS/SSL で暗号化されたトラフィックにはポート 443 を使用します。ウェブサーバーが稼働していない場合、またはこれらのポートがファイアウォールでブロックされている場合、ユーザーはウェブサイトに接続できません。
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