14

AWS サービスでは、S3 バケットから Web アプリケーションを実行し、ロード バランサー (EC2 インスタンスで実行される Node.js アプリケーションのセット) から REST API を介してデータにアクセスします。

現在、次のように URL を指定しています。

  • API ロード バランサー:       api. somedomain.com
  • S3 上の静的 Web アプリ:        somedomain.com

しかし、この設定ではリクエストが CORS であるため、一連の問題が発生しました。特別なヘッダーを使用して CORS を回避できますが、すべてのブラウザーで機能するとは限りません。

私たちが達成したいのは、同じドメインで異なるパスを使用して API を実行することです。

  • API ロード バランサー:            somedomain.com /api
  • S3 上の静的 Web アプリ:       somedomain.com

アイデアの 1 つは、API ロード バランサーを CDN にアタッチし、クエリが「/api/*」パスで送信された場合にすべてのリクエストをロード バランサーに転送することでした。しかし、私たちの API は HEAD および GET リクエストだけでなく、POST、PUT、DELETE も使用しているため、これは機能しません。

もう 1 つのアイデアは、S3 バケットの代わりに 2 番目の EC2 インスタンスを使用して Web サイトをホストすることです (nginx や apache などの Web サーバーを使用)。しかし、すべてが既に整っている場合 (S3 静的コンテンツ ホスティング)、オーバーヘッドが大きすぎます。また、このシナリオを使用すると、Amazon CloudFront のパフォーマンスのすべてのメリットが得られません。

では、Load Balancer と S3 を組み合わせて、同じドメインで異なるパスで実行する方法をお勧めできますか? ( somedomain.com /apiの API とsomedomain.comの Web アプリ)

ありがとうございました!

4

2 に答える 2

12

同じホスト名を持つ EC2 インスタンスと S3 バケットを持つことはできません。Web ブラウザがそのホスト名にリクエストを送信するとどうなるかを考えてみましょう。DNS はそれを IP アドレス (または複数のアドレス) に解決し、要求のパケットはそのアドレスに配信されます。アドレスは、EC2 インスタンスまたは S3 バケットのいずれかで終了します。両方ではありません。

あなたの状況を理解しているように、EC2 インスタンスに対してさまざまな HTTP リクエストを行う JavaScript コードを含む S3 でホストされている静的な Web ページがあります。S3 Web ページが EC2 インスタンスとは異なるホスト上にある場合、同じオリジン ポリシーにより、ブラウザは一部のリクエストを試みることさえできなくなります。

私が見ることができる唯一の解決策は次のとおりです。

  • EC2 インスタンスに対してすべてのリクエストを行い、S3 コンテンツをフェッチして、Web ページが要求されるたびにブラウザに配信します。
  • JavaScript で iframe を使用document.domainし、Web ページの を共通の親オリジンに変更します。たとえば、Web ページが にwww.example.comあり、EC2 インスタンスが にあるapi.example.com場合、JavaScript はdocument.domainjustexample.comに変更され、ブラウザは からの iframe がwww.example.comと通信することを許可しapi.example.comます。
  • 弾丸を噛んでCORSを使用してください。それは本当に難しいことではなく、リモートで最近のすべてのブラウザーでサポートされています (IE 8 と 9 はそれを行いますが、標準的な方法ではありません)。

最初の方法はよくありません。その場合、S3 をまったく使用しない方がよいからです。

2 番目のケースは問題ありません。実際には CORS ではないため、どのブラウザでも動作するはずです。したがって、CORS ヘッダーは必要ありません。しかし、それはトリッキーです。

3 番目の CORS アプローチは問題ないはずです。EC2 インスタンスは、S3 バケットから Web ページが EC2 インスタンスと通信しても安全であることを伝える適切なヘッダーを返すだけです。

于 2013-06-27T02:53:47.397 に答える