5

पर भेजें I मैं एक बाल्टी से .jpg फ़ाइल प्राप्त करने की कोशिश कर रहा हूं और उसे एपी गेटवे पर वापस भेज रहा हूं। मेरा मानना ​​है कि मेरे पास सेटअप सही है क्योंकि मुझे सामान लॉग इन दिखाई देता है। यह एस 3 ठीक से फ़ाइल पकड़ता है, और जीएम ग्राफिक्समैजिक पुस्तकालय है। यकीन नहीं है कि अगर मैं इसका उपयोग कर रहा हूं।एडब्ल्यूएस लैम्ब्डा फ़ंक्शन में S3 से ऑब्जेक्ट प्राप्त करें और एपी गेटवे

लैम्ब्डा समारोह मैं यह करने में (कोड के बहुत एडब्ल्यूएस उदाहरण से आता है):

async.waterfall([ 
    function download(next) { 
     console.log(srcKey); 
     console.log(srcBucket); 
     // Download the image from S3 into a buffer. 
     s3.getObject({ 
       Bucket: srcBucket, 
       Key: srcKey 
      }, 
      next); 
     }, 
    function transform(response, next) { 
     console.log(response); 
     next(null, 'image/jpeg', gm(response.Body).quality(85)); 

    }, 

    function sendData(contentType, data, next){ 
     console.log(contentType); 
     console.log(data); 
     imageBuffer = data.sourceBuffer; 
     context.succeed(imageBuffer); 
    } 
    ] 
); 

प्रतिक्रिया हेडर सामग्री-लंबाई है: 85,948 है, जो सही नहीं लगता है क्योंकि मूल फ़ाइल केवल 36 किलो है। किसी को पता है कि मैं क्या गलत कर रहा हूँ?

+0

यह असंभव नहीं है कि एक छवि प्रसंस्करण से आकार में वृद्धि कर सकता है, लेकिन यह काफी संभावना नहीं लगता है। वास्तविक प्रतिक्रिया शरीर जैसा दिखता है, कहता है, सहेजा जाता है फिर टेक्स्ट/हेक्स संपादक में देखा जाता है? –

+0

हा मूल रूप से सटीक उसी चीज को लागू किया गया, केवल अंततः इस क्यू एंड ए घंटों पर ठोकर खा रहा है: '( – Meekohi

+0

अब यह संभव है - https://aws.amazon.com/blogs/compute/binary-support-for-api-integrations- साथ-अमेज़ॅन-एपी-गेटवे/ –

उत्तर

2

आप API Gateway उपयोग नहीं करना चाहिए जब आप Lambda के साथ उपयोग करें द्विआधारी सामग्री वापस पारित करने के लिए। XML/JSON डेटा के साथ Lambda के साथ सेटअप करने के लिए सेटअप हैं। क्यों और कैसे here के बारे में और पढ़ें।

अपनी कॉलबैक श्रृंखला बदलने का प्रयास करें ताकि यह संशोधित छवि को S3 पर वापस अपलोड कर सके। सफल अपलोड के बाद, लक्ष्य ऑब्जेक्ट के URI वापस भेजें और अपने क्लाइंट को इसे रीडायरेक्ट करें।

+0

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

+1

इसे बस रखने के लिए: 'context.done (...)' कॉल '.toString() 'अपने बफर पर।' एडब्ल्यूएस गेटवे 'डेटा पाइपलाइन' एकीकरण अनुरोध/प्रतिक्रिया 'और वे हमेशा जेएसओएन/एक्सएमएल हैं। – kixorz

+0

इसके अलावा, एपीआई पर्यावरण के माध्यम से सामग्री को पास करना एडब्ल्यूएस पर्यावरण में एक बुरा अभ्यास है।' एपीआई गेटवे 'और' लैम्ब्डा 'दोनों में अपेक्षाकृत कम समय है।' एपीआई गेटवे 'हे एस 30 और 'लैम्ब्डा' 60s। – kixorz

4

आपको मिल छवि < प्राप्त कर सकते हैं -> एपीआई गेटवे < -> लैम्ब्डा < -> S3 आसानी से एकीकरण।

लैम्ब्डा में, json के बजाय, वापसी छवि (buffer.toString('base64')) का बेस 64 स्ट्रिंग प्रतिनिधित्व, बाइनरी स्ट्रिंग बदलने और जोड़ने के लिए एपीआई गेटवे मजबूर विशिष्ट Content-Type (ताकि आप है कि आप को लागू उनके सीमित द्विआधारी सहायता का उपयोग करने की जरूरत नहीं है एक विशिष्ट स्वीकृति शीर्षलेख भेजने के लिए)।

एडब्ल्यूएस कंसोल में, एपीआई गेटवे पर जाएं, फिर प्रासंगिक विधि करने के लिए जाने के लिए और सेटिंग को अपडेट:

  • एकता अनुरोध

    • सही का निशान हटाएँ: उपयोग लैम्ब्डा प्रॉक्सी एकीकरण
  • विधि प्रतिक्रिया

    • रिस्पांस जोड़ें -> HTTP स्थिति:
    • हैडर जोड़ें: सामग्री प्रकार
  • एकता प्रतिक्रिया -> शीर्षक का मिलान -> प्रतिक्रिया हेडर -> सामग्री प्रकार

    • मैपिंग मूल्य: 'छवि/जेपीईजी' (सिंगल कोट पदार्थ)

कमांड लाइन से, स्ट्रिंग को बाइनरी में कनवर्ट करने के लिए नीचे दिए गए आदेश को चलाएं। सबसे पहले, rest-api-id और एपीआई गेटवे से संसाधन-आईडी पुनर्प्राप्त करें। फिर, (अपने स्वयं के साथ आराम-api-आईडी और संसाधन-आईडी की जगह) CLI में चलाएँ:

aws apigateway put-integration-response --rest-api-id <rest-api-id> --resource-id <resource-id> --http-method GET --status-code 200 --content-handling CONVERT_TO_BINARY 
+0

क्या लैम्ब्डा प्रॉक्सी एकीकरण के साथ ऐसा करने के लिए वैसे भी है? जब मैं लैम्ब्डा प्रॉक्सी एकीकरण का उपयोग अनचेक करता हूं, तो मेरी क्वेरी स्ट्रिंग्स अब लैम्ब्डा फ़ंक्शन को पास नहीं की जाती हैं। –

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