Membangun runtime khusus untuk AWS Lambda - AWS Lambda

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Membangun runtime khusus untuk AWS Lambda

Anda dapat menerapkan AWS Lambda runtime dalam bahasa pemrograman apa pun. Runtime adalah program yang menjalankan metode handler fungsi Lambda saat fungsi tersebut dipanggil. Anda dapat menyertakan runtime dalam paket penerapan fungsi Anda atau mendistribusikannya dalam lapisan. Saat Anda membuat fungsi Lambda, pilih runtime khusus OS (keluarga runtime). provided

catatan

Membuat runtime khusus adalah kasus penggunaan lanjutan. Jika Anda mencari informasi tentang kompilasi ke biner asli atau menggunakan off-the-shelf runtime pihak ketiga, lihat. Kapan menggunakan runtime khusus OS Lambda

Untuk panduan proses penerapan runtime kustom, lihat. Tutorial: Membangun runtime khusus

Persyaratan

Runtime khusus harus menyelesaikan tugas inisialisasi dan pemrosesan tertentu. Runtime menjalankan kode penyiapan fungsi, membaca nama handler dari variabel lingkungan, dan membaca peristiwa pemanggilan dari API runtime Lambda. Runtime meneruskan data event ke handler fungsi, dan memposting respons dari handler kembali ke Lambda.

Tugas inisialisasi

Tugas inisialisasi dijalankan sekali per instans fungsi untuk menyiapkan lingkungan untuk menangani invokasi.

  • Ambil pengaturan – Baca variabel lingkungan untuk mendapatkan detail tentang fungsi dan lingkungan.

    • _HANDLER – Lokasi ke handler, dari konfigurasi fungsi. Format standar adalah file.method, dengan file adalah nama file tanpa ekstensi, dan method merupakan nama metode atau fungsi yang ditentukan dalam file.

    • LAMBDA_TASK_ROOT – Direktori yang berisi kode fungsi.

    • AWS_LAMBDA_RUNTIME_API – Host dan port API runtime.

    Untuk daftar lengkap variabel yang tersedia, lihatVariabel lingkungan runtime yang ditetapkan.

  • Inisialisasi fungsi – Muat file handler dan jalankan kode global atau statis yang ada di dalamnya. Fungsi harus membuat sumber daya statis seperti klien SDK dan koneksi database satu kali, dan menggunakannya kembali untuk beberapa invokasi.

  • Mengatasi kesalahan – Jika terjadi kesalahan, hubungi kesalahan inisialisasi API dan segera keluar.

Inisialisasi diperhitungkan dalam waktu dan batas waktu eksekusi yang ditagih. Saat eksekusi memicu inisialisasi instans baru dari fungsi, Anda dapat melihat waktu inisialisasi dalam log dan jejak AWS X-Ray.

contoh log
REPORT RequestId: f8ac1208... Init Duration: 48.26 ms Duration: 237.17 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 26 MB

Memproses tugas

Saat belajar, runtime menggunakan antarmuka runtime Lambda untuk mengelola event masuk dan melaporkan kesalahan. Setelah menyelesaikan tugas inisialisasi, runtime memproses event masuk secara berulang. Dalam kode runtime Anda, lakukan langkah berikut secara berurutan.

  • Dapatkan event – Hubungi API invokasi beikutnya untuk mendapatkan event berikutnya. Badan respons berisi data event. Header respons berisi ID permintaan dan informasi lainnya.

  • Sebakan header pelacakan – Dapatkan header pelacakan X-Ray dari header Lambda-Runtime-Trace-Id di respons API. Tetapkan variabel lingkungan _X_AMZN_TRACE_ID secara lokal dengan nilai yang sama. X-Ray SDK menggunakan nilai ini untuk menghubungkan data pelacakan di antara layanan.

  • Buat objek konteks – Buat objek dengan informasi konteks dari variabel lingkungan dan header dalam respons API.

  • Memanggil handler fungsi – Berikan event dan objek konteks ke handler.

  • Menangani respons – Hubungi respons pemanggil API untuk memposting respons dari penanggung jawab.

  • Mengatasi kesalahan – Jika terjadi kesalahan, hubungi kesalahan invokasi API.

  • Pembersihan – Lepaskan sumber daya yang tidak digunakan, kirim data ke layanan lain, atau lakukan tugas tambahan sebelum melanjutkan ke event berikutnya.

Entrypoint

Titik entri runtime kustom adalah file eksekusi bernama bootstrap. File bootstrap dapat menjadi runtime, atau dapat memanggil file lain yang membuat runtime. Jika root paket penyebaran Anda tidak berisi file bernamabootstrap, Lambda mencari file di lapisan fungsi. Jika bootstrap file tidak ada atau tidak dapat dieksekusi, fungsi Anda mengembalikan Runtime.InvalidEntrypoint kesalahan saat pemanggilan.

Berikut adalah contoh bootstrap file yang menggunakan versi bundel Node.js untuk menjalankan JavaScript runtime dalam file terpisah bernama. runtime.js

contoh bootstrap
#!/bin/sh cd $LAMBDA_TASK_ROOT ./node-v11.1.0-linux-x64/bin/node runtime.js

Menerapkan streaming respons dalam runtime khusus

Untuk fungsi streaming respons, titik akhir response dan error titik akhir memiliki perilaku yang sedikit dimodifikasi yang memungkinkan runtime mengalirkan sebagian respons ke klien dan mengembalikan muatan dalam potongan. Untuk informasi selengkapnya tentang perilaku tertentu, lihat berikut ini:

  • /runtime/invocation/AwsRequestId/response— Menyebarkan Content-Type header dari runtime untuk dikirim ke klien. Lambda mengembalikan payload respons dalam potongan melalui HTTP/1.1 chunked transfer encoding. Stream respons dapat berukuran maksimum 20 MiB. Untuk melakukan streaming respons ke Lambda, runtime harus:

    • Atur header Lambda-Runtime-Function-Response-Mode HTTP kestreaming.

    • Atur header Transfer-Encoding ke chunked.

    • Tulis respons yang sesuai dengan spesifikasi pengkodean transfer chunked HTTP/1.1.

    • Tutup koneksi yang mendasarinya setelah berhasil menulis respons.

  • /runtime/invocation/AwsRequestId/error— Runtime dapat menggunakan titik akhir ini untuk melaporkan kesalahan fungsi atau runtime ke Lambda, yang juga menerima header. Transfer-Encoding Titik akhir ini hanya dapat dipanggil sebelum runtime mulai mengirimkan respons pemanggilan.

  • Laporkan kesalahan midstream menggunakan trailer kesalahan di /runtime/invocation/AwsRequestId/response — Untuk melaporkan kesalahan yang terjadi setelah runtime mulai menulis respons pemanggilan, runtime dapat secara opsional melampirkan header trailing HTTP bernama dan. Lambda-Runtime-Function-Error-Type Lambda-Runtime-Function-Error-Body Lambda memperlakukan ini sebagai respons yang berhasil dan meneruskan metadata kesalahan yang disediakan runtime kepada klien.

    catatan

    Untuk melampirkan header tambahan, runtime harus menetapkan nilai Trailer header di awal permintaan HTTP. Ini adalah persyaratan spesifikasi pengkodean transfer chunked HTTP/1.1.

    • Lambda-Runtime-Function-Error-Type— Jenis kesalahan yang ditemui runtime. Header ini terdiri dari nilai string. Lambda menerima string apa pun, tetapi kami merekomendasikan format. <category.reason> Misalnya, Runtime.APIKeyNotFound.

    • Lambda-Runtime-Function-Error-Body— Informasi yang dikodekan Base64 tentang kesalahan.

Membangun runtime kustom untuk Instans Terkelola Lambda

Instans Terkelola Lambda menggunakan API runtime yang sama dengan fungsi Lambda (default). Namun, ada perbedaan utama dalam cara runtime kustom harus diimplementasikan untuk mendukung model eksekusi bersamaan dari Instans Terkelola.

Penanganan permintaan bersamaan

Perbedaan utama saat membuat runtime kustom untuk Instans Terkelola adalah dukungan untuk pemanggilan bersamaan. Tidak seperti fungsi Lambda (default) di mana runtime memproses satu pemanggilan pada satu waktu, Instans Terkelola dapat memproses beberapa pemanggilan secara bersamaan dalam satu lingkungan eksekusi.

Runtime kustom Anda harus:

  • Mendukung /next permintaan bersamaan - Runtime dapat membuat beberapa panggilan simultan ke API pemanggilan berikutnya, hingga batas yang ditentukan oleh variabel lingkungan. AWS_LAMBDA_MAX_CONCURRENCY

  • Menangani /response permintaan bersamaan - Beberapa pemanggilan dapat memanggil API respons pemanggilan secara bersamaan.

  • Menerapkan penanganan permintaan aman utas - Pastikan pemanggilan bersamaan tidak saling mengganggu dengan mengelola sumber daya dan status bersama dengan benar.

  • Gunakan permintaan unik IDs — Lacak setiap pemanggilan secara terpisah menggunakan Lambda-Runtime-Aws-Request-Id header untuk mencocokkan respons dengan permintaan yang sesuai.

Pola implementasi

Pola implementasi khas untuk runtime Instans Terkelola melibatkan pembuatan thread atau proses pekerja untuk menangani pemanggilan bersamaan:

  1. Baca batas konkurensi — Pada inisialisasi, baca variabel AWS_LAMBDA_MAX_CONCURRENCY lingkungan untuk menentukan berapa banyak pemanggilan bersamaan yang akan didukung.

  2. Buat kumpulan pekerja — Inisialisasi kumpulan pekerja (utas, proses, atau tugas asinkron) sama dengan batas konkurensi.

  3. Loop pemrosesan pekerja - Setiap pekerja secara independen:

    • Panggilan /runtime/invocation/next untuk mendapatkan acara pemanggilan

    • Memanggil fungsi handler dengan data peristiwa

    • Memposting tanggapan terhadap /runtime/invocation/AwsRequestId/response

    • Mengulangi loop

Pertimbangan tambahan

  • Format logging - Instans Terkelola hanya mendukung format log JSON. Pastikan runtime Anda menghormati variabel AWS_LAMBDA_LOG_FORMAT lingkungan dan hanya menggunakan format JSON. Untuk informasi selengkapnya, lihat Mengkonfigurasi JSON dan format log teks biasa.

  • Sumber daya bersama — Berhati-hatilah saat menggunakan sumber daya bersama seperti /tmp direktori dengan pemanggilan bersamaan. Menerapkan mekanisme penguncian yang tepat untuk mencegah kondisi balapan.

Untuk informasi selengkapnya tentang lingkungan eksekusi Instans Terkelola Lambda, lihat. Memahami lingkungan eksekusi Instans Terkelola Lambda