15

TLDR: हम आने वाले प्रतिक्रिया के लिए नया कैश व्यवहार बनाकर CloudFront 307 रीडायरेक्ट कैशिंग चाल करने के लिए है हमारे Lambda समारोह से।आकार छवियों और एक ही URL में उन्हें तुरंत मिल: एडब्ल्यूएस CloudFront -> S3 -> लैम्ब्डा -> CloudFront

आप विश्वास नहीं करेंगे कि हम इसे प्राप्त करने के लिए कितने करीब हैं। हमने पिछले चरण में इतनी बुरी तरह फंस गई है।

व्यापार मामला:

हमारे आवेदन भंडार S3 में छवियों और व्यवस्था विश्व भर में किसी भी भौगोलिक धीमी चढ़ाव से बचने के लिए CloudFront के साथ उन्हें कार्य करता है। अब, हम डिज़ाइन के साथ वास्तव में लचीला होना चाहते हैं और सीधे CanFront URL में नई छवि डिमेंमेंट का अनुरोध करने में सक्षम होना चाहते हैं! प्रत्येक नए छवि का आकार मांग पर बनाया जाएगा और फिर एस 3 में संग्रहीत किया जाएगा, इसलिए दूसरी बार अनुरोध किया जाएगा कि यह वास्तव में जल्दी से कार्य करेगा क्योंकि यह एस 3 में मौजूद होगा और क्लाउडफ्रंट में भी कैश किया जाएगा।

आइए कहें कि उपयोगकर्ता ने छवि chucknorris.jpg अपलोड की है। केवल मूल छवि S3 में संग्रहीत किया जाएगा और इस तरह हमारे पृष्ठ पर पूरा किया wil:

//xxxxx.cloudfront.net/chucknorris.jpg

हम गणना की है कि अब हम एक थंबनेल प्रदर्शित करने के लिए की जरूरत है 200x200 पिक्सल का। इसलिए हम अपने टेम्पलेट में होने की छवि src डाल:

//xxxxx.cloudfront.net/chucknorris-200x200.jpg

जब इस नए आकार अनुरोध किया जाता है, अमेज़न वेब सेवाओं उस पर प्रदान करने के लिए एक ही बाल्टी में और अनुरोधित कुंजी के साथ फ्लाई। इस तरह से छवि क्लाउडफ्रंट के उसी यूआरएल में सीधे लोड हो जाएगी।

enter image description here

यहाँ कैसे अजगर लैम्ब्डा समाप्त होता है:

मैं वास्तुकला सिंहावलोकन के साथ एक बदसूरत ड्राइंग और कैसे हम एडब्ल्यूएस में यह कर रहे हैं पर कार्यप्रवाह बनाया

return { 
    'statusCode': '301', 
    'headers': {'location': redirect_url}, 
    'body': '' 
} 

समस्या :

यदि हम लैम्ब्डा फ़ंक्शन को S3 पर रीडायरेक्ट करते हैं, तो यह एक आकर्षण की तरह काम करता है। यदि हम क्लाउडफ्रंट पर रीडायरेक्ट करते हैं, तो यह रीडायरेक्ट लूप में जाता है क्योंकि क्लाउडफ्रंट 307 (साथ ही 301, 302 और 303) तक पहुंचता है। जैसे ही हमारे लैम्ब्डा समारोह CloudFront पर रीडायरेक्ट के रूप में, CloudFront एपीआई द गेटवे यूआरएल कॉल के बजाय S3 से छवि प्राप्त करते समय की:

enter image description here

मैं CloudFront के Behaviors सेटिंग्स टैब में नए कैश व्यवहार बनाना चाहेंगे। इस व्यवहार को लैम्ब्डा या एस 3 से प्रतिक्रियाओं को कैश नहीं करना चाहिए (पता नहीं है कि आंतरिक रूप से वास्तव में क्या हो रहा है), लेकिन फिर भी इस आकार के किसी भी अनुरोध को इस तरह के आकार में कैश करना चाहिए। मैं पथ पैटर्न -\d+x\d+\..+$ सेट करने की कोशिश कर रहा हूं, "लैम्ब्डा फ़ंक्शन एसोसिएशन" जोड़ने के लिए लैम्ब्डा फ़ंक्शन का एआरएन जोड़ें और इवेंट प्रकार Origin Response सेट करें। इसके आगे, मैं "डिफ़ॉल्ट टीटीएल" को 0 पर सेट कर रहा हूं।

लेकिन मैं व्यवहार किसी त्रुटि के कारण नहीं बचा सकते हैं:

enter image description here

हम सही रास्ते पर हैं, या इस "लैम्ब्डा समारोह एसोसिएशन" के विचार पूरी तरह से अलग है?

+0

आपको लगता है कि त्रुटि संदेश के बारे में एडब्ल्यूएस समर्थन से संपर्क करना चाहिए। इसके अलावा, क्या आपने क्लाउडफ़्रंट की नई Lambda @ Edge सुविधा देखी है? –

उत्तर

7

अंततः मैं इसे हल करने में सक्षम था। हालांकि यह वास्तव में एक संरचनात्मक समाधान नहीं है, यह वही करता है जो हमें चाहिए।

पहला, माइकल के जवाब के लिए धन्यवाद, मैंने सभी मीडिया प्रकारों से मेल खाने के लिए पथ पैटर्न का उपयोग किया है। दूसरा, कैश व्यवहार पृष्ठ मेरे लिए थोड़ा भ्रामक था: वास्तव में लैम्ब्डा एसोसिएशन लैम्ब्डा @ एज के लिए है, हालांकि मैंने इसे कैश व्यवहार के सभी टूलटिप्स में कहीं भी नहीं देखा: आप जो देखते हैं वह केवल लैम्ब्डा है। यह सुविधा हमारी मदद नहीं कर सकती है क्योंकि हम उस विशेष समस्या के कारण लैम्ब्डा @ एज के साथ हमारे एडब्ल्यूएस सेवा क्षेत्र को विस्तारित नहीं करना चाहते हैं।
मैं कई कैश व्यवहार, मीडिया प्रकार प्रति एक है जिसका हम समर्थन परिभाषित किया है::

enter image description here

प्रत्येक कैश व्यवहार मैं Default TTL सेट 0 होने के लिए

यहाँ समाधान दृष्टिकोण है।

और सबसे महत्वपूर्ण हिस्सा: लैम्ब्डा समारोह में, मैं एक Cache-Control हैडर आकृति परिवर्तन छवियों के लिए जब उन्हें S3 में डालने जोड़ लिया है:

s3_resource.Bucket(BUCKET).put_object(Key=new_key, 
             Body=edited_image_obj, 
             CacheControl='max-age=12312312', 
             ContentType=content_type) 

प्रमाणित करने के लिए है कि सब कुछ काम करता है, मुझे लगता है कि नया अब देखते हैं छवि आयाम CloudFront में कैश हेडर के साथ परोसा जाता है:

enter image description here

+0

आकार बदलने के लिए 'कैश-कंट्रोल' शीर्षलेख जोड़ने के लिए इतना महत्वपूर्ण क्यों है? मुझे लगता है कि 'डिफ़ॉल्ट टीटीएल' को '0' होने के लिए पहले से ही पर्याप्त है। नहीं? –

+2

अपने खुद के बेवकूफ सवाल का जवाब देने के लिए। मैंने इस https://sketchboard.io/blog/serverless-image-resize-with-amazon-lambda के बारे में एक और ब्लॉग पोस्ट पढ़ा जो बताता है कि 'अधिकतम आयु' की आवश्यकता क्यों है। क्लाउडफ्रंट द्वारा इसका उपयोग यह निर्धारित करने के लिए किया जाएगा कि ऑब्जेक्ट को कैश करना कितना लंबा है (पहले रन के बाद, जो डिफ़ॉल्ट 0 का उपयोग कर रहा है)। उत्कृष्ट सवाल और जवाब यहाँ! @katericata। –

1

आप सही रास्ते पर हैं ... शायद ... लेकिन कम से कम दो समस्याएं हैं।

"लैम्ब्डा फ़ंक्शन एसोसिएशन" जिसे आप यहां कॉन्फ़िगर कर रहे हैं उसे लैम्ब्डा @ एज कहा जाता है, और यह अभी तक उपलब्ध नहीं है। केवल वे उपयोगकर्ता जो इसे एक्सेस कर सकते हैं वे उपयोगकर्ता हैं जिन्होंने सीमित पूर्वावलोकन में शामिल होने के लिए आवेदन किया है। "maximum allowed is 0" त्रुटि का अर्थ है कि आप पूर्वावलोकन प्रतिभागी नहीं हैं। मैंने सभी खातों के लिए लाइव होने पर संबंधित कोई भी घोषणा नहीं देखी है।

लेकिन एक बार यह उपलब्ध होने के बाद भी, यह आपकी मदद करने वाला नहीं है, जिस तरह से आप अपेक्षा करते हैं, क्योंकि मुझे विश्वास नहीं है कि मूल प्रतिक्रिया ट्रिगर आपको क्लाउडफ्रंट को अलग करने की कोशिश करने के लिए कुछ भी करने की अनुमति देता है गंतव्य और रीडायरेक्ट का पालन करें। यदि आप दस्तावेज देखते हैं जो इस दावे के विपरीत है, तो कृपया इसे मेरे ध्यान में लाएं।

हालांकि ... लैम्बडा @ एज 307 पर Cache-Control: no-cache सेट करने के लिए उपयोगी होगा, इसलिए क्लाउडफ्रंट इसे कैश नहीं करेगा, लेकिन रीडायरेक्ट को अभी भी ब्राउज़र पर वापस जाने की आवश्यकता होगी।

नोट भी, लैम्ब्डा @ एज केवल नोड का समर्थन करता है, पायथन नहीं ... तो हो सकता है कि यह आपकी योजना का हिस्सा भी न हो। मैं वास्तव में सवाल से नहीं बता सकता।

Read about the [email protected] limited preview

दूसरी समस्या:

I am trying to set path pattern -\d+x\d+\..+$

आप ऐसा नहीं कर सकते। पथ पैटर्न * वाइल्डकार्ड का समर्थन करने वाले स्ट्रिंग मैचों हैं। वे नियमित अभिव्यक्ति नहीं हैं। /*-*x*.jpg के साथ आप शायद multiple wildcards appear to be supported से दूर हो सकते हैं।

+0

सभी स्पष्टीकरणों के लिए धन्यवाद। मैंने आपके द्वारा प्रस्तावित पथ पैटर्न को बदल दिया है और मैंने सभी मीडिया फ़ाइल प्रकारों के लिए कई व्यवहार प्रदान किए हैं। लैम्ब्डा @ एज के बारे में, यह अमेज़ॅन के लिए इस तरह परिभाषित करने के लिए पूरी तरह से अनुचित है। उन्होंने टूलटिप जानकारी संवाद में "एज" शब्द का कभी भी उल्लेख नहीं किया है। मुझे नहीं लगता कि लैम्ब्डा @ एज हमारी आवश्यकताओं के अनुरूप होगा, इसके अलावा वर्तमान में इसमें केवल नोड है, लेकिन हम पाइथन के साथ रहना चाहते हैं क्योंकि हमारे पास पीआईएल का उपयोग करके हमारी फसल/आकार बदलने वाले एल्गोरिदम हैं। – katericata

+0

मुझे समझ में नहीं आता कि आप इसे "अनुचित" कहकर क्या मतलब है। आप क्लाउडफ्रंट के पीछे एपीआई गेटवे के साथ किसी भी भाषा में लैम्ब्डा फ़ंक्शन का उपयोग कर सकते हैं, लेकिन आप केवल लैम्बडा @ एज के साथ क्लाउडफ्रंट अनुरोध/प्रतिक्रिया व्यवहार को आंतरिक रूप से "हुक" और संशोधित कर सकते हैं ... और यह (इस तथ्य के साथ कि नोड.जेएस है समर्थित भाषा) दोनों [लैम्ब्डा दस्तावेज] (http://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html) और [क्लाउडफ्रंट दस्तावेज़] दोनों में स्पष्ट रूप से बताया गया है (http: // docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html)। एडब्ल्यूएस यहां भ्रामक नहीं रहा है। –

+0

मैं आपसे सहमत हूं कि आधिकारिक दस्तावेज यह स्पष्ट करता है, हालांकि, मेरे बयान के साथ मेरा क्या मतलब था कि यह कैश व्यवहार पृष्ठ (अपवाद संदेश में भी नहीं) पर नहीं बताया गया है। वहां आपको एज का कहीं भी उल्लेख नहीं किया गया है, और मुझे यह थोड़ा भ्रामक लगता है। हमारे मामले में, जैसा कि हम केवल लैम्ब्डा का उपयोग करते हैं, यह आश्चर्यजनक था क्योंकि लैम्ब्डा @ एज एडब्ल्यूएस परिवार में नई सेवा है और वर्तमान में यह हमारे दायरे में नहीं है। :) – katericata

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