EC2 インスタンスでホストされているウェブサイトに接続できないのはなぜですか?
Amazon Elastic Compute Cloud (Amazon EC2) インスタンスでホストされているパブリックウェブサイトに接続できません。これを解決するにはどうすればよいですか?
簡単な説明
EC2 インスタンスで実行されているウェブサイトは、いくつかの理由で到達不能になる可能性があります。この問題を解決するには、EC2 インスタンスの設定が正しいことを確認します。例えば、インスタンスが正しく起動しない、または適切な DNS 設定がない場合、そのインスタンスでホストされているどのウェブサイトにも接続できません。
この記事の手順に従い、EC2 インスタンスの設定を確認し、この問題の根本原因を特定してください。
解決方法
注: AWS Command Line Interface (AWS CLI) のコマンド実行時にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください。
Linux 用の EC2 シリアルコンソールを使用して Nitro ベースのインスタンスタイプのトラブルシューティングを行う
Linux 用の EC2 シリアルコンソールを有効にした場合は、それを使用してサポートされている Nitro ベースのインスタンスタイプのトラブルシューティングを行うことができます。シリアルコンソールには、シリアルコンソールまたは AWS CLI を使用してアクセスできます。EC2 シリアルコンソールを使用する場合、インスタンスに接続するための有効な接続は必要ありません。
シリアルコンソールを使用してトラブルシューティングを行う前に、以下を実行してください。
- アカウントレベルでシリアルコンソールへのアクセス権を付与する
- IAM ユーザーにアクセス権を付与する AWS Identity and Access Management (IAM) ポリシーを作成します。
- インスタンスにパスワードベースのユーザーが少なくとも 1 人含まれていることを確認する
インスタンスが実行中で、両方のステータスチェックに合格していることを確認する
インスタンスが 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 を使用します。ウェブサーバーが稼働していない場合、またはこれらのポートがファイアウォールでブロックされている場合、ユーザーはウェブサイトに接続できません。
ウェブサイトがローカルで実行されているかどうかを確認するには、EC2 インスタンスをホストしているウェブサイト内から次のコマンドを実行します。
curl https://localhost
- または -
curl http://localhost:443
2. ウェブサーバーのステータスを確認します。
- RHEL または CentOS システムの場合は、コマンド systemctl status httpd を使用してウェブサーバーのステータスを確認します。コマンドは、ウェブサーバーが非アクティブであるという情報を返します。
$ 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)
- Debian または Ubuntu システムでは、コマンド systemctl status httpd を使用してウェブサーバーのステータスを確認します。ウェブサーバーは、ポート 80 またはポート 443 でリッスンしている必要があります。コマンドは、ウェブサーバーが非アクティブであるという情報を返します。
$ sudo systemctl status apache2 apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Active: inactive (dead)
3. 次のコマンドを実行して、ウェブサーバーを再起動します。
- REHL または CentOS システムの場合:
$ sudo systemctl restart httpd
- Debian または Ubuntu システムの場合は、次のコマンドを実行します。
$ sudo systemctl restart apache2
4. ウェブサーバーが現在実行中であることを確認します。
- REHL または CentOS システムの場合は、次のコマンドを実行します。
$ 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
- Debian または Ubuntu システムの場合は、次のコマンドを実行します。
$ sudo systemctl status apache2 apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Active: active (running)
注意: SystemV を実行している古い Linux システムでは、次のコマンドを実行してウェブサーバーのステータスを確認します。
Debian または Ubuntu システムでは、httpd を apache2 に置き換える必要があります。
$ sudo service httpd status httpd is stopped
次のコマンドを実行して、SystemV で停止した ウェブサーバーを再起動します。
$ sudo service httpd restart Stopping httpd: [FAILED] Starting httpd: [ OK ]
5. 次のコマンドを実行して、ウェブサーバーがポート 80 または 443 でユーザーからの受信接続リクエストをリッスンしていることを確認します。
- REHL または CentOS システムの場合は、次のコマンドを実行します。
$ sudo netstat -tulpn | grep httpd tcp 0 0 :::80 :::* LISTEN 2961/httpd
- Debian または Ubuntu システムの場合は、次のコマンドを実行します。
$ sudo netstat -tulpn | grep apache2 tcp6 0 0 :::80 :::* LISTEN 2741/apache2
6. OS レベルのファイアウォールのステータスを確認します。アクティブなファイアウォールが見つかった場合は、ポート 80 および 443 でのリクエストが許可されていることを確認します。
注: 複数のインターフェイスが実行されている場合は、ウェブサーバーがすべての IP をリッスンしていることを確認するには、次のコマンドを実行します。
cat /etc/httpd/conf/httpd.conf | grep Listen
以下は、成功した出力の例です。
Listen *:80
- または -
Listen *: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. 次のコマンドを実行して、ファイアウォールが実行中であることを確認します。
$ 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
関連情報
関連するコンテンツ
- 質問済み 5年前lg...
- 質問済み 5年前lg...
- 質問済み 6年前lg...
- 質問済み 1ヶ月前lg...
- 質問済み 3年前lg...
- AWS公式更新しました 7ヶ月前