Misalnya jika saya ingin mengembalikan kesalahan 400 tertentu untuk parameter yang tidak valid atau mungkin 201 ketika panggilan fungsi lambda menghasilkan buat.
Saya ingin memiliki kode status http yang berbeda tetapi sepertinya api gateway selalu mengembalikan kode status 200 bahkan jika fungsi lambda mengembalikan kesalahan.
amazon-web-services
aws-lambda
aws-api-gateway
MonkeyBonkey
sumber
sumber
Jawaban:
Perbarui per 20-9-2016
Amazon akhirnya membuat ini mudah menggunakan integrasi Proxy Lambda . Ini memungkinkan fungsi Lambda Anda mengembalikan kode dan header HTTP yang tepat:
Ucapkan selamat tinggal pada pemetaan permintaan / respons di API Gateway!
pilihan 2
Integrasikan aplikasi Express yang ada dengan Lambda / API Gateway menggunakan aws-serverless-express .
sumber
callback
gaya baru . Lakukan sajacallback(null, {statusCode: 200, body: 'whatever'})
.return { "isBase64Encoded": True, "statusCode": 200, "headers": { }, "body": "" }
Berikut cara tercepat untuk mengembalikan Kode Status HTTP ubahsuaian dan ubahsuaian
errorMessage
:Di dasbor API Gateway, lakukan hal berikut:
Tambahkan respons integrasi untuk setiap Kode Status HTTP yang Anda buat sebelumnya. Pastikan input passthrough dicentang. Gunakan lambda error regex untuk mengidentifikasi kode status mana yang harus digunakan saat Anda mengembalikan pesan kesalahan dari fungsi lambda Anda. Sebagai contoh:
Rute API Gateway Anda harus mengembalikan ini:
Saya tidak melihat cara untuk menyalin pengaturan ini dan menggunakannya kembali untuk metode yang berbeda, jadi kami memiliki banyak input manual yang berlebihan yang harus dilakukan!
Tanggapan Integrasi saya terlihat seperti ini:
sumber
return context.fail(new Error('bad one'))
Untuk dapat mengembalikan objek kesalahan khusus sebagai JSON, Anda harus melewati beberapa rintangan.
Pertama, Anda harus gagal pada Lambda dan meneruskannya ke objek JSON yang dirangkai:
Selanjutnya, Anda menyiapkan pemetaan regex untuk setiap kode status yang ingin Anda kembalikan. Menggunakan objek yang saya definisikan di atas, Anda akan menyiapkan regex ini untuk 400:
. * "status": 400. *
Terakhir, Anda menyiapkan Template Pemetaan untuk mengekstrak respons JSON dari properti errorMessage yang dikembalikan oleh Lambda. Template Pemetaan terlihat seperti ini:
$ input.path ('$. errorMessage')
Saya menulis artikel tentang ini yang menjelaskan lebih detail dan menjelaskan aliran respons dari Lambda ke API Gateway di sini: http://kennbrodhagen.net/2016/03/09/how-to-return-a-custom-error-object -dan-status-kode-dari-api-gateway-dengan-lambda /
sumber
1) Konfigurasi sumber daya Gateway API Anda untuk menggunakan Integrasi Proxy Lambda dengan mencentang kotak centang berlabel "Gunakan integrasi Proksi Lambda" pada layar "Permintaan Integrasi" dari definisi sumber daya Gateway API. (Atau tentukan di konfigurasi cloudformation / terraform / serverless / etc Anda)
2) Ubah kode lambda Anda dengan 2 cara
event
(argumen fungsi ke-1) dengan tepat. Ini bukan lagi hanya payload kosong, ini mewakili seluruh permintaan HTTP termasuk header, string kueri, dan isi. Contoh di bawah. Poin utamanya adalah bahwa badan JSON akan menjadi string yang membutuhkanJSON.parse(event.body)
panggilan eksplisit (jangan lupatry/catch
tentang itu). Contohnya ada di bawah.statusCode
,body
, danheaders
.body
harus berupa string, jadi lakukanJSON.stringify(payload)
sesuai kebutuhanstatusCode
bisa berupa angkaheaders
adalah objek dari nama header ke nilaiContoh Argumen Peristiwa Lambda untuk Integrasi Proxy
Contoh Bentuk Respons Panggilan Balik
Catatan - Saya yakin metode
context
seperticontext.succeed()
itu sudah tidak digunakan lagi. Mereka tidak lagi didokumentasikan meskipun tampaknya masih berfungsi. Saya pikir pengkodean ke API panggilan balik adalah hal yang benar untuk selanjutnya.sumber
Saya ingin kesalahan dari Lambda menjadi kesalahan 500 yang tepat, setelah melakukan banyak penelitian, muncul di bawah ini, yang berfungsi:
Di LAMBDA
Untuk tanggapan yang baik, saya kembali seperti di bawah ini:
Untuk respon yang buruk, kembali seperti di bawah ini
Di API Gateway
Untuk METODE DAPATKAN, ucapkan GET dari / res1 / service1:
Kemudian,
Sekarang, terbitkan / res1 / service1, tekan URL yang diterbitkan, yang terhubung ke lambda di atas
Menggunakan plugin chrome klien REST Lanjutan (atau Postman), Anda akan melihat kode http yang sesuai seperti kesalahan server (500) atau 400, alih-alih 200 kode tanggapan http untuk semua permintaan yang diberikan dalam "httpStatusCode".
Dari 'Dashboard' API, di API Gateway, kita bisa melihat kode status http seperti di bawah ini:
sumber
Cara termudah untuk melakukannya adalah dengan menggunakan integrasi LAMBDA_PROXY . Dengan metode ini, Anda tidak memerlukan transformasi khusus untuk disetel ke pipeline API Gateway.
Objek pengembalian Anda harus serupa dengan cuplikan di bawah ini:
Itu memang memiliki beberapa kekurangan: karena harus berhati-hati secara khusus tentang penanganan kesalahan, dan menggabungkan fungsi lambda Anda ke titik akhir API Gateway; yang mengatakan, jika Anda tidak benar-benar akan menggunakannya di tempat lain, itu tidak terlalu menjadi masalah.
sumber
Bagi mereka yang mencoba segalanya, tanyakan pertanyaan ini dan tidak dapat membuat ini berfungsi (seperti saya), periksa komentar thedevkit di posting ini (menyelamatkan hari saya):
https://forums.aws.amazon.com/thread.jspa?threadID=192918
Mereproduksi seluruhnya di bawah ini:
sumber
Ini adalah cara yang direkomendasikan pada Blog Hitung AWS jika menggunakan API Gateway. Memeriksa untuk melihat apakah integrasi berfungsi dengan pemanggilan Lambda langsung.
Untuk pemanggilan Lambda langsung, ini tampaknya menjadi penguraian solusi terbaik di sisi klien.
sumber
Saya menggunakan 0,5 tanpa server. Beginilah cara kerjanya, untuk kasus saya
s-function.json:
handler.js:
sumber
Jika Anda tidak ingin menggunakan proxy, Anda dapat menggunakan template ini:
sumber