背景:
Amazonのvpcを使用して、やや複雑なネットワークを作成しました。2つのアベイラビリティーゾーンにまたがる3層ネットワークです。各レイヤーは、zone-aとzone-bにサブネットを持っています。プレゼンテーション層は上部にあり、アプリケーション層は中央にあり、コア層は下部にあります。
すべてのセキュリティグループとサブネットのACLは現在、すべてのインバウンドおよびアウトバウンドトラフィックを許可しており、問題の表面領域を減らすのに役立ちます。
プレゼンテーション層のルーティングテーブルは、すべてのトラフィックをインターネットゲートウェイに向けています。NATゲートウェイは分離されたサブネット内にあり、すべてのトラフィックをインターネットゲートウェイに向けています。
私のアプリケーションには、UI(React.js)とAPI(Node / Express)の2つのコンポーネントがあります。これらは、Dockerイメージとして展開されます。それぞれの前には、古典的なロードバランサーがあります。
UI-ELBはインターネットに面し、プレゼンテーションレイヤーに常駐し、トラフィックを80/443からポート8080にルーティングし、アプリケーションレイヤーサブネットに配置されている私のapp-ec2に関連付けられています。
私のAPIの前には内部ロードバランサーがあります。API-ELBはアプリケーション層(app-ec2と同じサブネット内)にあり、ポート80/443のトラフィックを受け取り、ポート3000のコアのapi-ec2にルーティングします。
どちらのロードバランサーも、インスタンスにトラフィックを渡す前に証明書をオフロードしています。
私は両方のロードバランサーをRoute53でエイリアスとして関連付け、アプリケーションできれいなURL(https://app.website.com)で参照しています。各ロードバランサーは、定義されたヘルスチェックに合格し、使用中のすべてのec2インスタンスを報告します。
最後に、APIで、cors nodejsパッケージを使用してcorsを有効にしました。
これが私のネットワークの簡単で汚い図です。
問題:
APP-ELBは私をアプリケーションに正常にルーティングします。ただし、アプリがGETリクエストをAPI-ELBに送信しようとすると、最初にエラーコード408でタイムアウトするOPTIONSリクエストが送信されます。
変になるところ
デバッグ中に遭遇した奇妙なことのいくつかは次のとおりです。
- app-ec2インスタンスにSSH接続して、API-ELBに対して正常にcurlを実行できます。私は多くを試しました、そしてそれらはすべてうまくいきます。いくつかの例は以下の通りです
curl -L https://api.website.com/system/healthcheck
とcurl -L -X OPTIONS https://api.website.com/system/healthcheck
。常に必要な情報を返します。 - アプリケーション全体をネットワークからパブリックデフォルトvpcに移動しましたが、想定どおりに機能します。
- すべてのネットワーク要求をコンソールに書き込むapi-ec2があります。ヘルスチェックリクエストは表示されますが、app-ec2からのリクエストは表示されません。これは、トラフィックがapiに到達していないことを私に信じさせる。
本当に私を完全に失った最大のことは、内部api elbのカーリングが機能することですが、同じ正確なURLへのaxiosリクエストは機能しません。これは私にはまったく意味がありません。
私が試したこと
私は当初、ACLルールとセキュリティグループで遊んでいて、何か間違ったことをしていると思っていました。結局、私は「ねじって」と言って、すべてを開いて、その部分を方程式から外そうとしました。
私はAPIでCorsをいじるのに多くの時間を費やしてきました。最終的に、私が持っている構成に着陸しapp.use(cors())
ます。これは、corsノードパッケージによって提供されるデフォルトのコールバックです。app.options('*', cors())
ドキュメントで推奨されているものも含めました。
私は太陽の下ですべてをググっていますが、具体的にはエルブでいくつかの特別なカスタムヘッダーを定義する必要があるかどうか?しかし、何かを見つけることができないようです。さらに、アプリをネットワークの外に移動したところ、問題なく動作しました。
私は他にもたくさんのことを試したと思いますが、これらが最も適切なようです。何が欠けていますか?これは非常に曖昧で広範な問題であり、膨大な投稿になる可能性があることは承知していますが、それを読む際の洞察と時間に感謝します!
curl -X OPTIONS 127.0.0.1...
app-ec2?OPTIONS
壊れてるだけ?ELBは「クラシック」であり、「アプリケーション」ではありませんか?すべてのインスタンスは、NATを介してインターネットに正しくアクセスできcurl ipv4.icanhazip.com
ますか?(はい、わかりにくい理由を尋ねます。)