11

एडब्ल्यूएस सेवाओं के साथ हमारे पास वेब एप्लिकेशन एस 3 बाल्टी से चल रहा है और लोड बैलेंसर से आरईएसटी एपीआई के माध्यम से डेटा तक पहुंच रहा है (जो ईसी 2 इंस्टेंस पर चल रहे नोड.जेएस अनुप्रयोगों का सेट है)।एस 3 को स्थैतिक वेब पेज और ईसी 2 के रूप में इसके लिए आरईएसटी एपीआई के रूप में कैसे उपयोग करें? (एडब्ल्यूएस)

वर्तमान में हम निर्दिष्ट किया है यूआरएल निम्नलिखित के रूप में की:

  • एपीआई लोड बैलेंसर:           एपीआई।somedomain.com
  • स्टेटिक वेब S3 पर App:             somedomain.com

लेकिन इस स्थापना होने हमें समस्याओं का एक सेट लाया के बाद से अनुरोध इस सेटअप के साथ CORS हैं। हम विशेष शीर्षकों के साथ सीओआरएस को कामकाज कर सकते हैं, लेकिन यह सभी ब्राउज़रों के साथ काम नहीं करता है।

हम क्या हासिल करना चाहते हैं एक ही डोमेन पर लेकिन अलग रास्ता साथ एपीआई चल रहा है:

  • एपीआई लोड बैलेंसर:                     somedomain.com/api
  • एस 3 पर स्टेटिक वेब ऐप:           somedomain.com

एक विचार यह है CDN के लिए एपीआई लोड बैलेंसर देते हैं और बैलेंसर लोड करने के लिए यदि क्वेरी "/ api/*" रास्ते पर आ रहा है सभी अनुरोध अग्रेषित करने के लिए किया गया था। लेकिन यह काम नहीं करता है क्योंकि हमारी एपीआई न केवल हेड और जीईटी अनुरोधों का उपयोग कर रही है, बल्कि पोस्ट, पुट, डिलीट भी कर रही है।

एक और विचार वेबसाइट होस्ट करने के लिए एस 3 बाल्टी के बजाय दूसरे ईसी 2 आवृत्ति का उपयोग कर रहा है (कुछ वेब सर्वर जैसे nginx या apache का उपयोग कर)। लेकिन जब सबकुछ पहले से ही होता है तो यह बहुत अधिक ओवरहेड देता है (एस 3 स्थिर सामग्री होस्टिंग)। अगर इस परिदृश्य का उपयोग करते हैं तो हमें अमेज़ॅन क्लाउडफ्रंट प्रदर्शन के सभी लाभ नहीं मिलेंगे।

तो, क्या आप लोड बैलेंसर और एस 3 को गठबंधन करने की सलाह दे सकते हैं, इसलिए वे एक ही डोमेन पर चलेंगे, लेकिन विभिन्न पथों के साथ? (somedomain.com पर somedomain.com/api और वेब एप्लिकेशन पर एपीआई)

धन्यवाद!

उत्तर

11

आपके पास एक ही होस्ट नाम के साथ एक ईसी 2 इंस्टेंस और एस 3 बाल्टी नहीं हो सकती है। गौर करें कि क्या होता है जब कोई वेब ब्राउज़र उस होस्ट नाम का अनुरोध करता है। DNS इसे किसी आईपी पते (या पते) पर हल करता है और अनुरोध के पैकेट उस पते पर वितरित किए जाते हैं। पता या तो ईसी 2 उदाहरण या एस 3 बाल्टी पर समाप्त होता है, दोनों नहीं।

जैसा कि मैं आपकी स्थिति को समझता हूं, आपके पास एस 3 पर होस्ट किए गए स्थैतिक वेब पेज हैं जिनमें जावास्क्रिप्ट कोड शामिल है जो ईसी 2 उदाहरण के लिए विभिन्न HTTP अनुरोध करता है। यदि एस 3 वेब पेज ईसी 2 इंस्टेंस की तुलना में एक अलग मेजबान पर हैं तो वही मूल नीति ब्राउज़र को कुछ अनुरोधों का प्रयास करने से रोकती है।

केवल समाधान मैं देख सकता हैं:

  • यह S3 सामग्रियों को लाते समय और ब्राउज़र जब भी एक वेब पेज के लिए कहा जाता है के लिए इसे पहुंचाने के साथ, EC2 उदाहरण के लिए सभी अनुरोधों को बनाओ।
  • अपने जावास्क्रिप्ट का उपयोग iframes है और वेब पृष्ठों में document.domain को एक सामान्य मूल मूल के रूप में बदलें। उदाहरण के लिए, यदि आपके वेब पेज www.example.com पर हैं और आपका ईसी 2 उदाहरण api.example.com पर है, तो जावास्क्रिप्ट document.domain को example.com पर बदल देगा और ब्राउज़र से api.example.com के साथ संवाद करने के लिए iframes को अनुमति देगा।
  • बुलेट काटने और सीओआरएस का उपयोग करें। यह वास्तव में कठिन नहीं है, और सभी दूरस्थ रूप से हालिया ब्राउज़रों में it's supported (आईई 8 और 9 इसे करते हैं, लेकिन मानक तरीके से नहीं)।

पहली विधि कोई अच्छी नहीं है, क्योंकि आप लगभग उसी मामले में एस 3 का उपयोग नहीं कर सकते हैं।

दूसरा मामला आपके लिए ठीक होना चाहिए। इसे किसी भी ब्राउज़र में काम करना चाहिए, क्योंकि यह वास्तव में कोर नहीं है। तो कोई सीओआरएस हेडर की जरूरत नहीं है। लेकिन यह मुश्किल है।

तीसरा, सीओआरएस, दृष्टिकोण ठीक होना चाहिए। आपके ईसी 2 इंस्टेंस को सिर्फ एस 3 बाल्टी से वेब पेजों को बताते हुए उचित हेडर वापस करना होगा कि उनके लिए ईसी 2 इंस्टेंस से बात करना सुरक्षित है।

+0

अपने इस तरह के एक अच्छा स्पष्टीकरण के लिए धन्यवाद! शायद हम सीओआरएस दृष्टिकोण के साथ जाएंगे और आईई के लिए वर्कअराउंड बनाएंगे। – user1671010

+0

खुशी हुई। यदि यह आपकी समस्या हल करता है, तो कृपया इसे उत्तर के रूप में चिह्नित करें। –

0

बस उत्तर में एक अतिरिक्त बिट जोड़ना चाहता था, अगर हम सीओआरएस दृष्टिकोण के साथ जाते हैं और प्रीफलाइट अनुरोध सर्वर और नेटवर्क बैंडविड्थ पर ओवरहेड जोड़ते हैं, तो हम हेडर "एक्सेस-कंट्रोल-मैक्स-एज" CORS जवाबी कार्रवाई के लिए

Access-Control-Max-Age

संबंधित मुद्दे