アマゾン ウェブ サービス - EC2 インスタンスの API はポート 5000 を正常に使用しますが、ロードバランサーから到達するとポートが機能しません

okwaves2024-01-25  8

Ubuntu Server 20.04 LTS で EC2 インスタンスを作成しました。 Flask API をサーバーにアップロードし、tmux でサービスを維持します (必要な場合に備えて、次のようにしました: https://www.twilio.com/blog/deploy-flask-python-app-awsポート 8080 の代わりにポート 5000 でした)。

サーバーに API を入れてテストして以来、すべてのエンドポイントが正常に動作しています。

次のステップは、Route 53 と証明書マネージャーを使用してドメインとそのドメインの SSL 証明書を作成し、CNAME レコードを追加することでした。

ドメインから API に正常にアクセスできることを確認するために最初にしたことは、そのドメインの IP を使用してシンプル A レコードを作成することでした (ちなみに、その EC2 インスタンスには Elastic IP を設定しました)。

ここまでは順調で、http://mydomain:5000 を使用して正常に再設定できています。私のAPIです。問題はありません。エンドポイントは引き続き正常に動作しています。

その後、私が問題を抱えていたのは (証明書マネージャーを使用して SSL 証明書を追加するのは初めてだったのでわかりませんでした)、証明書が発行されても実際には「使用中」になっていないということでした。 。それはそれほど簡単ではないことがわかりました。次に行う必要があるのは、証明書を EC2 インスタンスにリンクすることであり、CNAME レコードだけでは十分ではありませんでした。

その方法を検索しました。多くのガイドが S3 の使用に関するものであったり、EC2 インスタンスについて言及していなかったりするため、いくつか挫折し、少し落胆しましたが、1 つ見つけてそれに従いました。ここにあります: https://youtu .be/bWPTq8z1vFY?t=533 (ロード バランサーに関する部分は 3 分未満です)。

そのチュートリアルに従ってロード バランサーを作成しました。アプリケーションロードバlancer (HTTP/HTTPS)、インターネットに面しており、アベイラビリティーゾーンには EC2 インスタンスが含まれており、SSL 証明書が選択されており (実際に持っているのはこれだけです)、ロードバランサーは私のものと同じセキュリティグループにあります。 EC2 インスタンス (同じ文字列であることを確認するために Ctrl Fed を押しました)、HTTP と HTTPS の 2 つのリスナーがあります。

次の部分は、IP アドレスのみを含むシンプル A レコード (これは単なる HTTP ですが HTTPS が機能しなかったため) をロード バランサーのシンプル A レコードに変更することでした。最初に作成したものを削除しました

画面は多少異なりますが (2020 年のものですが、AWS は UI を更新したばかりです)、新しい A レコードを追加するときに私が行っていることは次のとおりです。

そして、最終結果は次のとおりです。

アップデートの準備ができるまで数分待った後、試してみますhttps://mydomain:5000 でエンドポイントに到達しようとしましたが、リクエストは失敗しました。

以前との違いは次のとおりです。my_ip_address:5000 または http:mydomain:5000 に到達しようとすると、このメッセージが表示されました。これは、API に到達しただけでは何も返さないので当然です (これはまったく正常な動作です)。 :

しかし、今度はサイトにアクセスできないと表示されます。

https:mydomain と入力しただけでも 502 エラーが発生します (以前は発生していませんでした)。

また、私のターゲット グループがどのように健康上の問題を抱えているかは次のとおりです。理由はわかりません (私はまだ学習中ですが、おそらく設定に関係があると思われます)。

これもおそらく設定に関係があると思われますが、EC2 インスタンスは正常であるため、まだ取得できません。

h から次に進む方法がわかりませんここで、私は手がかりや他の代替案を探してきましたが、代替案はさらに古く、時代遅れです。

このプロセスをどのように行うべきか、または私のやり方に何か問題がある場合は、アドバイスしてください。私はこの時点で行き詰まっています。

ご協力いただきありがとうございました。

明らかにあなたの HC は失敗しています。 ALB を使用せずに直接カールすると、アプリ/API はインスタンス上で動作しますか?または、インスタンスに ssh で接続する場合、内側からカールできますか?

– マルシン

2020 年 9 月 4 日 0:09

はい、ALB がない場合は問題ありません。 Postman と Web アプリの両方でテストしました。

– エミリアーノ・セルバンテス

2020 年 9 月 4 日 13:51



------------------------

やはり設定に問題があったようです。

ターゲットは API の特定のポートであるため、通常のポート 8 の代わりにこれを行う必要がありました。HTTP の場合は 0。

次の図のように HTTP ポート 80 を設定する代わりに、次のことを行う必要があります。

私の場合はポート: 5000 であるはずです。最初は 80 のままにするのが正しいと思いましたが、実際には API にポート 80 を使用していません。

実際には非常に単純ですが、これから AWS を使い始める人にとって、この構成はすべて私にとって同様に新しいものであるため、注意してください。

DNS レコードの次のステップは、A レコードをアプリケーションおよびクラシック ロード バランサーのエイリアスとして残し、エンドポイントにアクセスするために https://mydomain:5000 として置く必要がなくなり、単に https://mydomain として置くことです。 Application Load Balancer がすでに処理しているため、これで十分です。

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。