node.js - AWS लैम्ब्डा एपीआई गेटवे त्रुटि "विकृत लाम्बा प्रॉक्सी प्रतिक्रिया"




amazon-web-services aws-lambda (8)

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

exports.handler = function(event, context, callback) {
  callback(null, {"Hello":"World"});  // SUCCESS with message
};

मुद्दा यह है कि जब मैं इसके लिए GET अनुरोध करता हूं, तो यह 502 प्रतिसाद { "message": "Internal server error" } । और लॉग कहते हैं "कॉन्फ़िगरेशन त्रुटि के कारण निष्पादन विफल हो गया: विकृत लाम्बा प्रॉक्सी प्रतिक्रिया"।


आमतौर पर, जब आप Malformed Lambda proxy response देखते हैं, तो इसका मतलब है कि आपके लैम्ब्डा फ़ंक्शन से आपकी प्रतिक्रिया उस प्रारूप से मेल नहीं खाती जो एपीआई गेटवे उम्मीद कर रहा है, जैसे

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}

यदि आप लैम्ब्डा प्रॉक्सी इंटीग्रेशन का उपयोग नहीं कर रहे हैं, तो आप एपीआई गेटवे कंसोल में लॉग इन कर सकते हैं और लैम्ब्डा प्रॉक्सी इंटीग्रेशन चेकबॉक्स को अनचेक कर सकते हैं।

इसके अलावा, यदि आप रुक-रुक कर Malformed Lambda proxy response देख रहे हैं, तो इसका मतलब यह हो सकता है कि आपके लैम्ब्डा फ़ंक्शन के अनुरोध लैम्बडा द्वारा थ्रॉटल किए गए हैं, और आपको लैम्ब्डा फ़ंक्शन पर समवर्ती निष्पादन सीमा वृद्धि का अनुरोध करने की आवश्यकता है।


एक बहुत ही विशेष मामला, यदि आप हेडर को सीधे पास करते हैं तो एक मौका है कि आपके पास यह हेडर है:

"set-cookie": [ "........" ]

लेकिन अमेज़न को इसकी आवश्यकता है:

"set-cookie": "[ \\"........\\" ]"


पायथन 3 के लिए:

import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'headers': {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Origin': '*'
        },
        'body': json.dumps({
            'success': True
        }),
        "isBase64Encoded": False
    }

ध्यान दें कि body को सेट करने की आवश्यकता नहीं है, यह सिर्फ खाली हो सकता है:

        'body': ''

मुझे यह त्रुटि हुई क्योंकि मैंने गलती से CloudFormation AWS :: Serverless :: Api संसाधन से चर ServerlessExpressLambdaFunctionName हटा दिया। यहाँ संदर्भ https://github.com/awslabs/aws-serverless-express "AWS लैंबडा और अमेज़ॅन एपीआई गेटवे के ऊपर, अपने मौजूदा Node.js एप्लिकेशन फ्रेमवर्क का उपयोग करके सर्वर रहित एप्लिकेशन और REST API चलाएं"


यदि आप https://github.com/aws/aws-lambda-go साथ गो का उपयोग कर रहे हैं, तो आपको events.APIGatewayProxyResponse का उपयोग करना होगा events.APIGatewayProxyResponse

func hello(ctx context.Context, event ImageEditorEvent) (events.APIGatewayProxyResponse, error) {
    return events.APIGatewayProxyResponse{
        IsBase64Encoded: false,
        StatusCode:      200,
        Headers:         headers,
        Body:            body,
    }, nil
}

यदि उपरोक्त किसी के लिए काम नहीं करता है, तो मैं प्रतिक्रिया चर को सही ढंग से सेट करने के बावजूद इस त्रुटि में भाग गया।

मैं अपने फ़ंक्शन में RDS डेटाबेस को कॉल कर रहा था। यह पता चला कि जो समस्या पैदा कर रहा था वह उस डेटाबेस पर सुरक्षा समूह के नियम (इनबाउंड) था।

आप शायद उन IP पतों को प्रतिबंधित करना चाहते हैं जो एपीआई तक पहुंच सकते हैं, लेकिन यदि आप इसे जल्दी / गंदा काम करना चाहते हैं, तो यदि वह इसे ठीक करता है तो आप इसे सेट कर सकते हैं ताकि आप इसे स्वीकार कर सकें। सभी बंदरगाहों को भी स्वीकार करने के लिए बंदरगाहों पर रेंज, लेकिन मैंने इस उदाहरण में ऐसा नहीं किया):


हाँ तो मुझे लगता है कि यह इसलिए है क्योंकि आप वास्तव में एक उचित http प्रतिक्रिया नहीं दे रहे हैं यही कारण है कि आप त्रुटि प्राप्त कर रहे हैं।

व्यक्तिगत रूप से मैं इस तरह के कार्यों का एक सेट का उपयोग करता हूं:

    module.exports = {
        success: (result) => {
            return {
                statusCode: 200,
                headers: {
                    "Access-Control-Allow-Origin" : "*", // Required for CORS support to work
                    "Access-Control-Allow-Credentials" : true // Required for cookies, authorization headers with HTTPS
                },
                body: JSON.stringify(result),
            }
        },
        internalServerError: (msg) => {
            return {
                statusCode: 500,
                headers: {
                    "Access-Control-Allow-Origin" : "*", // Required for CORS support to work
                    "Access-Control-Allow-Credentials" : true // Required for cookies, authorization headers with HTTPS
                },
                body: JSON.stringify({
                    statusCode: 500,
                    error: 'Internal Server Error',
                    internalError: JSON.stringify(msg),
                }),
            }
        }
} // add more responses here.

तो फिर तुम बस करो:

var responder = require('responder')

// some code

callback(null, responder.success({ message: 'hello world'}))

AWS डॉक्स से

Node.js में एक लैम्ब्डा फ़ंक्शन में, एक सफल प्रतिक्रिया वापस करने के लिए, कॉलबैक (अशक्त, {"स्टेटसकोड": 200, "बॉडी": "परिणाम"}) कॉल करें। एक अपवाद फेंकने के लिए, कॉलबैक (नई त्रुटि ('आंतरिक सर्वर त्रुटि'))। क्लाइंट-साइड त्रुटि के लिए, उदाहरण के लिए, एक आवश्यक पैरामीटर गायब है, आप कॉलबैक (नल, {"स्टेटसकोड": 400, "बॉडी": "मिसिंग पैरामीटर ऑफ ... ..."}) को बिना फेंक दिए त्रुटि वापस कर सकते हैं। अपवाद।





aws-api-gateway