

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
<a name="runtimes-custom"></a>

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.](chapter-layers.md) Saat Anda membuat fungsi Lambda, pilih runtime khusus [OS (keluarga runtime](runtimes-provided.md)). `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](runtimes-provided.md)

Untuk panduan proses penerapan runtime kustom, lihat. [Tutorial: Membangun runtime khusus](runtimes-walkthrough.md)

**Topics**
+ [Persyaratan](#runtimes-custom-build)
+ [Menerapkan streaming respons dalam runtime khusus](#runtimes-custom-response-streaming)
+ [Membangun runtime kustom untuk Instans Terkelola Lambda](#runtimes-custom-managed-instances)

## Persyaratan
<a name="runtimes-custom-build"></a>

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
<a name="runtimes-custom-initialization"></a>

Tugas inisialisasi dijalankan sekali [per instans fungsi](lambda-runtime-environment.md) 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, lihat[Variabel lingkungan runtime yang ditetapkan](configuration-envvars.md#configuration-envvars-runtime).
+ **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](runtimes-api.md#runtimes-api-initerror) 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](services-xray.md).

**Example 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
<a name="runtimes-custom-processing"></a>

Saat belajar, runtime menggunakan [antarmuka runtime Lambda](runtimes-api.md) 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](runtimes-api.md#runtimes-api-next) 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](runtimes-api.md#runtimes-api-response) API untuk memposting respons dari penanggung jawab.
+ **Mengatasi kesalahan** – Jika terjadi kesalahan, hubungi [kesalahan invokasi](runtimes-api.md#runtimes-api-invokeerror) API.
+ **Pembersihan** – Lepaskan sumber daya yang tidak digunakan, kirim data ke layanan lain, atau lakukan tugas tambahan sebelum melanjutkan ke event berikutnya.

### Entrypoint
<a name="runtimes-custom-bootstrap"></a>

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 bernama`bootstrap`, 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`

**Example bootstrap**  

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

## Menerapkan streaming respons dalam runtime khusus
<a name="runtimes-custom-response-streaming"></a>

Untuk [fungsi streaming respons](configuration-response-streaming.md), 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. Untuk melakukan streaming respons ke Lambda, runtime harus:
  + Atur header `Lambda-Runtime-Function-Response-Mode` HTTP ke`streaming`.
  + 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
<a name="runtimes-custom-managed-instances"></a>

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
<a name="runtimes-custom-managed-instances-concurrency"></a>

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](runtimes-api.md#runtimes-api-next), hingga batas yang ditentukan oleh variabel lingkungan. `AWS_LAMBDA_MAX_CONCURRENCY`
+ **Menangani `/response` permintaan bersamaan** - Beberapa pemanggilan dapat memanggil API respons [pemanggilan](runtimes-api.md#runtimes-api-response) 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
<a name="runtimes-custom-managed-instances-implementation"></a>

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.

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

1. **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
<a name="runtimes-custom-managed-instances-considerations"></a>
+ **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](monitoring-cloudwatchlogs-logformat.md).
+ **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](lambda-managed-instances-execution-environment.md)