it-swarm.dev

AWS lambda api gateway error "Respons proxy Lambda cacat"

Saya mencoba membuat contoh hello world dengan AWS lambda dan menyajikannya melalui gerbang api. Saya mengklik "Buat Fungsi Lambda", yang mengatur gerbang api dan memilih opsi Fungsi Kosong. Saya menambahkan fungsi lambda yang terdapat pada AWS gateway untuk memulai panduan

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

Masalahnya adalah ketika saya membuat permintaan GET untuk itu, itu mengembalikan kembali { "message": "Internal server error" } respon 502. Dan log mengatakan "Eksekusi gagal karena kesalahan konfigurasi: Respons proxy Lambda cacat".

46
jjbskir

Biasanya, ketika Anda melihat Malformed Lambda proxy response, itu berarti respons Anda dari fungsi Lambda Anda tidak sesuai dengan format yang diharapkan oleh API Gateway, seperti ini

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

Jika Anda tidak menggunakan integrasi proxy Lambda, Anda dapat masuk ke konsol Gateway API dan hapus centang pada kotak centang integrasi proxy Lambda.

Juga, jika Anda melihat Malformed Lambda proxy response intermiten, itu mungkin berarti permintaan untuk fungsi Lambda Anda telah diperketat oleh Lambda, dan Anda perlu meminta peningkatan batas eksekusi bersamaan pada fungsi Lambda.

61
Ka Hou Ieong

Jika lambda digunakan sebagai proxy maka format responsnya seharusnya

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

Catatan: Badan harus dirubah

31
selftaught91

Ya jadi saya pikir ini karena Anda tidak benar-benar mengembalikan tanggapan http yang tepat di sana itulah sebabnya Anda mendapatkan kesalahan.

secara pribadi saya menggunakan serangkaian fungsi seperti:

    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.

Maka Anda cukup melakukan:

var responder = require('responder')

// some code

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

Dari AWS docs

Dalam fungsi Lambda di Node.js, Untuk mengembalikan respons yang berhasil, hubungi panggilan balik (null, {"statusCode": 200, "body": "results"}). Untuk melempar pengecualian, panggil panggilan balik (Kesalahan baru ('kesalahan server internal')). Untuk sebuah kesalahan sisi klien, mis., parameter yang diperlukan tidak ada, Anda dapat menghubungi callback (null, {"statusCode": 400, "body": "Parameter tidak ada .. ..."}) untuk mengembalikan kesalahan tanpa mengeluarkan pengecualian.

5
Jonathan

Kasus yang sangat sangat istimewa, jika Anda meneruskan tajuk secara langsung, ada kemungkinan Anda memiliki tajuk ini: 

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

Tetapi Amazon membutuhkan ini:

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

2
Miguel

Untuk siapa pun yang berjuang ketika respons muncul valid. Ini tidak bekerja:

callback(null,JSON.stringify( {
  isBase64Encoded: false,
  statusCode: 200,
  headers: { 'headerName': 'headerValue' },
  body: 'hello world'
})

tetapi ini:

callback(null,JSON.stringify( {
  'isBase64Encoded': false,
  'statusCode': 200,
  'headers': { 'headerName': 'headerValue' },
  'body': 'hello world'
})

Selain itu, tampaknya tidak ada kunci tambahan yang diizinkan hadir pada objek respons.

2
Ciryon

Saya mengalami kesalahan ini karena saya tidak sengaja menghapus variabel ServerlessExpressLambdaFunctionName dari CloudFormation AWS :: Serverless :: Api resource. Konteks di sini adalah https://github.com/awslabs/aws-serverless-express "Jalankan aplikasi tanpa server dan REST API menggunakan kerangka kerja aplikasi Node.js Anda yang ada, di atas AWS Lambda dan Amazon API Gateway "

1
Mark

Jika menggunakan Go dengan https://github.com/aws/aws-lambda-go , Anda harus menggunakan events.APIGatewayProxyResponse

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

Saya sudah mencoba semua saran di atas tetapi tidak berhasil sementara body nilai tidak String

return {
    statusCode: 200,
    headers: {
        "Content-Type": "application/json",
        "Access-Control-Allow-Origin": "*"
    },
    body: JSON.stringify({
        success: true
    }),
    isBase64Encoded: false
};
0
Long Nguyen

Jika hal di atas tidak bekerja untuk siapa pun, saya mengalami kesalahan ini walaupun mengatur variabel respons dengan benar. 

Saya melakukan panggilan ke database RDS di fungsi saya. Ternyata yang menyebabkan masalah adalah aturan grup keamanan (masuk) pada database itu. 

Anda mungkin ingin membatasi alamat IP yang dapat mengakses API, tetapi jika Anda ingin membuatnya bekerja cepat/kotor untuk menguji apakah perubahan itu memperbaikinya, Anda dapat mengaturnya untuk menerima semua seperti itu (Anda juga dapat mengatur berkisar pada port untuk menerima semua port juga, tapi saya tidak melakukannya dalam contoh ini):

 enter image description here

0
abe732