S3 उत्पत्ति के साथ AWS CloudFront से फ़ाइलों के लिए कोई कैश-कंट्रोल हैडर नहीं


27

हम अभी-अभी Amazon AWS पर गए थे। वर्तमान में हमारे पास एक EC2 उदाहरण है जो अच्छी तरह से काम कर रहा है। यह सामने की तरफ Nginx और बैक-एंड में Apache चल रहा है। वह भी अच्छा चल रहा है। सभी साइटों को ठीक से लॉन्च किया गया है और इसमें EC2 से सेव की गई फ़ाइलों के लिए कैश-कंट्रोल हैडर शामिल है।

समस्या सभी स्टैटिक फ़ाइलों के साथ है जो हमने अमेज़ॅन एस 3 में रखा है जिसे क्लाउडफ्रंट सीडीएन के माध्यम से एक्सेस किया जा रहा है । हम फ़ाइलों को ठीक से एक्सेस कर सकते हैं (और कोर के साथ कोई समस्या नहीं है), लेकिन स्पष्ट रूप से CloudFront कैश-कंट्रोल हेडर के साथ फ़ाइलों की सेवा नहीं करता है। हम ब्राउज़र कैशिंग का लाभ उठाना चाहते हैं।

जिस तरह से मैं इसे देख रहा हूं, यहां ईसी 2 उदाहरण एक भूमिका नहीं निभाता है क्योंकि स्थैतिक फाइलों को सीधे S3 + CloudFront द्वारा परोसा जा रहा है, अनुरोध EC2 में वेब सर्वर पर नहीं जाता है।

मैं पूरी तरह से खो गया हूँ।

प्रश्न: 1) मैं इस मामले में कैश-कंट्रोल कैसे सेट कर सकता हूं? 2) क्या कैश-कंट्रोल सेट करना संभव है? S3 या CloudFront से?

नोट: मैंने Google में कुछ पृष्ठ हिट किए हैं जहां आप व्यक्तिगत वस्तुओं के लिए S3 में हैडर सेट कर सकते हैं। यह वास्तव में विशेष रूप से ऐसा करने का एक उत्पादक तरीका नहीं है क्योंकि मेरे मामले में हम कई वस्तुओं की बात कर रहे हैं।

धन्यवाद!


कृपया किसी ऑब्जेक्ट के लिए S3 और लागू CloudFront URL में URL पोस्ट करें। मैं आपके द्वारा वर्णित व्यवहार को देखना चाहता हूं। वैकल्पिक रूप से दोनों के लिए CURL पोस्ट करें, हेडर दिखाते हुए।
टिम

मैं एक कस्टम हेडर को जोड़ने के लिए कर लिया है "समय समाप्ति: सूर्य, 15 अक्टू 2027 13:46:07 GMT" में संपादन मूल के आधार पर console.aws.amazon.com/cloudfront/home । हालाँकि यह काम नहीं करता है। आपने इसे आखिर कैसे किया?
मनोलो

जवाबों:


31

मैंने Google में कुछ पृष्ठ हिट किए हैं जहाँ आप व्यक्तिगत वस्तुओं के लिए S3 में हैडर सेट कर सकते हैं। यह वास्तव में विशेष रूप से ऐसा करने का एक उत्पादक तरीका नहीं है क्योंकि मेरे मामले में हम कई वस्तुओं की बात कर रहे हैं।

ठीक है, "उत्पादक" या नहीं, यह वास्तव में काम करने के लिए डिज़ाइन किया गया है।

CloudFront हेडर नहीं जोड़ता है Cache-Control:

CloudFront गुजरता के माध्यम से (और भी सम्मान करता, जब तक अन्यथा कॉन्फ़िगर है)Cache-Control: मूल सर्वर, जो इस मामले में S3 है द्वारा प्रदान की हेडर।

Cache-Control:किसी ऑब्जेक्ट के प्राप्त होने पर S3 द्वारा हेडर प्रदान करने के लिए , उन्हें तब प्रदान किया जाना चाहिए जब ऑब्जेक्ट को S3 में अपलोड किया जाता है, या बाद के पुट + कॉपी ऑपरेशन द्वारा ऑब्जेक्ट के मेटाडेटा में जोड़ा जाता है, जिसका उपयोग आंतरिक रूप से किसी ऑब्जेक्ट को स्वयं कॉपी करने के लिए किया जा सकता है S3, प्रक्रिया में मेटाडेटा को संशोधित करता है। यदि आप ऑब्जेक्ट मेटाडेटा को संपादित करते हैं, तो यह पर्दे के पीछे से कंसोल करता है।

वहाँ भी है (अगर आप सोच रहे हैं) S3 में कोई वैश्विक सेटिंग नहीं है कि इन हेडर को वापस करने के लिए एक बाल्टी में सभी ऑब्जेक्ट्स को मजबूर करने के लिए - यह एक प्रति-वस्तु विशेषता है।


अपडेट: लैम्ब्डा @ एज क्लाउडफ्रंट में एक नई विशेषता है जो आपको दर्शक और कैश और / या कैश और मूल के बीच अनुरोधों और / या प्रतिक्रियाओं के खिलाफ ट्रिगर करने की अनुमति देता है, एक सरल अनुरोध / प्रतिक्रिया ऑब्जेक्ट संरचना के खिलाफ Node.js में लिखा कोड चल रहा है। CloudFront द्वारा उजागर।

इस सुविधा के लिए मुख्य अनुप्रयोगों में से एक हेडर से छेड़छाड़ कर रहा है ... इसलिए जबकि ऊपर अभी भी सटीक है - CloudFront खुद को नहीं जोड़ता है Cache-Control- अब यह एक Lambda फ़ंक्शन के लिए संभव है कि वह CloudFront से लौटी प्रतिक्रिया पर उन्हें जोड़ दे।

यह उदाहरण Cache-Control: public, max-age=86400केवल तभी जोड़ता है Cache-Controlजब प्रतिक्रिया पर कोई हेडर पहले से मौजूद न हो ।

एक ओरिजनल रिस्पॉन्स ट्रिगर में इस कोड का उपयोग करने से हर बार क्लाउडफ्रंट मूल से एक ऑब्जेक्ट प्राप्त करने के लिए आग का कारण बनता है, और CloudFront इसे कैश करने से पहले प्रतिक्रिया को संशोधित करता है।

'use strict';

exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;

    if(!response.headers['cache-control'])
    {
        response.headers['cache-control'] = [{ 
            key:   'Cache-Control', 
            value: 'public, max-age=86400' 
        }];
    }

    callback(null, response);
};

अद्यतन (2018/06/20): हाल ही में, मैं CloudFront टीम के लिए एक सुविधा का अनुरोध प्रस्तुत स्थिर मूल के विन्यास अनुमति देने के लिए प्रतिक्रिया मूल गुण, जिस तरह से स्थिर करने के लिए इसी तरह के रूप में हेडर अनुरोध हेडर, जोड़ा जा सकता है अब ... लेकिन एक साथ मोड़, प्रत्येक हेडर को सशर्त रूप से जोड़ने की अनुमति देता है (केवल अगर मूल प्रतिक्रिया में उस हेडर को प्रदान नहीं करता है) या बिना शर्त (हेडर को जोड़ने और हेडर को फिर से लिखना शुरू करता है, यदि वर्तमान में)।

फ़ीचर अनुरोधों के साथ, आपको आमतौर पर इस बात की कोई पुष्टि नहीं मिलती है कि क्या वे वास्तव में नई सुविधा को लागू करने पर विचार कर रहे हैं ... या फिर चाहे वे पहले से ही इस पर काम कर रहे हों ... यह अभी घोषणा की गई है जब वे कर रहे हैं। इसलिए, मुझे नहीं पता कि ये लागू किए जाएंगे या नहीं। ऐसा तर्क दिया जाना चाहिए कि चूंकि यह क्षमता पहले से ही लैम्ब्डा @ एज के माध्यम से उपलब्ध है, इसलिए आधार कार्यक्षमता में इसकी कोई आवश्यकता नहीं है ... लेकिन मेरा प्रतिवाद यह है कि आधार कार्यात्मक रूप से क्षमता के बिना फीचर-पूर्ण नहीं है। सरल, स्थैतिक प्रतिक्रिया हेडर हेरफेर करें, और यदि यह एकमात्र कारण है कि ट्रिगर की आवश्यकता है, तो लैम्बडा ट्रिगर्स की आवश्यकता एक अनावश्यक लागत है, आर्थिक रूप से और अतिरिक्त विलंबता में (भले ही जरूरी नहीं कि एक बाहरी लागत हो)।


हालांकि यह अभी भी कष्टप्रद है।
एरिका केन


1
टाडा, वास्तव में, @Kunal। यह एक उदाहरण है जो मैंने उत्तर में "बाद के पुट + कॉपी ऑपरेशन द्वारा ऑब्जेक्ट के मेटाडेटा में जोड़ा" के रूप में संदर्भित किया है सावधानी के साथ इसका उपयोग करें, और परीक्षण करें, क्योंकि कैविटीज़ हैं। यह आपके सभी डेटास्टैम्प को रीसेट कर देगा और एन्क्रिप्शन के लिए निहितार्थ हो सकता है। यह ऑब्जेक्ट एटैग को मल्टीपार्ट से सिंगल पार्ट फॉर्मेट में भी बदल सकता है, जो कि एक अलग एल्गोरिथ्म है, और किसी भी सिस्टम को भ्रमित करेगा, जिसने एटिग्स को भविष्य की अखंडता जांच के लिए कहीं और संग्रहीत किया है। यदि संस्करण को बाल्टी पर सक्षम किया जाता है, तो आपकी भंडारण लागत दोगुनी हो जाती है जब तक आप पुराने संस्करणों को साफ नहीं करते।
माइकल - sqlbot

1
नई लैम्ब्डा @ एज सेवा अब एक तंत्र भी प्रदान करती है जो कैश-कंट्रोल प्रतिक्रिया हेडर (अन्य के बीच) को ऑन-द-फ्लाई में जोड़ने की अनुमति देती है। मैंने उत्तर को एक कार्यशील उदाहरण के साथ अद्यतन किया है कि यह कैसे किया जा सकता है।
माइकल - sqlbot

1
@ ब्रोश की भूमिका "ट्रस्ट पॉलिसी" को लंबोदा और एडगेलंबा दोनों सेवाओं को सूचीबद्ध करने की आवश्यकता है। Docs.aws.amazon.com/lambda/latest/dg/… पर एक नज़र डालें
माइकल - sqlbot
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.