

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

# Membangun fungsi Lambda dengan Node.js
<a name="lambda-nodejs"></a>

Anda dapat menjalankan JavaScript kode dengan Node.js di AWS Lambda. Lambda menyediakan [runtime](lambda-runtimes.md) untuk Node.js yang menjalankan kode Anda untuk memproses peristiwa. Kode Anda berjalan di lingkungan yang menyertakan AWS SDK untuk JavaScript, dengan kredensi dari peran AWS Identity and Access Management (IAM) yang Anda kelola. Untuk mempelajari lebih lanjut tentang versi SDK yang disertakan dengan runtime Node.js, lihat. [Versi SDK yang disertakan Runtime](#nodejs-sdk-included)

Lambda mendukung runtime Node.js berikut.<a name="nodejs-supported-runtimes"></a>


| Nama | Pengidentifikasi | Sistem operasi | Tanggal pengusangan | Buat fungsi blok | Pembaruan fungsi blok | 
| --- | --- | --- | --- | --- | --- | 
|  Node.js 24  |  `nodejs24.x`  |  Amazon Linux 2023  |   30 Apr 2028   |   1 Jun 2028   |   1 Jul 2028   | 
|  Node.js 22  |  `nodejs22.x`  |  Amazon Linux 2023  |   30 Apr 2027   |   1 Jun 2027   |   1 Jul 2027   | 
|  Node.js 20  |  `nodejs20.x`  |  Amazon Linux 2023  |   30 Apr 2026   |   Agustus 31, 2026   |   Sep 30, 2026   | 

**Untuk membuat fungsi Node.js**

1. Buka [Konsol Lambda](https://console.aws.amazon.com/lambda).

1. Pilih **Buat fungsi**.

1. Konfigurasikan pengaturan berikut:
   + **Nama fungsi**: Masukkan nama untuk fungsi tersebut.
   + **Runtime**: Pilih **Node.js 24.x**.

1. Pilih **Buat fungsi**.

Konsol membuat fungsi Lambda dengan satu file sumber bernama `index.mjs`. Anda dapat mengedit file ini dan menambahkan lebih banyak file di editor kode bawaan. Di bagian **DEPLOY**, pilih **Deploy** untuk memperbarui kode fungsi Anda. Kemudian, untuk menjalankan kode Anda, pilih **Create test event** di bagian **TEST EVENTS**.

File `index.mjs` mengekspor fungsi bernama `handler` yang menerima objek peristiwa dan objek konteks. Ini adalah [fungsi handler](nodejs-handler.md) yang dipanggil Lambda saat fungsi tersebut dipanggil. Waktu habis fungsi Node.js mendapatkan peristiwa invokasi dari Lambda dan meneruskannya ke handler. Dalam konfigurasi fungsi, nilai handler adalah `index.handler`.

Saat Anda menyimpan kode fungsi, konsol Lambda membuat paket penyebaran arsip file.zip. Saat Anda mengembangkan kode fungsi di luar konsol (menggunakan IDE), Anda perlu [membuat paket penerapan](nodejs-package.md) untuk mengunggah kode Anda ke fungsi Lambda.

Runtime fungsi meneruskan objek konteks ke handler, selain peristiwa invokasi. [Objek konteks](nodejs-context.md) berisi informasi tambahan tentang lingkungan invokasi, fungsi, dan eksekusi. Informasi selengkapnya tersedia dari variabel lingkungan.

Fungsi Lambda Anda dilengkapi dengan grup CloudWatch log Log. Runtime fungsi mengirimkan detail tentang setiap invokasi ke CloudWatch Logs. Detail tersebut menyampaikan [log yang dihasilkan fungsi Anda](nodejs-logging.md) selama invokasi. Jika fungsi mengembalikan kesalahan, Lambda memformat kesalahan dan mengembalikannya ke pemanggil.

**Topics**
+ [

## Versi SDK yang disertakan Runtime
](#nodejs-sdk-included)
+ [

## Menggunakan keep-alive untuk koneksi TCP
](#nodejs-keep-alive)
+ [

## Pemuatan sertifikat CA
](#nodejs-certificate-loading)
+ [

## Fitur Node.js eksperimental
](#nodejs-experimental-features)
+ [

# Tentukan penangan fungsi Lambda di Node.js
](nodejs-handler.md)
+ [

# Deploy fungsi Lambda Node.js dengan arsip file .zip
](nodejs-package.md)
+ [

# Deploy fungsi Lambda Node.js dengan gambar kontainer
](nodejs-image.md)
+ [

# Bekerja dengan lapisan untuk fungsi Lambda Node.js
](nodejs-layers.md)
+ [

# Menggunakan objek konteks Lambda untuk mengambil informasi fungsi Node.js
](nodejs-context.md)
+ [

# Log dan pantau fungsi Node.js Lambda
](nodejs-logging.md)
+ [

# Menginstrumentasi kode Node.js di AWS Lambda
](nodejs-tracing.md)

## Versi SDK yang disertakan Runtime
<a name="nodejs-sdk-included"></a>

[Semua [runtime Lambda Node.js yang didukung](#nodejs-supported-runtimes) menyertakan versi minor tertentu dari AWS SDK untuk JavaScript v3, bukan versi terbaru.](https://github.com/aws/aws-sdk-js-v3/releases) Versi minor tertentu yang disertakan dalam runtime bergantung pada versi runtime dan versi Anda. Wilayah AWS Untuk menemukan versi spesifik SDK yang disertakan dalam runtime yang Anda gunakan, buat fungsi Lambda dengan kode berikut.

**Example index.mjs**  

```
import packageJson from '@aws-sdk/client-s3/package.json' with { type: 'json' };

export const handler = async () => ({ version: packageJson.version });
```
Ini mengembalikan respons dalam format berikut:  

```
{
  "version": "3.632.0"
}
```

Untuk informasi selengkapnya, lihat [Menggunakan SDK untuk JavaScript v3 di handler Anda](nodejs-handler.md#nodejs-example-sdk-usage).

## Menggunakan keep-alive untuk koneksi TCP
<a name="nodejs-keep-alive"></a>

 HTTP/HTTPS Agen Node.js default membuat koneksi TCP baru untuk setiap permintaan baru. Untuk menghindari biaya pembuatan koneksi baru, keep-alive diaktifkan secara default di semua runtime Node.js yang [didukung](#nodejs-supported-runtimes). Keep-alive dapat mengurangi waktu permintaan untuk fungsi Lambda yang membuat beberapa panggilan API menggunakan SDK.

*Untuk menonaktifkan keep-alive, lihat [Menggunakan kembali koneksi dengan keep-alive di Node.js di](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-reusing-connections.html) SDK for 3.x Developer Guide.AWS JavaScript * Untuk informasi selengkapnya tentang penggunaan keep-alive, lihat [HTTP keep-alive aktif secara default di AWS SDK modular untuk di Blog Alat Pengembang](https://aws.amazon.com/blogs/developer/http-keep-alive-is-on-by-default-in-modular-aws-sdk-for-javascript/). JavaScript AWS 

## Pemuatan sertifikat CA
<a name="nodejs-certificate-loading"></a>

Untuk versi runtime Node.js hingga Node.js 18, Lambda secara otomatis memuat sertifikat CA (otoritas sertifikat) khusus Amazon untuk memudahkan Anda membuat fungsi yang berinteraksi dengan yang lain. Layanan AWS Misalnya, Lambda menyertakan sertifikat Amazon RDS yang diperlukan untuk memvalidasi [sertifikat identitas server](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html) yang diinstal pada database Amazon RDS Anda. Perilaku ini dapat memiliki dampak kinerja selama start dingin.

Dimulai dengan Node.js 20, Lambda tidak lagi memuat sertifikat CA tambahan secara default. Runtime Node.js 20 berisi file sertifikat dengan semua sertifikat Amazon CA terletak di`/var/runtime/ca-cert.pem`. Untuk memulihkan perilaku yang sama dari Node.js 18 dan runtime sebelumnya, setel [variabel `NODE_EXTRA_CA_CERTS` lingkungan](configuration-envvars.md) ke`/var/runtime/ca-cert.pem`.

Untuk kinerja yang optimal, kami sarankan untuk menggabungkan hanya sertifikat yang Anda butuhkan dengan paket penerapan Anda dan memuatnya melalui variabel `NODE_EXTRA_CA_CERTS` lingkungan. File sertifikat harus terdiri dari satu atau lebih root tepercaya atau sertifikat CA perantara dalam format PEM. Misalnya, untuk RDS, sertakan sertifikat yang diperlukan di samping kode Anda sebagai`certificates/rds.pem`. Kemudian, muat sertifikat dengan menyetel `NODE_EXTRA_CA_CERTS` ke`/var/task/certificates/rds.pem`.

## Fitur Node.js eksperimental
<a name="nodejs-experimental-features"></a>

Rilis bahasa Node.js upstream mengaktifkan beberapa fitur eksperimental secara default. Lambda menonaktifkan fitur-fitur ini untuk memastikan stabilitas runtime dan kinerja yang konsisten. Tabel berikut mencantumkan fitur eksperimental yang dinonaktifkan Lambda.


| Fitur eksperimental | Versi Node.js yang didukung | Bendera Node.js diterapkan oleh Lambda | Bendera Lambda untuk mengaktifkan kembali | 
| --- | --- | --- | --- | 
|  Support untuk mengimpor modul menggunakan require dalam modul ES  |  Node.js 20, Node.js 22  |  `--no-experimental-require-module`  |  `--experimental-require-module`  | 
|  Support untuk mendeteksi modul ES vs CommonJS secara otomatis  |  Node.js 22  |  `--no-experimental-detect-module`  |  `--experimental-detect-module`  | 

Untuk mengaktifkan fitur eksperimental yang dinonaktifkan, setel flag re-enable di variabel `NODE_OPTIONS` environment. Misalnya, untuk mengaktifkan modul ES memerlukan dukungan, atur `NODE_OPTIONS` ke`--experimental-require-module`. Lambda mendeteksi penggantian ini dan menghapus flag nonaktifkan yang sesuai.

**penting**  
 Menggunakan fitur eksperimental dapat menyebabkan ketidakstabilan dan masalah kinerja. Fitur-fitur ini dapat diubah atau dihapus di versi Node.js future. Fungsi yang menggunakan fitur eksperimental tidak memenuhi syarat untuk Perjanjian Tingkat Layanan Lambda (SLA) atau. AWS Dukungan

# Tentukan penangan fungsi Lambda di Node.js
<a name="nodejs-handler"></a>

*Handler* fungsi Lambda Anda adalah metode dalam kode fungsi Anda yang memproses peristiwa. Saat fungsi Anda diaktifkan, Lambda menjalankan metode handler. Fungsi Anda berjalan sampai handler mengembalikan respons, keluar, atau waktu habis.

Halaman ini menjelaskan cara bekerja dengan penangan fungsi Lambda di Node.js, termasuk opsi untuk penyiapan proyek, konvensi penamaan, dan praktik terbaik. Halaman ini juga menyertakan contoh fungsi Lambda Node.js yang mengambil informasi tentang pesanan, menghasilkan tanda terima file teks, dan menempatkan file ini di bucket Amazon Simple Storage Service (Amazon S3). Untuk informasi tentang cara menerapkan fungsi Anda setelah menulisnya, lihat [Deploy fungsi Lambda Node.js dengan arsip file .zip](nodejs-package.md) atau[Deploy fungsi Lambda Node.js dengan gambar kontainer](nodejs-image.md).

**Topics**
+ [

## Menyiapkan proyek penangan Node.js Anda
](#nodejs-handler-setup)
+ [

## Contoh kode fungsi Lambda Node.js
](#nodejs-example-code)
+ [

## Modul CommonJS dan ES
](#nodejs-commonjs-es-modules)
+ [

## Inisialisasi Node.js
](#nodejs-initialization)
+ [

## Konvensi penamaan handler
](#nodejs-handler-naming)
+ [

## Mendefinisikan dan mengakses objek peristiwa masukan
](#nodejs-example-input)
+ [

## Pola handler yang valid untuk fungsi Node.js
](#nodejs-handler-signatures)
+ [

## Menggunakan SDK untuk JavaScript v3 di handler Anda
](#nodejs-example-sdk-usage)
+ [

## Mengakses variabel lingkungan
](#nodejs-example-envvars)
+ [

## Menggunakan status global
](#nodejs-handler-state)
+ [

## Praktik terbaik kode untuk fungsi Lambda Node.js
](#nodejs-best-practices)

## Menyiapkan proyek penangan Node.js Anda
<a name="nodejs-handler-setup"></a>

Ada beberapa cara untuk menginisialisasi proyek Lambda Node.js. Misalnya, Anda dapat membuat proyek Node.js standar menggunakan`npm`, membuat [AWS SAM aplikasi](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/using-sam-cli-init.html#using-sam-cli-init-new), atau membuat [AWS CDK aplikasi](lambda-cdk-tutorial.md#lambda-cdk-step-1).

Untuk membuat proyek menggunakan`npm`:

```
npm init
```

Perintah ini menginisialisasi proyek Anda dan menghasilkan `package.json` file yang mengelola metadata dan dependensi proyek Anda.

Kode fungsi Anda tinggal di `.mjs` JavaScript file `.js` atau. Dalam contoh berikut, kami menamai file ini `index.mjs` karena menggunakan penangan modul ES. Lambda mendukung modul ES dan penangan CommonJS. Untuk informasi selengkapnya, lihat [Modul CommonJS dan ES](#nodejs-commonjs-es-modules).

Proyek fungsi Lambda Node.js yang khas mengikuti struktur umum ini:

```
/project-root
  ├── index.mjs — Contains main handler
  ├── package.json — Project metadata and dependencies
  ├── package-lock.json — Dependency lock file
  └── node_modules/ — Installed dependencies
```

## Contoh kode fungsi Lambda Node.js
<a name="nodejs-example-code"></a>

Contoh kode fungsi Lambda berikut mengambil informasi tentang pesanan, menghasilkan tanda terima file teks, dan menempatkan file ini di bucket Amazon S3.

**Example index.mjs fungsi Lambda**  

```
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';

// Initialize the S3 client outside the handler for reuse
const s3Client = new S3Client();

/**
 * Lambda handler for processing orders and storing receipts in S3.
 * @param {Object} event - Input event containing order details
 * @param {string} event.order_id - The unique identifier for the order
 * @param {number} event.amount - The order amount
 * @param {string} event.item - The item purchased
 * @returns {Promise<string>} Success message
 */
export const handler = async(event) => {
    try {
        // Access environment variables
        const bucketName = process.env.RECEIPT_BUCKET;
        if (!bucketName) {
            throw new Error('RECEIPT_BUCKET environment variable is not set');
        }

        // Create the receipt content and key destination
        const receiptContent = `OrderID: ${event.order_id}\nAmount: $${event.amount.toFixed(2)}\nItem: ${event.item}`;
        const key = `receipts/${event.order_id}.txt`;

        // Upload the receipt to S3
        await uploadReceiptToS3(bucketName, key, receiptContent);

        console.log(`Successfully processed order ${event.order_id} and stored receipt in S3 bucket ${bucketName}`);
        return 'Success';
    } catch (error) {
        console.error(`Failed to process order: ${error.message}`);
        throw error;
    }
};

/**
 * Helper function to upload receipt to S3
 * @param {string} bucketName - The S3 bucket name
 * @param {string} key - The S3 object key
 * @param {string} receiptContent - The content to upload
 * @returns {Promise<void>}
 */
async function uploadReceiptToS3(bucketName, key, receiptContent) {
    try {
        const command = new PutObjectCommand({
            Bucket: bucketName,
            Key: key,
            Body: receiptContent
        });

        await s3Client.send(command);
    } catch (error) {
        throw new Error(`Failed to upload receipt to S3: ${error.message}`);
    }
}
```

`index.mjs`File ini berisi bagian kode berikut:
+ `import`block: Gunakan blok ini untuk menyertakan pustaka yang dibutuhkan fungsi Lambda Anda, [AWS seperti](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/the-request-object.html) klien SDK.
+ `const s3Client`deklarasi: Ini menginisialisasi klien [Amazon S3](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/s3/) di luar fungsi handler. Hal ini menyebabkan Lambda menjalankan kode ini selama [fase inisialisasi](lambda-runtime-environment.md#runtimes-lifecycle-ib), dan klien dipertahankan untuk [digunakan kembali](lambda-runtime-environment.md#execution-environment-reuse) di beberapa pemanggilan.
+ JSDoc blok komentar: Tentukan jenis input dan output untuk handler Anda menggunakan [JSDoc anotasi](https://jsdoc.app/about-getting-started).
+ `export const handler`: Ini adalah fungsi handler utama yang dipanggil Lambda. Saat menerapkan fungsi Anda, tentukan properti `index.handler` [Handler](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-Handler). Nilai `Handler` properti adalah nama file dan nama metode handler yang diekspor, dipisahkan oleh sebuah titik.
+ `uploadReceiptToS3`fungsi: Ini adalah fungsi pembantu yang direferensikan oleh fungsi handler utama.

Agar fungsi ini berfungsi dengan baik, [peran pelaksanaannya](lambda-intro-execution-role.md) harus memungkinkan `s3:PutObject` tindakan. Juga, pastikan bahwa Anda mendefinisikan variabel `RECEIPT_BUCKET` lingkungan. Setelah pemanggilan berhasil, bucket Amazon S3 harus berisi file tanda terima.

## Modul CommonJS dan ES
<a name="nodejs-commonjs-es-modules"></a>

Node.js mendukung dua sistem modul: CommonJS dan ECMAScript modul (modul ES). [Lambda merekomendasikan penggunaan modul ES karena mendukung await tingkat atas, yang memungkinkan tugas asinkron diselesaikan selama inisialisasi lingkungan eksekusi.](#nodejs-initialization)

Node.js memperlakukan file dengan ekstensi nama `.cjs` file sebagai modul CommonJS sementara `.mjs` ekstensi menunjukkan modul ES. Secara default, Node.js memperlakukan file dengan ekstensi nama `.js` file sebagai modul CommonJS. Anda dapat mengkonfigurasi Node.js untuk memperlakukan `.js` file sebagai modul ES dengan menentukan `type` as `module` dalam `package.json` file fungsi. Anda dapat mengonfigurasi Node.js di Lambda untuk mendeteksi secara otomatis apakah `.js` file harus diperlakukan sebagai CommonJS atau sebagai modul ES dengan menambahkan `—experimental-detect-module` flag ke variabel lingkungan. `NODE_OPTIONS` Untuk informasi selengkapnya, lihat [Fitur Node.js Eksperimental](lambda-nodejs.md#nodejs-experimental-features).

Contoh berikut menunjukkan penangan fungsi yang ditulis menggunakan modul ES dan modul CommonJS. Contoh yang tersisa di halaman ini semuanya menggunakan modul ES.

------
#### [ ES module example ]

**Example - Penangan modul ES**  

```
const url = "https://aws.amazon.com/";

export const handler = async(event) => {
    try {
        const res = await fetch(url);
        console.info("status", res.status);
        return res.status;
    }
    catch (e) {
        console.error(e);
        return 500;
    }
};
```

------
#### [ CommonJS module example ]

**Example - Penangan modul CommonJS**  

```
const https = require("https");
let url = "https://aws.amazon.com/";

exports.handler = async function (event) {
  let statusCode;
  await new Promise(function (resolve, reject) {
    https.get(url, (res) => {
        statusCode = res.statusCode;
        resolve(statusCode);
      }).on("error", (e) => {
        reject(Error(e));
      });
  });
  console.log(statusCode);
  return statusCode;
};
```

------

## Inisialisasi Node.js
<a name="nodejs-initialization"></a>

Node.js menggunakan I/O model non-pemblokiran yang mendukung operasi asinkron yang efisien menggunakan loop peristiwa. Misalnya, jika Node.js membuat panggilan jaringan, fungsi terus memproses operasi lain tanpa memblokir respons jaringan. Ketika respon jaringan diterima, itu ditempatkan ke dalam antrean callback. Tugas dari antrian diproses ketika tugas saat ini selesai.

Lambda merekomendasikan penggunaan await tingkat atas sehingga tugas asinkron yang dimulai selama inisialisasi lingkungan eksekusi diselesaikan selama inisialisasi. Tugas asinkron yang tidak selesai selama inisialisasi biasanya akan berjalan selama pemanggilan fungsi pertama. Ini dapat menyebabkan perilaku atau kesalahan yang tidak terduga. Misalnya, inisialisasi fungsi Anda dapat membuat panggilan jaringan untuk mengambil parameter dari AWS Parameter Store. Jika tugas ini tidak selesai selama inisialisasi, nilainya mungkin null selama pemanggilan. Mungkin juga ada penundaan antara inisialisasi dan pemanggilan yang dapat memicu kesalahan dalam operasi yang sensitif terhadap waktu. Secara khusus, panggilan AWS layanan dapat mengandalkan tanda tangan permintaan yang sensitif terhadap waktu, yang mengakibatkan kegagalan panggilan layanan jika panggilan tidak selesai selama fase inisialisasi. Menyelesaikan tugas selama inisialisasi biasanya meningkatkan kinerja cold-start, dan pertama-tama memanggil kinerja saat menggunakan Provisioned Concurrency. Untuk informasi lebih lanjut, lihat posting blog kami [Menggunakan modul ES Node.js dan menunggu tingkat atas](https://aws.amazon.com/blogs/compute/using-node-js-es-modules-and-top-level-await-in-aws-lambda). AWS Lambda

## Konvensi penamaan handler
<a name="nodejs-handler-naming"></a>

Saat Anda mengonfigurasi fungsi, nilai pengaturan [Handler](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-Handler) adalah nama file dan nama metode handler yang diekspor, dipisahkan oleh titik. Default untuk fungsi yang dibuat di konsol dan untuk contoh dalam panduan ini adalah`index.handler`. Ini menunjukkan `handler` metode yang diekspor dari `index.mjs` file `index.js` atau.

Jika Anda membuat fungsi di konsol menggunakan nama file atau nama pengendali fungsi yang berbeda, Anda harus mengedit nama handler default.

**Untuk mengubah nama fungsi handler (konsol)**

1. Buka halaman [Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda dan pilih fungsi Anda.

1. Pilih tab **Kode**.

1. **Gulir ke bawah ke panel **pengaturan Runtime** dan pilih Edit.**

1. Di **Handler**, masukkan nama baru untuk handler fungsi Anda.

1. Pilih **Simpan**.

## Mendefinisikan dan mengakses objek peristiwa masukan
<a name="nodejs-example-input"></a>

JSON adalah format input yang paling umum dan standar untuk fungsi Lambda. Dalam contoh ini, fungsi mengharapkan input yang mirip dengan yang berikut:

```
{
    "order_id": "12345",
    "amount": 199.99,
    "item": "Wireless Headphones"
}
```

Saat bekerja dengan fungsi Lambda di Node.js, Anda dapat menentukan bentuk yang diharapkan dari peristiwa input menggunakan JSDoc anotasi. Dalam contoh ini, kita mendefinisikan struktur input dalam JSDoc komentar handler:

```
/**
 * Lambda handler for processing orders and storing receipts in S3.
 * @param {Object} event - Input event containing order details
 * @param {string} event.order_id - The unique identifier for the order
 * @param {number} event.amount - The order amount
 * @param {string} event.item - The item purchased
 * @returns {Promise<string>} Success message
 */
```

Setelah Anda menentukan jenis ini di JSDoc komentar Anda, Anda dapat mengakses bidang objek acara langsung dalam kode Anda. Misalnya, `event.order_id` mengambil nilai dari `order_id` dari input asli.

## Pola handler yang valid untuk fungsi Node.js
<a name="nodejs-handler-signatures"></a>

[Kami menyarankan Anda menggunakan [async/await](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/using-async-await.html) untuk mendeklarasikan fungsi handler alih-alih menggunakan callback.](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/using-a-callback-function.html) Async/await adalah cara ringkas dan mudah dibaca untuk menulis kode asinkron, tanpa perlu panggilan balik bersarang atau janji rantai. Dengan async/await, Anda dapat menulis kode yang berbunyi seperti kode sinkron, sambil tetap asinkron dan tidak memblokir.

### penangan fungsi async (disarankan)
<a name="nodejs-handler-async"></a>

`async`Kata kunci menandai fungsi sebagai asinkron, dan `await` kata kunci menjeda eksekusi fungsi sampai a diselesaikan. `Promise` Handler menerima argumen berikut:
+ `event`: Berisi data input yang diteruskan ke fungsi Anda.
+ `context`: Berisi informasi tentang pemanggilan, fungsi, dan lingkungan eksekusi. Untuk informasi selengkapnya, lihat [Menggunakan objek konteks Lambda untuk mengambil informasi fungsi Node.js](nodejs-context.md).

Berikut adalah tanda tangan yang valid untuk pola tersebut async/await :

```
export const handler = async (event) => { };
```

```
export const handler = async (event, context) => { };
```

### Penangan fungsi sinkron
<a name="nodejs-handler-synchronous"></a>

Jika fungsi Anda tidak melakukan tugas asinkron, Anda dapat menggunakan penangan fungsi sinkron, menggunakan salah satu tanda tangan fungsi berikut:

```
export const handler = (event) => { };
```

```
export const handler = (event, context) => { };
```

### Respon penangan fungsi streaming
<a name="nodejs-handler-response-streaming"></a>

Lambda mendukung streaming respons dengan Node.js. Response streaming function handler menggunakan `awslambda.streamifyResponse()` dekorator dan mengambil 3 parameter:`event`,`responseStream`, dan. `context` Tanda tangan fungsi adalah:

```
export const handler = awslambda.streamifyResponse(async (event, responseStream, context) => { });
```

Untuk informasi selengkapnya, lihat [Streaming respons untuk fungsi Lambda](configuration-response-streaming.md).

### Penangan fungsi berbasis panggilan balik
<a name="nodejs-handler-callback"></a>

**catatan**  
Penangan fungsi berbasis callback hanya didukung hingga Node.js 22. Mulai dari Node.js 24, tugas asinkron harus diimplementasikan menggunakan penangan fungsi asinkron.

Penangan fungsi berbasis callback harus menggunakan argumen event, konteks, dan callback. Contoh:

```
export const handler = (event, context, callback) => { };
```

Fungsi callback mengharapkan `Error` dan respons, yang harus JSON-serializable. Fungsi terus mengeksekusi sampai [loop peristiwa](https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/) kosong atau fungsi habis waktu. Respons tidak dikirimkan ke invoker hingga semua tugas loop peristiwa selesai. Jika waktu fungsi habis, kesalahan akan dikembalikan. Anda dapat mengonfigurasi runtime untuk mengirim respons segera dengan menyetel [konteks. callbackWaitsForEmptyEventLoop](nodejs-context.md)untuk palsu.

**Example — Permintaan HTTP dengan callback**  
Fungsi contoh berikut memeriksa URL dan mengembalikan kode status kepada invoker.  

```
import https from "https";
let url = "https://aws.amazon.com/";

export const handler = (event, context, callback) => {
  https.get(url, (res) => {
    callback(null, res.statusCode);
  }).on("error", (e) => {
    callback(Error(e));
  });
};
```

## Menggunakan SDK untuk JavaScript v3 di handler Anda
<a name="nodejs-example-sdk-usage"></a>

Seringkali, Anda akan menggunakan fungsi Lambda untuk berinteraksi dengan atau membuat pembaruan ke sumber daya lain AWS . Cara termudah untuk berinteraksi dengan sumber daya ini adalah dengan menggunakan file AWS SDK untuk JavaScript. Semua [runtime Lambda Node.js yang didukung](lambda-nodejs.md#nodejs-supported-runtimes) menyertakan [SDK](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/introduction/) untuk versi 3. JavaScript Namun, kami sangat menyarankan agar Anda menyertakan klien AWS SDK yang Anda butuhkan dalam paket penerapan Anda. Ini memaksimalkan [kompatibilitas mundur selama pembaruan runtime](runtimes-update.md#runtime-update-compatibility) Lambda di masa mendatang. Hanya mengandalkan SDK yang disediakan runtime jika Anda tidak dapat menyertakan paket tambahan (misalnya, saat menggunakan editor kode konsol Lambda atau kode sebaris dalam templat). AWS CloudFormation 

Untuk menambahkan dependensi SDK ke fungsi Anda, gunakan `npm install` perintah untuk klien SDK tertentu yang Anda butuhkan. Dalam kode contoh, kami menggunakan klien [Amazon S3](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/s3/). Tambahkan dependensi ini dengan menjalankan perintah berikut di direktori yang berisi `package.json` file Anda:

```
npm install @aws-sdk/client-s3
```

Dalam kode fungsi, impor klien dan perintah yang Anda butuhkan, seperti yang ditunjukkan oleh fungsi contoh:

```
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
```

Kemudian, inisialisasi klien [Amazon S3](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/s3/):

```
const s3Client = new S3Client();
```

Dalam contoh ini, kami menginisialisasi klien Amazon S3 kami di luar fungsi pengendali utama untuk menghindari keharusan menginisialisasi setiap kali kami menjalankan fungsi kami. Setelah menginisialisasi klien SDK, Anda dapat menggunakannya untuk melakukan panggilan API untuk layanan tersebut AWS . Kode contoh memanggil tindakan [PutObject](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/s3/command/PutObjectCommand/)API Amazon S3 sebagai berikut:

```
const command = new PutObjectCommand({
    Bucket: bucketName,
    Key: key,
    Body: receiptContent
});
```

## Mengakses variabel lingkungan
<a name="nodejs-example-envvars"></a>

Dalam kode handler Anda, Anda dapat mereferensikan [variabel lingkungan](configuration-envvars.md) apa pun dengan menggunakan`process.env`. Dalam contoh ini, kami mereferensikan variabel `RECEIPT_BUCKET` lingkungan yang ditentukan menggunakan baris kode berikut:

```
// Access environment variables
const bucketName = process.env.RECEIPT_BUCKET;
if (!bucketName) {
    throw new Error('RECEIPT_BUCKET environment variable is not set');
}
```

## Menggunakan status global
<a name="nodejs-handler-state"></a>

Lambda menjalankan kode statis Anda selama [fase inisialisasi](lambda-runtime-environment.md#runtimes-lifecycle-ib) sebelum menjalankan fungsi Anda untuk pertama kalinya. Sumber daya yang dibuat selama inisialisasi tetap berada di memori di antara pemanggilan, sehingga Anda dapat menghindari keharusan membuatnya setiap kali Anda menjalankan fungsi Anda.

Dalam kode contoh, kode inisialisasi klien S3 berada di luar handler. Runtime menginisialisasi klien sebelum fungsi menangani peristiwa pertamanya, dan klien tetap tersedia untuk digunakan kembali di semua pemanggilan.

## Praktik terbaik kode untuk fungsi Lambda Node.js
<a name="nodejs-best-practices"></a>

Ikuti panduan ini saat membangun fungsi Lambda:
+ **Pisahkan handler Lambda dari logika inti Anda.** Ini memungkinkan Anda untuk membuat fungsi yang lebih dapat teruji.
+ **Kontrol dependensi dalam paket penerapan fungsi Anda.** Lingkungan AWS Lambda eksekusi berisi sejumlah pustaka. Untuk runtime Node.js dan Python, ini termasuk file. AWS SDKs Untuk mengaktifkan serangkaian fitur dan pembaruan keamanan terbaru, Lambda akan memperbarui pustaka ini secara berkala. Pembaruan ini dapat memberikan perubahan kecil pada perilaku fungsi Lambda Anda. Untuk memiliki kendali penuh atas dependensi yang digunakan fungsi Anda, kemas semua dependensi Anda dengan paket deployment Anda. 
+ **Minimalkan kompleksitas dependensi Anda.** Utamakan memilih kerangka kerja lebih sederhana yang cepat dimuat dalam memulai [lingkungan eksekusi](lambda-runtime-environment.md).
+ **Minimalkan ukuran paket penerapan Anda sesuai kebutuhan runtime-nya.** Ini akan mengurangi jumlah waktu yang dibutuhkan untuk mengunduh dan membongkar paket deployment Anda sebelum invokasi.

**Manfaatkan penggunaan kembali lingkungan eksekusi untuk meningkatkan kinerja fungsi Anda.** Inisialisasi klien SDK dan koneksi basis data di luar fungsi handler, dan lakukan caching aset statis secara lokal di direktori `/tmp`. Invokasi selanjutnya yang diproses oleh instans yang sama dari fungsi Anda dapat menggunakan kembali sumber daya ini. Ini menghemat biaya dengan mengurangi waktu pengoperasian fungsi.

Untuk menghindari potensi kebocoran data di seluruh invokasi, jangan menggunakan lingkungan eksekusi untuk menyimpan data pengguna, peristiwa, atau informasi lainnya implikasi keamanan. Jika fungsi Anda bergantung pada status yang dapat disenyapkan yang tidak dapat disimpan dalam memori di dalam handler, pertimbangkan untuk membuat fungsi terpisah atau versi terpisah dari fungsi untuk setiap pengguna.

**Gunakan arahan keep-alive untuk mempertahankan koneksi yang persisten.** Lambda membersihkan koneksi idle dari waktu ke waktu. Mencoba menggunakan ulang koneksi idle saat mengidentifikasi suatu fungsi akan menyebabkan kesalahan koneksi. Untuk mempertahankan koneksi yang persisten, gunakan arahan tetap aktif yang berkaitan dengan runtime Anda. Sebagai contoh, lihat [Menggunakan Kembali Koneksi dengan Keep-Alive di Node.js](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-reusing-connections.html).

**Gunakan [variabel lingkungan](configuration-envvars.md) untuk meneruskan parameter operasional ke fungsi Anda.** Misalnya, jika Anda ingin menulis ke bucket Amazon S3 alih-alih melakukan hard-coding nama bucket yang Anda tulis, konfigurasikan nama bucket sebagai variabel lingkungan.

**Hindari menggunakan pemanggilan rekursif** dalam fungsi Lambda Anda, di mana fungsi memanggil dirinya sendiri atau memulai proses yang dapat memanggil fungsi lagi. Hal ini dapat menyebabkan volume invokasi fungsi yang tidak diinginkan dan peningkatan biaya. Jika Anda melihat volume pemanggilan yang tidak diinginkan, setel konkurensi fungsi cadangan untuk `0` segera membatasi semua pemanggilan ke fungsi, saat Anda memperbarui kode.

**Jangan gunakan non-dokumen, non-publik APIs** dalam kode fungsi Lambda Anda. Untuk runtime AWS Lambda terkelola, Lambda secara berkala menerapkan pembaruan keamanan dan fungsional ke internal Lambda. APIs Pembaruan API internal ini mungkin tidak kompatibel ke belakang, yang menyebabkan konsekuensi yang tidak diinginkan seperti kegagalan pemanggilan jika fungsi Anda memiliki ketergantungan pada non-publik ini. APIs Lihat [referensi API](https://docs.aws.amazon.com/lambda/latest/api/welcome.html) untuk daftar yang tersedia APIs untuk umum.

**Tulis kode idempoten.** Menulis kode idempoten untuk fungsi Anda memastikan bahwa peristiwa duplikat ditangani dengan cara yang sama. Kode Anda harus memvalidasi peristiwa dengan benar dan menangani peristiwa duplikat dengan anggun. Untuk informasi selengkapnya, lihat [Bagaimana cara membuat fungsi Lambda saya idempoten?](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-idempotent/) .

# Deploy fungsi Lambda Node.js dengan arsip file .zip
<a name="nodejs-package"></a>

 Kode AWS Lambda fungsi Anda terdiri dari file.js atau .mjs yang berisi kode handler fungsi Anda, bersama dengan paket dan modul tambahan yang bergantung pada kode Anda. *Untuk menyebarkan kode fungsi ini ke Lambda, Anda menggunakan paket penerapan.* Paket ini dapat berupa arsip file.zip atau gambar kontainer. Untuk informasi selengkapnya tentang penggunaan gambar kontainer dengan Node.js, lihat [Menerapkan fungsi Lambda Node.js dengan](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-image.html) gambar kontainer. 

 [Untuk membuat paket penyebaran Anda sebagai arsip file.zip, Anda dapat menggunakan utilitas arsip file.zip bawaan alat baris perintah Anda, atau utilitas file.zip lainnya seperti 7zip.](https://www.7-zip.org/download.html) Contoh yang ditampilkan di bagian berikut mengasumsikan Anda menggunakan `zip` alat baris perintah di lingkungan Linux atau macOS. Untuk menggunakan perintah yang sama di Windows, Anda dapat [menginstal Windows Subsystem untuk Linux untuk](https://docs.microsoft.com/en-us/windows/wsl/install-win10) mendapatkan versi Windows terintegrasi dari Ubuntu dan Bash. 

 Perhatikan bahwa Lambda menggunakan izin file POSIX, jadi Anda mungkin perlu [mengatur izin untuk folder paket penyebaran](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-deployment-package-errors/) sebelum membuat arsip file.zip. 

**Topics**
+ [

## Dependensi runtime di Node.js
](#nodejs-package-dependencies)
+ [

## Membuat paket penerapan.zip tanpa dependensi
](#nodejs-package-create-no-dependencies)
+ [

## Membuat paket penerapan.zip dengan dependensi
](#nodejs-package-create-dependencies)
+ [

## Membuat layer Node.js untuk dependensi Anda
](#nodejs-package-dependencies-layers)
+ [

## Jalur pencarian ketergantungan dan pustaka yang disertakan runtime
](#nodejs-package-searchpath)
+ [

## Membuat dan memperbarui fungsi Lambda Node.js menggunakan file.zip
](#nodejs-package-create-update)

## Dependensi runtime di Node.js
<a name="nodejs-package-dependencies"></a>

 Untuk fungsi Lambda yang menggunakan runtime Node.js, dependensi dapat berupa modul Node.js apa pun. Runtime Node.js mencakup sejumlah pustaka umum, serta versi. AWS SDK untuk JavaScript Semua [runtime Node.js yang didukung](lambda-nodejs.md#nodejs-supported-runtimes) menyertakan SDK versi 3. Untuk menggunakan SDK versi 2, Anda harus menambahkan SDK ke paket penyebaran file.zip Anda. Untuk menemukan versi spesifik SDK yang disertakan dalam runtime yang Anda gunakan, lihat. [Versi SDK yang disertakan Runtime](lambda-nodejs.md#nodejs-sdk-included) 

 Lambda memperbarui pustaka SDK secara berkala di runtime Node.js untuk menyertakan fitur terbaru dan peningkatan keamanan. Lambda juga menerapkan patch keamanan dan pembaruan ke pustaka lain yang termasuk dalam runtime. Untuk memiliki kontrol penuh atas dependensi dalam paket Anda, Anda dapat menambahkan versi pilihan Anda dari setiap dependensi yang disertakan runtime ke paket penerapan Anda. Misalnya, jika Anda ingin menggunakan versi SDK tertentu JavaScript, Anda dapat memasukkannya ke dalam file.zip sebagai dependensi. Untuk informasi selengkapnya tentang menambahkan dependensi yang disertakan runtime ke file.zip Anda, lihat. [Jalur pencarian ketergantungan dan pustaka yang disertakan runtime](#nodejs-package-searchpath) 

 Di bawah [model tanggung jawab AWS bersama](lambda-runtimes.md#runtimes-shared-responsibility), Anda bertanggung jawab atas pengelolaan dependensi apa pun dalam paket penerapan fungsi Anda. Ini termasuk menerapkan pembaruan dan patch keamanan. Untuk memperbarui dependensi dalam paket penerapan fungsi Anda, pertama buat file.zip baru dan kemudian unggah ke Lambda. Lihat [Membuat paket penerapan.zip dengan dependensi](#nodejs-package-create-dependencies) dan [Membuat dan memperbarui fungsi Lambda Node.js menggunakan file.zip](#nodejs-package-create-update) untuk informasi lebih lanjut. 

## Membuat paket penerapan.zip tanpa dependensi
<a name="nodejs-package-create-no-dependencies"></a>

 Jika kode fungsi Anda tidak memiliki dependensi kecuali pustaka yang disertakan dalam runtime Lambda, file.zip Anda hanya berisi `index.mjs` file `index.js` atau dengan kode handler fungsi Anda. Gunakan utilitas zip pilihan Anda untuk membuat file.zip dengan `index.mjs` file `index.js` atau Anda di root. Jika file yang berisi kode handler Anda tidak berada di root file.zip Anda, Lambda tidak akan dapat menjalankan kode Anda. 

 Untuk mempelajari cara menerapkan file.zip Anda untuk membuat fungsi Lambda baru atau memperbarui yang sudah ada, lihat. [Membuat dan memperbarui fungsi Lambda Node.js menggunakan file.zip](#nodejs-package-create-update) 

## Membuat paket penerapan.zip dengan dependensi
<a name="nodejs-package-create-dependencies"></a>

[Jika kode fungsi Anda bergantung pada paket atau modul yang tidak disertakan dalam runtime Lambda Node.js, Anda dapat menambahkan dependensi ini ke file.zip dengan kode fungsi Anda atau menggunakan lapisan Lambda.](chapter-layers.md) Petunjuk di bagian ini menunjukkan cara memasukkan dependensi Anda ke dalam paket penerapan.zip Anda. Untuk petunjuk tentang cara memasukkan dependensi Anda dalam lapisan, lihat. [Membuat layer Node.js untuk dependensi Anda](#nodejs-package-dependencies-layers)

Contoh perintah CLI berikut membuat file.zip bernama `my_deployment_package.zip` berisi `index.mjs` file `index.js` or dengan kode handler fungsi Anda dan dependensinya. Dalam contoh, Anda menginstal dependensi menggunakan manajer paket npm.

**Untuk membuat paket deployment**

1. Arahkan ke direktori proyek yang berisi file kode `index.mjs` sumber `index.js` atau Anda. Dalam contoh ini, direktori diberi nama`my_function`.

   ```
   cd my_function
   ```

1. Instal pustaka yang diperlukan fungsi Anda di `node_modules` direktori menggunakan `npm install` perintah. Dalam contoh ini Anda menginstal file AWS X-Ray SDK for Node.js.

   ```
   npm install aws-xray-sdk
   ```

   Ini menciptakan struktur folder yang mirip dengan berikut ini:

   ```
   ~/my_function
   ├── index.mjs
   └── node_modules
       ├── async
       ├── async-listener
       ├── atomic-batcher
       ├── aws-sdk
       ├── aws-xray-sdk
       ├── aws-xray-sdk-core
   ```

   Anda juga dapat menambahkan modul khusus yang Anda buat sendiri ke paket penyebaran Anda. Buat direktori di bawah `node_modules` dengan nama modul Anda dan simpan paket tertulis kustom Anda di sana.

1. Buat file.zip yang berisi isi folder proyek Anda di root. Gunakan opsi `r` (rekursif) untuk memastikan zip mengompresi subfolder.

   ```
   zip -r my_deployment_package.zip .
   ```

## Membuat layer Node.js untuk dependensi Anda
<a name="nodejs-package-dependencies-layers"></a>

Instruksi di bagian ini menunjukkan kepada Anda bagaimana memasukkan dependensi Anda dalam lapisan. Untuk petunjuk tentang cara menyertakan dependensi Anda dalam paket penerapan Anda, lihat. [Membuat paket penerapan.zip dengan dependensi](#nodejs-package-create-dependencies)

Saat Anda menambahkan lapisan ke fungsi, Lambda memuat konten lapisan ke dalam `/opt` direktori lingkungan eksekusi itu. Untuk setiap runtime Lambda, `PATH` variabel sudah menyertakan jalur folder tertentu dalam direktori. `/opt` Untuk memastikan bahwa Lambda mengambil konten layer Anda, file layer.zip Anda harus memiliki dependensinya di salah satu jalur folder berikut:
+ `nodejs/node_modules`
+ `nodejs/node18/node_modules (NODE_PATH)`
+ `nodejs/node20/node_modules (NODE_PATH)`
+ `nodejs/node22/node_modules (NODE_PATH)`

Misalnya, struktur file layer.zip Anda mungkin terlihat seperti berikut:

```
xray-sdk.zip
└ nodejs/node_modules/aws-xray-sdk
```

Selain itu, Lambda secara otomatis mendeteksi pustaka apa pun di `/opt/lib` direktori, dan binari apa pun di direktori. `/opt/bin` Untuk memastikan bahwa Lambda menemukan konten layer Anda dengan benar, Anda juga dapat membuat layer dengan struktur berikut:

```
custom-layer.zip
└ lib
    | lib_1
    | lib_2
└ bin
    | bin_1
    | bin_2
```

Setelah Anda mengemas layer Anda, lihat [Membuat dan menghapus layer di Lambda](creating-deleting-layers.md) dan [Menambahkan lapisan ke fungsi](adding-layers.md) untuk menyelesaikan setup layer Anda.

## Jalur pencarian ketergantungan dan pustaka yang disertakan runtime
<a name="nodejs-package-searchpath"></a>

Runtime Node.js mencakup sejumlah pustaka umum, serta versi. AWS SDK untuk JavaScript Jika Anda ingin menggunakan versi yang berbeda dari pustaka yang disertakan runtime, Anda dapat melakukannya dengan menggabungkannya dengan fungsi Anda atau dengan menambahkannya sebagai dependensi dalam paket penerapan Anda. Misalnya, Anda dapat menggunakan versi SDK yang berbeda dengan menambahkannya ke paket deployment .zip Anda. Anda juga dapat memasukkannya ke dalam [lapisan Lambda untuk fungsi](chapter-layers.md) Anda.

Saat Anda menggunakan `require` pernyataan `import` atau dalam kode Anda, runtime Node.js mencari direktori di `NODE_PATH` jalur hingga menemukan modul. Secara default, lokasi pertama pencarian runtime adalah direktori tempat paket deployment .zip Anda didekompresi dan dipasang (). `/var/task` Jika Anda menyertakan versi pustaka yang disertakan runtime dalam paket penerapan, versi ini akan lebih diutamakan daripada versi yang disertakan dalam runtime. Dependensi dalam paket penerapan Anda juga lebih diutamakan daripada dependensi dalam lapisan.

Saat Anda menambahkan dependensi ke lapisan, Lambda mengekstrak ini `/opt/nodejs/nodexx/node_modules` ke `nodexx` mana mewakili versi runtime yang Anda gunakan. Di jalur pencarian, direktori ini lebih diutamakan daripada direktori yang berisi pustaka yang disertakan runtime (). `/var/lang/lib/node_modules` Oleh karena itu, pustaka di lapisan fungsi lebih diutamakan daripada versi yang disertakan dalam runtime.

Anda dapat melihat jalur pencarian lengkap untuk fungsi Lambda Anda dengan menambahkan baris kode berikut.

```
console.log(process.env.NODE_PATH)
```

Anda juga dapat menambahkan dependensi di folder terpisah di dalam paket.zip Anda. Misalnya, Anda dapat menambahkan modul kustom ke folder dalam paket.zip Anda yang dipanggil`common`. Ketika paket.zip Anda didekompresi dan dipasang, folder ini ditempatkan di dalam direktori. `/var/task` Untuk menggunakan dependensi dari folder dalam paket penyebaran .zip Anda dalam kode Anda, gunakan `const { } = require()` pernyataan `import { } from` atau, tergantung pada apakah Anda menggunakan resolusi modul CJS atau ESM. Contoh:

```
import { myModule } from './common'
```

Jika Anda menggabungkan kode Anda dengan`esbuild`,`rollup`, atau serupa, dependensi yang digunakan oleh fungsi Anda dibundel bersama dalam satu atau beberapa file. Kami merekomendasikan menggunakan metode ini untuk menjual dependensi bila memungkinkan. Dibandingkan dengan menambahkan dependensi ke paket penerapan Anda, bundling kode Anda menghasilkan peningkatan kinerja karena pengurangan operasi. I/O 

## Membuat dan memperbarui fungsi Lambda Node.js menggunakan file.zip
<a name="nodejs-package-create-update"></a>

 Setelah Anda membuat paket.zip deployment, Anda dapat menggunakannya untuk membuat fungsi Lambda baru atau memperbarui yang sudah ada. Anda dapat menerapkan paket.zip Anda menggunakan konsol Lambda, API, AWS Command Line Interface dan Lambda. Anda juga dapat membuat dan memperbarui fungsi Lambda menggunakan AWS Serverless Application Model (AWS SAM) dan. CloudFormation

Ukuran maksimum untuk paket.zip deployment untuk Lambda adalah 250 MB (unzip). Perhatikan bahwa batas ini berlaku untuk ukuran gabungan semua file yang Anda unggah, termasuk lapisan Lambda apa pun.

Runtime Lambda membutuhkan izin untuk membaca file dalam paket deployment Anda. Dalam notasi oktal izin Linux, Lambda membutuhkan 644 izin untuk file yang tidak dapat dieksekusi (rw-r - r--) dan 755 izin () untuk direktori dan file yang dapat dieksekusi. rwxr-xr-x

Di Linux dan macOS, gunakan `chmod` perintah untuk mengubah izin file pada file dan direktori dalam paket penyebaran Anda. Misalnya, untuk memberikan file yang tidak dapat dieksekusi izin yang benar, jalankan perintah berikut.

```
chmod 644 <filepath>
```

Untuk mengubah izin file di Windows, lihat [Mengatur, Melihat, Mengubah, atau Menghapus Izin pada Objek](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc731667(v=ws.10)) dalam dokumentasi Microsoft Windows.

**catatan**  
Jika Anda tidak memberikan Lambda izin yang diperlukan untuk mengakses direktori dalam paket penerapan Anda, Lambda menetapkan izin untuk direktori tersebut ke 755 (). rwxr-xr-x

### Membuat dan memperbarui fungsi dengan file.zip menggunakan konsol
<a name="nodejs-package-create-console"></a>

 Untuk membuat fungsi baru, Anda harus terlebih dahulu membuat fungsi di konsol, lalu mengunggah arsip.zip Anda. Untuk memperbarui fungsi yang ada, buka halaman untuk fungsi Anda, lalu ikuti prosedur yang sama untuk menambahkan file.zip Anda yang diperbarui. 

 Jika file.zip Anda kurang dari 50MB, Anda dapat membuat atau memperbarui fungsi dengan mengunggah file langsung dari mesin lokal Anda. Untuk file.zip yang lebih besar dari 50MB, Anda harus mengunggah paket Anda ke bucket Amazon S3 terlebih dahulu. Untuk petunjuk tentang cara mengunggah file ke bucket Amazon S3 menggunakan Konsol Manajemen AWS, lihat [Memulai Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html). Untuk mengunggah file menggunakan AWS CLI, lihat [Memindahkan objek](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move) di *Panduan AWS CLI Pengguna*. 

**catatan**  
Anda tidak dapat mengubah [jenis paket penerapan](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-PackageType) (.zip atau image kontainer) untuk fungsi yang ada. Misalnya, Anda tidak dapat mengonversi fungsi gambar kontainer untuk menggunakan arsip file.zip. Anda harus membuat fungsi baru.

**Untuk membuat fungsi baru (konsol)**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) konsol Lambda dan pilih **Buat** Fungsi.

1. Pilih **Tulis dari awal**.

1. Di bagian **Informasi dasar**, lakukan hal berikut:

   1. Untuk **nama Fungsi**, masukkan nama untuk fungsi Anda.

   1. Untuk **Runtime**, pilih runtime yang ingin Anda gunakan.

   1. (Opsional) Untuk **Arsitektur**, pilih arsitektur set instruksi untuk fungsi Anda. Arsitektur default adalah x86\$164. Pastikan bahwa paket deployment .zip untuk fungsi Anda kompatibel dengan arsitektur set instruksi yang Anda pilih.

1. (Opsional) Di bagian **Izin**, luaskan **Ubah peran eksekusi default**. Anda dapat membuat **peran Eksekusi** baru atau menggunakan yang sudah ada.

1. Pilih **Buat fungsi**. Lambda menciptakan fungsi dasar 'Hello world' menggunakan runtime yang Anda pilih.

**Untuk mengunggah arsip.zip dari mesin lokal Anda (konsol)**

1. Di [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) konsol Lambda, pilih fungsi yang ingin Anda unggah file.zip.

1. Pilih tab **Kode**.

1. Di panel **Sumber kode**, pilih **Unggah dari**.

1. Pilih **file.zip**.

1. Untuk mengunggah file.zip, lakukan hal berikut:

   1. Pilih **Unggah**, lalu pilih file.zip Anda di pemilih file.

   1. Pilih **Buka**.

   1. Pilih **Simpan**.

**Untuk mengunggah arsip.zip dari bucket Amazon S3 (konsol)**

1. Di [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) konsol Lambda, pilih fungsi yang ingin Anda unggah file.zip baru.

1. Pilih tab **Kode**.

1. Di panel **Sumber kode**, pilih **Unggah dari**.

1. Pilih **lokasi Amazon S3**.

1. **Rekatkan URL tautan Amazon S3 dari file.zip Anda dan pilih Simpan.**

### Memperbarui fungsi file.zip menggunakan editor kode konsol
<a name="nodejs-package-console-edit"></a>

 Untuk beberapa fungsi dengan paket penyebaran.zip, Anda dapat menggunakan editor kode bawaan konsol Lambda untuk memperbarui kode fungsi Anda secara langsung. Untuk menggunakan fitur ini, fungsi Anda harus memenuhi kriteria berikut: 
+ Fungsi Anda harus menggunakan salah satu runtime bahasa yang ditafsirkan (Python, Node.js, atau Ruby)
+ Paket penerapan fungsi Anda harus lebih kecil dari 50 MB (unzip).

Kode fungsi untuk fungsi dengan paket penerapan gambar kontainer tidak dapat diedit langsung di konsol.

**Untuk memperbarui kode fungsi menggunakan editor kode konsol**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) konsol Lambda dan pilih fungsi Anda.

1. Pilih tab **Kode**.

1. Di panel **Sumber kode**, pilih file kode sumber Anda dan edit di editor kode terintegrasi.

1. Di bagian **DEPLOY**, pilih **Deploy** untuk memperbarui kode fungsi Anda:  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

### Membuat dan memperbarui fungsi dengan file.zip menggunakan file AWS CLI
<a name="nodejs-package-create-cli"></a>

 Anda dapat menggunakan [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)untuk membuat fungsi baru atau memperbarui yang sudah ada menggunakan file.zip. Gunakan [create-function](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html) dan [update-function-code](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html)perintah untuk menyebarkan paket.zip Anda. Jika file.zip Anda lebih kecil dari 50MB, Anda dapat mengunggah paket.zip dari lokasi file di mesin build lokal Anda. Untuk file yang lebih besar, Anda harus mengunggah paket.zip Anda dari bucket Amazon S3. Untuk petunjuk tentang cara mengunggah file ke bucket Amazon S3 menggunakan AWS CLI, lihat [Memindahkan objek](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move) di *AWS CLI Panduan Pengguna*. 

**catatan**  
Jika Anda mengunggah file.zip dari bucket Amazon S3 menggunakan AWS CLI, bucket harus berada di lokasi yang Wilayah AWS sama dengan fungsi Anda.

 Untuk membuat fungsi baru menggunakan file.zip dengan AWS CLI, Anda harus menentukan yang berikut: 
+ Nama fungsi Anda (`--function-name`)
+ Runtime () `--runtime` fungsi Anda
+ Nama Sumber Daya Amazon (ARN) dari [peran eksekusi](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) fungsi Anda () `--role`
+ Nama metode handler dalam kode fungsi Anda () `--handler`

 Anda juga harus menentukan lokasi file.zip Anda. Jika file.zip Anda terletak di folder di mesin build lokal Anda, gunakan `--zip-file` opsi untuk menentukan jalur file, seperti yang ditunjukkan pada perintah contoh berikut. 

```
aws lambda create-function --function-name myFunction \
--runtime nodejs24.x --handler index.handler \
--role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
--zip-file fileb://myFunction.zip
```

 Untuk menentukan lokasi file.zip di bucket Amazon S3, gunakan opsi seperti `--code` yang ditunjukkan pada perintah contoh berikut. Anda hanya perlu menggunakan `S3ObjectVersion` parameter untuk objek berversi. 

```
aws lambda create-function --function-name myFunction \
--runtime nodejs24.x --handler index.handler \
--role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
--code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion
```

 Untuk memperbarui fungsi yang ada menggunakan CLI, Anda menentukan nama fungsi Anda menggunakan parameter. `--function-name` Anda juga harus menentukan lokasi file.zip yang ingin Anda gunakan untuk memperbarui kode fungsi Anda. Jika file.zip Anda terletak di folder di mesin build lokal Anda, gunakan `--zip-file` opsi untuk menentukan jalur file, seperti yang ditunjukkan pada perintah contoh berikut. 

```
aws lambda update-function-code --function-name myFunction \
--zip-file fileb://myFunction.zip
```

 Untuk menentukan lokasi file.zip di bucket Amazon S3, gunakan opsi `--s3-key` dan seperti `--s3-bucket` yang ditunjukkan pada perintah contoh berikut. Anda hanya perlu menggunakan `--s3-object-version` parameter untuk objek berversi. 

```
aws lambda update-function-code --function-name myFunction \
--s3-bucket amzn-s3-demo-bucket --s3-key myFileName.zip --s3-object-version myObject Version
```

### Membuat dan memperbarui fungsi dengan file.zip menggunakan API Lambda
<a name="nodejs-package-create-api"></a>

 Untuk membuat dan memperbarui fungsi menggunakan arsip file.zip, gunakan operasi API berikut: 
+ [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html)
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)

### Membuat dan memperbarui fungsi dengan file.zip menggunakan AWS SAM
<a name="nodejs-package-create-sam"></a>

 The AWS Serverless Application Model (AWS SAM) adalah toolkit yang membantu merampingkan proses membangun dan menjalankan aplikasi tanpa server. AWS Anda menentukan sumber daya untuk aplikasi Anda dalam template YAMB atau JSON dan menggunakan antarmuka baris AWS SAM perintah (AWS SAM CLI) untuk membangun, mengemas, dan menyebarkan aplikasi Anda. Saat Anda membuat fungsi Lambda dari AWS SAM template, AWS SAM secara otomatis membuat paket penerapan .zip atau gambar kontainer dengan kode fungsi Anda dan dependensi apa pun yang Anda tentukan. Untuk mempelajari lebih lanjut cara menggunakan AWS SAM untuk membangun dan menerapkan fungsi Lambda, [lihat Memulai](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started.html) di Panduan AWS SAM*AWS Serverless Application Model Pengembang*.

Anda juga dapat menggunakan AWS SAM untuk membuat fungsi Lambda menggunakan arsip file.zip yang ada. Untuk membuat fungsi Lambda menggunakan AWS SAM, Anda dapat menyimpan file.zip di bucket Amazon S3 atau di folder lokal di mesin build Anda. Untuk petunjuk tentang cara mengunggah file ke bucket Amazon S3 menggunakan AWS CLI, lihat [Memindahkan objek](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move) di *AWS CLI Panduan Pengguna*. 

 Dalam AWS SAM template Anda, `AWS::Serverless::Function` sumber daya menentukan fungsi Lambda Anda. Dalam sumber daya ini, atur properti berikut untuk membuat fungsi menggunakan arsip file.zip: 
+ `PackageType`- diatur ke `Zip`
+ `CodeUri`- diatur ke kode fungsi Amazon S3 URI, jalur ke folder lokal, atau objek [FunctionCode](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-functioncode.html)
+ `Runtime`- Setel ke runtime yang Anda pilih

 Dengan AWS SAM, jika file.zip Anda lebih besar dari 50MB, Anda tidak perlu mengunggahnya ke bucket Amazon S3 terlebih dahulu. AWS SAM dapat mengunggah paket.zip hingga ukuran maksimum yang diizinkan 250MB (unzip) dari lokasi di mesin build lokal Anda. 

 Untuk mempelajari selengkapnya tentang penerapan fungsi menggunakan file.zip AWS SAM, lihat [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)di Panduan *AWS SAM Pengembang*. 

### Membuat dan memperbarui fungsi dengan file.zip menggunakan CloudFormation
<a name="nodejs-package-create-cfn"></a>

 Anda dapat menggunakan CloudFormation untuk membuat fungsi Lambda menggunakan arsip file.zip. Untuk membuat fungsi Lambda dari file.zip, Anda harus terlebih dahulu mengunggah file Anda ke bucket Amazon S3. Untuk petunjuk tentang cara mengunggah file ke bucket Amazon S3 menggunakan AWS CLI, lihat [Memindahkan objek](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move) di *AWS CLI Panduan Pengguna*.

Dalam CloudFormation template Anda, `AWS::Lambda::Function` sumber daya menentukan fungsi Lambda Anda. Dalam sumber daya ini, atur properti berikut untuk membuat fungsi menggunakan arsip file.zip:
+ `PackageType`- Setel ke `Zip`
+ `Code`- Masukkan nama bucket Amazon S3 dan nama file.zip di dan bidang `S3Bucket` `S3Key`
+ `Runtime`- Setel ke runtime yang Anda pilih

 File.zip yang CloudFormation menghasilkan tidak boleh melebihi 4MB. Untuk mempelajari selengkapnya tentang penerapan fungsi menggunakan file.zip CloudFormation, lihat [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)di *CloudFormation Panduan Pengguna*. 

# Deploy fungsi Lambda Node.js dengan gambar kontainer
<a name="nodejs-image"></a>

Ada tiga cara untuk membangun image container untuk fungsi Lambda Node.js:
+ [Menggunakan gambar AWS dasar untuk Node.js](#nodejs-image-instructions)

  [Gambar AWS dasar](images-create.md#runtimes-images-lp) dimuat sebelumnya dengan runtime bahasa, klien antarmuka runtime untuk mengelola interaksi antara Lambda dan kode fungsi Anda, dan emulator antarmuka runtime untuk pengujian lokal.
+ [Menggunakan gambar AWS dasar khusus OS](images-create.md#runtimes-images-provided)

  [AWS Gambar dasar khusus OS](https://gallery.ecr.aws/lambda/provided) berisi distribusi Amazon Linux dan emulator antarmuka [runtime](https://github.com/aws/aws-lambda-runtime-interface-emulator/). Gambar-gambar ini biasanya digunakan untuk membuat gambar kontainer untuk bahasa yang dikompilasi, seperti [Go](go-image.md#go-image-provided) dan [Rust](lambda-rust.md), dan untuk versi bahasa atau bahasa yang Lambda tidak menyediakan gambar dasar, seperti Node.js 19. Anda juga dapat menggunakan gambar dasar khusus OS untuk mengimplementasikan runtime [kustom](runtimes-custom.md). Untuk membuat gambar kompatibel dengan Lambda, Anda harus menyertakan [klien antarmuka runtime untuk Node.js](#nodejs-image-clients) dalam gambar.
+ [Menggunakan gambar AWS non-dasar](#nodejs-image-clients)

  Anda dapat menggunakan gambar dasar alternatif dari registri kontainer lain, seperti Alpine Linux atau Debian. Anda juga dapat menggunakan gambar kustom yang dibuat oleh organisasi Anda. Untuk membuat gambar kompatibel dengan Lambda, Anda harus menyertakan [klien antarmuka runtime untuk Node.js](#nodejs-image-clients) dalam gambar.

**Tip**  
Untuk mengurangi waktu yang dibutuhkan agar fungsi kontainer Lambda menjadi aktif, lihat [Menggunakan build multi-tahap](https://docs.docker.com/build/building/multi-stage/) dalam dokumentasi Docker. Untuk membuat gambar kontainer yang efisien, ikuti [Praktik terbaik untuk menulis Dockerfiles](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/).

Halaman ini menjelaskan cara membuat, menguji, dan menyebarkan gambar kontainer untuk Lambda.

**Topics**
+ [

## AWS gambar dasar untuk Node.js
](#nodejs-image-base)
+ [

## Menggunakan gambar AWS dasar untuk Node.js
](#nodejs-image-instructions)
+ [

## Menggunakan gambar dasar alternatif dengan klien antarmuka runtime
](#nodejs-image-clients)

## AWS gambar dasar untuk Node.js
<a name="nodejs-image-base"></a>

AWS menyediakan gambar dasar berikut untuk Node.js:


| Tanda | Waktu berjalan | Sistem operasi | Dockerfile | penghentian | 
| --- | --- | --- | --- | --- | 
| 24 | Node.js 24 | Amazon Linux 2023 | [Dockerfile untuk Node.js 24 di GitHub](https://github.com/aws/aws-lambda-base-images/blob/nodejs24.x/Dockerfile.nodejs24.x) |   30 Apr 2028   | 
| 22 | Node.js 22 | Amazon Linux 2023 | [Dockerfile untuk Node.js 22 di GitHub](https://github.com/aws/aws-lambda-base-images/blob/nodejs22.x/Dockerfile.nodejs22.x) |   30 Apr 2027   | 
| 20 | Node.js 20 | Amazon Linux 2023 | [Dockerfile untuk Node.js 20 di GitHub](https://github.com/aws/aws-lambda-base-images/blob/nodejs20.x/Dockerfile.nodejs20.x) |   30 Apr 2026   | 

[Repositori Amazon ECR: gallery.ecr. aws/lambda/nodejs](https://gallery.ecr.aws/lambda/nodejs)

Gambar dasar Node.js 20 dan yang lebih baru didasarkan pada [gambar kontainer minimal Amazon Linux 2023](https://docs.aws.amazon.com/linux/al2023/ug/minimal-container.html). Gambar dasar sebelumnya menggunakan Amazon Linux 2. AL2023 memberikan beberapa keunggulan dibandingkan Amazon Linux 2, termasuk jejak penyebaran yang lebih kecil dan versi pustaka yang diperbarui seperti. `glibc`

AL2023gambar berbasis menggunakan `microdnf` (symlinked as`dnf`) sebagai manajer paket, bukan`yum`, yang merupakan manajer paket default di Amazon Linux 2. `microdnf`adalah implementasi mandiri dari. `dnf` Untuk daftar paket yang disertakan dalam gambar AL2023 berbasis, lihat kolom **Penampung Minimal** di [Membandingkan paket yang diinstal di Amazon Linux 2023 Container Images](https://docs.aws.amazon.com/linux/al2023/ug/al2023-container-image-types.html). Untuk informasi selengkapnya tentang perbedaan antara AL2023 dan Amazon Linux 2, lihat [Memperkenalkan runtime Amazon Linux 2023 untuk AWS Lambda di Blog](https://aws.amazon.com/blogs/compute/introducing-the-amazon-linux-2023-runtime-for-aws-lambda/) AWS Komputasi.

**catatan**  
Untuk menjalankan image AL2023 berbasis lokal, termasuk with AWS Serverless Application Model (AWS SAM), Anda harus menggunakan Docker versi 20.10.10 atau yang lebih baru.

## Menggunakan gambar AWS dasar untuk Node.js
<a name="nodejs-image-instructions"></a>

### Prasyarat
<a name="nodejs-image-prerequisites"></a>

Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:
+ [AWS CLI versi 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [Docker](https://docs.docker.com/get-docker) (versi minimum 25.0.0)
+ Plugin [buildx Docker](https://github.com/docker/buildx/blob/master/README.md).
+ Node.js

### Membuat gambar dari gambar dasar
<a name="nodejs-image-create"></a>

**Untuk membuat gambar kontainer dari gambar AWS dasar untuk Node.js**

1. Buat direktori untuk proyek, dan kemudian beralih ke direktori itu.

   ```
   mkdir example
   cd example
   ```

1. Buat proyek Node.js baru dengan`npm`. Untuk menerima opsi default yang disediakan dalam pengalaman interaktif, tekan`Enter`.

   ```
   npm init
   ```

1. Buat file baru bernama`index.js`. Anda dapat menambahkan kode fungsi contoh berikut ke file untuk pengujian, atau menggunakan kode Anda sendiri.  
**Example Penangan CommonJS**  

   ```
   exports.handler = async (event) => {
       const response = {
           statusCode: 200,
           body: JSON.stringify('Hello from Lambda!'),
       };
       return response;
   };
   ```

1. Jika fungsi Anda bergantung pada pustaka selain AWS SDK untuk JavaScript, gunakan [npm](https://www.npmjs.com/) untuk menambahkannya ke paket Anda.

1. Buat Dockerfile baru dengan konfigurasi berikut:
   + Mengatur `FROM` properti ke [URI dari gambar dasar](https://gallery.ecr.aws/lambda/nodejs).
   + Gunakan perintah COPY untuk menyalin kode fungsi dan dependensi runtime ke`{LAMBDA_TASK_ROOT}`, variabel lingkungan yang ditentukan [Lambda](configuration-envvars.md#configuration-envvars-runtime).
   + Atur `CMD` argumen ke penangan fungsi Lambda.

   Perhatikan bahwa contoh Dockerfile tidak menyertakan instruksi [USER](https://docs.docker.com/reference/dockerfile/#user). Saat Anda menyebarkan gambar kontainer ke Lambda, Lambda secara otomatis mendefinisikan pengguna Linux default dengan izin yang paling tidak memiliki hak istimewa. Ini berbeda dari perilaku Docker standar yang default ke `root` pengguna ketika tidak ada `USER` instruksi yang diberikan.  
**Example Dockerfile**  

   ```
   FROM public.ecr.aws/lambda/nodejs:22
   
   # Copy function code
   COPY index.js ${LAMBDA_TASK_ROOT}
     
   # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
   CMD [ "index.handler" ]
   ```

1. Buat image Docker dengan perintah [docker](https://docs.docker.com/engine/reference/commandline/build/) build. Contoh berikut menamai gambar `docker-image` dan memberinya `test` [tag](https://docs.docker.com/engine/reference/commandline/build/#tag). Untuk membuat gambar Anda kompatibel dengan Lambda, Anda harus menggunakan opsi. `--provenance=false`

   ```
   docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
   ```
**catatan**  
Perintah menentukan `--platform linux/amd64` opsi untuk memastikan bahwa container Anda kompatibel dengan lingkungan eksekusi Lambda terlepas dari arsitektur mesin build Anda. Jika Anda berniat untuk membuat fungsi Lambda menggunakan arsitektur set ARM64 instruksi, pastikan untuk mengubah perintah untuk menggunakan `--platform linux/arm64` opsi sebagai gantinya.

### (Opsional) Uji gambar secara lokal
<a name="nodejs-image-test"></a>

1. Mulai gambar Docker dengan perintah **docker run**. Dalam contoh ini, `docker-image` adalah nama gambar dan `test` tag.

   ```
   docker run --platform linux/amd64 -p 9000:8080 docker-image:test
   ```

   Perintah ini menjalankan gambar sebagai wadah dan membuat titik akhir lokal di`localhost:9000/2015-03-31/functions/function/invocations`.
**catatan**  
Jika Anda membuat image Docker untuk arsitektur set ARM64 instruksi, pastikan untuk menggunakan `--platform linux/arm64` opsi alih-alih. `--platform linux/amd64`

1. Dari jendela terminal baru, posting acara ke titik akhir lokal.

------
#### [ Linux/macOS ]

   Di Linux dan macOS, jalankan perintah berikut: `curl`

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
   ```

   Perintah ini memanggil fungsi dengan peristiwa kosong dan mengembalikan respons. Jika Anda menggunakan kode fungsi Anda sendiri daripada kode fungsi sampel, Anda mungkin ingin memanggil fungsi dengan payload JSON. Contoh:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
   ```

------
#### [ PowerShell ]

   Dalam PowerShell, jalankan `Invoke-WebRequest` perintah berikut:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"
   ```

   Perintah ini memanggil fungsi dengan peristiwa kosong dan mengembalikan respons. Jika Anda menggunakan kode fungsi Anda sendiri daripada kode fungsi sampel, Anda mungkin ingin memanggil fungsi dengan payload JSON. Contoh:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
   ```

------

1. Dapatkan ID kontainer.

   ```
   docker ps
   ```

1. Gunakan perintah [docker kill](https://docs.docker.com/engine/reference/commandline/kill/) untuk menghentikan wadah. Dalam perintah ini, ganti `3766c4ab331c` dengan ID kontainer dari langkah sebelumnya.

   ```
   docker kill 3766c4ab331c
   ```

### Menyebarkan gambar
<a name="nodejs-image-deploy"></a>

**Untuk mengunggah gambar ke Amazon ECR dan membuat fungsi Lambda**

1. Jalankan [get-login-password](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html)perintah untuk mengautentikasi CLI Docker ke registri Amazon ECR Anda.
   + Tetapkan `--region` nilai ke Wilayah AWS tempat Anda ingin membuat repositori Amazon ECR.
   + Ganti `111122223333` dengan Akun AWS ID Anda.

   ```
   aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
   ```

1. [Buat repositori di Amazon ECR menggunakan perintah create-repository.](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/create-repository.html)

   ```
   aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
   ```
**catatan**  
Repositori Amazon ECR harus sama Wilayah AWS dengan fungsi Lambda.

   Jika berhasil, Anda melihat respons seperti ini:

   ```
   {
       "repository": {
           "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world",
           "registryId": "111122223333",
           "repositoryName": "hello-world",
           "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world",
           "createdAt": "2023-03-09T10:39:01+00:00",
           "imageTagMutability": "MUTABLE",
           "imageScanningConfiguration": {
               "scanOnPush": true
           },
           "encryptionConfiguration": {
               "encryptionType": "AES256"
           }
       }
   }
   ```

1. Salin `repositoryUri` dari output pada langkah sebelumnya.

1. Jalankan perintah [tag docker](https://docs.docker.com/engine/reference/commandline/tag/) untuk menandai gambar lokal Anda ke repositori Amazon ECR Anda sebagai versi terbaru. Dalam perintah ini:
   + `docker-image:test`adalah nama dan [tag](https://docs.docker.com/engine/reference/commandline/build/#tag) gambar Docker Anda. Ini adalah nama gambar dan tag yang Anda tentukan dalam `docker build` perintah.
   + Ganti `<ECRrepositoryUri>` dengan `repositoryUri` yang Anda salin. Pastikan untuk menyertakan `:latest` di akhir URI.

   ```
   docker tag docker-image:test <ECRrepositoryUri>:latest
   ```

   Contoh:

   ```
   docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. Jalankan perintah [docker push](https://docs.docker.com/engine/reference/commandline/push/) untuk menyebarkan gambar lokal Anda ke repositori Amazon ECR. Pastikan untuk menyertakan `:latest` di akhir URI repositori.

   ```
   docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. [Buat peran eksekusi](lambda-intro-execution-role.md#permissions-executionrole-api) untuk fungsi tersebut, jika Anda belum memilikinya. Anda memerlukan Nama Sumber Daya Amazon (ARN) dari peran tersebut di langkah berikutnya.

1. Buat fungsi Lambda. Untuk`ImageUri`, tentukan URI repositori dari sebelumnya. Pastikan untuk menyertakan `:latest` di akhir URI.

   ```
   aws lambda create-function \
     --function-name hello-world \
     --package-type Image \
     --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
     --role arn:aws:iam::111122223333:role/lambda-ex
   ```
**catatan**  
Anda dapat membuat fungsi menggunakan gambar di AWS akun yang berbeda, selama gambar berada di Wilayah yang sama dengan fungsi Lambda. Untuk informasi selengkapnya, lihat [Izin lintas akun Amazon ECR](images-create.md#configuration-images-xaccount-permissions).

1. Memanggil fungsi.

   ```
   aws lambda invoke --function-name hello-world response.json
   ```

   Anda akan melihat tanggapan seperti ini:

   ```
   {
     "ExecutedVersion": "$LATEST", 
     "StatusCode": 200
   }
   ```

1. Untuk melihat output dari fungsi, periksa `response.json` file.

Untuk memperbarui kode fungsi, Anda harus membangun gambar lagi, mengunggah gambar baru ke repositori Amazon ECR, dan kemudian menggunakan [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)perintah untuk menyebarkan gambar ke fungsi Lambda.

Lambda menyelesaikan tag gambar ke intisari gambar tertentu. Ini berarti bahwa jika Anda mengarahkan tag gambar yang digunakan untuk menyebarkan fungsi ke gambar baru di Amazon ECR, Lambda tidak secara otomatis memperbarui fungsi untuk menggunakan gambar baru.

Untuk menyebarkan gambar baru ke fungsi Lambda yang sama, Anda harus menggunakan [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)perintah, meskipun tag gambar di Amazon ECR tetap sama. Dalam contoh berikut, `--publish` opsi membuat versi baru dari fungsi menggunakan gambar kontainer yang diperbarui.

```
aws lambda update-function-code \
  --function-name hello-world \
  --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
  --publish
```

## Menggunakan gambar dasar alternatif dengan klien antarmuka runtime
<a name="nodejs-image-clients"></a>

Jika Anda menggunakan gambar [dasar khusus OS atau gambar dasar](images-create.md#runtimes-images-provided) alternatif, Anda harus menyertakan klien antarmuka runtime dalam gambar Anda. Klien antarmuka runtime memperluas[API runtime](runtimes-api.md), yang mengelola interaksi antara Lambda dan kode fungsi Anda.

Instal [klien antarmuka runtime Node.js](https://www.npmjs.com/package/aws-lambda-ric) menggunakan manajer paket npm:

```
npm install aws-lambda-ric
```

Anda juga dapat mengunduh [klien antarmuka runtime Node.js](https://github.com/aws/aws-lambda-nodejs-runtime-interface-client) dari GitHub.

Contoh berikut menunjukkan bagaimana membangun image container untuk Node.js menggunakan image non-AWS base. Contoh Dockerfile menggunakan gambar `bookworm` dasar. Dockerfile menyertakan klien antarmuka runtime.

### Prasyarat
<a name="nodejs-alt-prerequisites"></a>

Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:
+ [AWS CLI versi 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [Docker](https://docs.docker.com/get-docker) (versi minimum 25.0.0)
+ Plugin [buildx Docker](https://github.com/docker/buildx/blob/master/README.md).
+ Node.js

### Membuat gambar dari gambar dasar alternatif
<a name="nodejs-alt-create"></a>

**Untuk membuat gambar kontainer dari gambar AWS non-dasar**

1. Buat direktori untuk proyek, dan kemudian beralih ke direktori itu.

   ```
   mkdir example
   cd example
   ```

1. Buat proyek Node.js baru dengan`npm`. Untuk menerima opsi default yang disediakan dalam pengalaman interaktif, tekan`Enter`.

   ```
   npm init
   ```

1. Buat file baru bernama`index.js`. Anda dapat menambahkan kode fungsi contoh berikut ke file untuk pengujian, atau menggunakan kode Anda sendiri.  
**Example Penangan CommonJS**  

   ```
   exports.handler = async (event) => {
       const response = {
           statusCode: 200,
           body: JSON.stringify('Hello from Lambda!'),
       };
       return response;
   };
   ```

1. Buat Dockerfile baru. Dockerfile berikut menggunakan gambar `bookworm` dasar, bukan gambar [AWS dasar](images-create.md#runtimes-images-lp). Dockerfile menyertakan [klien antarmuka runtime](https://www.npmjs.com/package/aws-lambda-ric), yang membuat gambar kompatibel dengan Lambda. Dockerfile menggunakan build [multi-tahap](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#use-multi-stage-builds). Tahap pertama membuat image build, yang merupakan lingkungan Node.js standar tempat dependensi fungsi diinstal. Tahap kedua menciptakan gambar yang lebih ramping yang mencakup kode fungsi dan dependensinya. Ini mengurangi ukuran gambar akhir.
   + Atur `FROM` properti ke pengidentifikasi gambar dasar.
   + Gunakan `COPY` perintah untuk menyalin kode fungsi dan dependensi runtime.
   + Atur `ENTRYPOINT` ke modul yang Anda inginkan untuk menjalankan wadah Docker saat dimulai. Dalam hal ini, modul adalah klien antarmuka runtime.
   + Atur `CMD` argumen ke penangan fungsi Lambda.

   Perhatikan bahwa contoh Dockerfile tidak menyertakan instruksi [USER](https://docs.docker.com/reference/dockerfile/#user). Saat Anda menyebarkan gambar kontainer ke Lambda, Lambda secara otomatis mendefinisikan pengguna Linux default dengan izin yang paling tidak memiliki hak istimewa. Ini berbeda dari perilaku Docker standar yang default ke `root` pengguna ketika tidak ada `USER` instruksi yang diberikan.  
**Example Dockerfile**  

   ```
   # Define custom function directory
   ARG FUNCTION_DIR="/function"
   
   FROM node:20-bookworm as build-image
   
   # Include global arg in this stage of the build
   ARG FUNCTION_DIR
   
   # Install build dependencies
   RUN apt-get update && \
       apt-get install -y \
       g++ \
       make \
       cmake \
       unzip \
       libcurl4-openssl-dev
   
   # Copy function code
   RUN mkdir -p ${FUNCTION_DIR}
   COPY . ${FUNCTION_DIR}
   
   WORKDIR ${FUNCTION_DIR}
   
   # Install Node.js dependencies
   RUN npm install
   
   # Install the runtime interface client
   RUN npm install aws-lambda-ric
   
   # Grab a fresh slim copy of the image to reduce the final size
   FROM node:20-bookworm-slim
   
   # Required for Node runtimes which use npm@8.6.0+ because
   # by default npm writes logs under /home/.npm and Lambda fs is read-only
   ENV NPM_CONFIG_CACHE=/tmp/.npm
   
   # Include global arg in this stage of the build
   ARG FUNCTION_DIR
   
   # Set working directory to function root directory
   WORKDIR ${FUNCTION_DIR}
   
   # Copy in the built dependencies
   COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR}
   
   # Set runtime interface client as default command for the container runtime
   ENTRYPOINT ["/usr/local/bin/npx", "aws-lambda-ric"]
   # Pass the name of the function handler as an argument to the runtime
   CMD ["index.handler"]
   ```

1. Buat image Docker dengan perintah [docker](https://docs.docker.com/engine/reference/commandline/build/) build. Contoh berikut menamai gambar `docker-image` dan memberinya `test` [tag](https://docs.docker.com/engine/reference/commandline/build/#tag). Untuk membuat gambar Anda kompatibel dengan Lambda, Anda harus menggunakan opsi. `--provenance=false`

   ```
   docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
   ```
**catatan**  
Perintah menentukan `--platform linux/amd64` opsi untuk memastikan bahwa container Anda kompatibel dengan lingkungan eksekusi Lambda terlepas dari arsitektur mesin build Anda. Jika Anda berniat untuk membuat fungsi Lambda menggunakan arsitektur set ARM64 instruksi, pastikan untuk mengubah perintah untuk menggunakan `--platform linux/arm64` opsi sebagai gantinya.

### (Opsional) Uji gambar secara lokal
<a name="nodejs-alt-test"></a>

Gunakan [emulator antarmuka runtime](https://github.com/aws/aws-lambda-runtime-interface-emulator/) untuk menguji gambar secara lokal. Anda dapat [membangun emulator ke dalam gambar Anda](https://github.com/aws/aws-lambda-runtime-interface-emulator/?tab=readme-ov-file#build-rie-into-your-base-image) atau menggunakan prosedur berikut untuk menginstalnya di mesin lokal Anda.

**Untuk menginstal dan menjalankan emulator antarmuka runtime di mesin lokal Anda**

1. Dari direktori proyek Anda, jalankan perintah berikut untuk mengunduh emulator antarmuka runtime (arsitektur x86-64) dari GitHub dan menginstalnya di mesin lokal Anda.

------
#### [ Linux/macOS ]

   ```
   mkdir -p ~/.aws-lambda-rie && \
       curl -Lo ~/.aws-lambda-rie/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && \
       chmod +x ~/.aws-lambda-rie/aws-lambda-rie
   ```

   Untuk menginstal emulator arm64, ganti URL GitHub repositori di perintah sebelumnya dengan yang berikut:

   ```
   https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
   ```

------
#### [ PowerShell ]

   ```
   $dirPath = "$HOME\.aws-lambda-rie"
   if (-not (Test-Path $dirPath)) {
       New-Item -Path $dirPath -ItemType Directory
   }
         
   $downloadLink = "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie"
   $destinationPath = "$HOME\.aws-lambda-rie\aws-lambda-rie"
   Invoke-WebRequest -Uri $downloadLink -OutFile $destinationPath
   ```

   Untuk menginstal emulator arm64, ganti `$downloadLink` dengan yang berikut ini:

   ```
   https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
   ```

------

1. Mulai gambar Docker dengan perintah **docker run**. Perhatikan hal-hal berikut:
   + `docker-image`adalah nama gambar dan `test` tag.
   + `/usr/local/bin/npx aws-lambda-ric index.handler`adalah `ENTRYPOINT` diikuti oleh `CMD` dari Dockerfile Anda.

------
#### [ Linux/macOS ]

   ```
   docker run --platform linux/amd64 -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
       --entrypoint /aws-lambda/aws-lambda-rie \
       docker-image:test \
           /usr/local/bin/npx aws-lambda-ric index.handler
   ```

------
#### [ PowerShell ]

   ```
   docker run --platform linux/amd64 -d -v "$HOME\.aws-lambda-rie:/aws-lambda" -p 9000:8080 `
   --entrypoint /aws-lambda/aws-lambda-rie `
   docker-image:test `
       /usr/local/bin/npx aws-lambda-ric index.handler
   ```

------

   Perintah ini menjalankan gambar sebagai wadah dan membuat titik akhir lokal di`localhost:9000/2015-03-31/functions/function/invocations`.
**catatan**  
Jika Anda membuat image Docker untuk arsitektur set ARM64 instruksi, pastikan untuk menggunakan `--platform linux/arm64` opsi alih-alih. `--platform linux/amd64`

1. Posting acara ke titik akhir lokal.

------
#### [ Linux/macOS ]

   Di Linux dan macOS, jalankan perintah berikut: `curl`

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
   ```

   Perintah ini memanggil fungsi dengan peristiwa kosong dan mengembalikan respons. Jika Anda menggunakan kode fungsi Anda sendiri daripada kode fungsi sampel, Anda mungkin ingin memanggil fungsi dengan payload JSON. Contoh:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
   ```

------
#### [ PowerShell ]

   Dalam PowerShell, jalankan `Invoke-WebRequest` perintah berikut:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"
   ```

   Perintah ini memanggil fungsi dengan peristiwa kosong dan mengembalikan respons. Jika Anda menggunakan kode fungsi Anda sendiri daripada kode fungsi sampel, Anda mungkin ingin memanggil fungsi dengan payload JSON. Contoh:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
   ```

------

1. Dapatkan ID kontainer.

   ```
   docker ps
   ```

1. Gunakan perintah [docker kill](https://docs.docker.com/engine/reference/commandline/kill/) untuk menghentikan wadah. Dalam perintah ini, ganti `3766c4ab331c` dengan ID kontainer dari langkah sebelumnya.

   ```
   docker kill 3766c4ab331c
   ```

### Menyebarkan gambar
<a name="nodejs-alt-deploy"></a>

**Untuk mengunggah gambar ke Amazon ECR dan membuat fungsi Lambda**

1. Jalankan [get-login-password](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html)perintah untuk mengautentikasi CLI Docker ke registri Amazon ECR Anda.
   + Tetapkan `--region` nilai ke Wilayah AWS tempat Anda ingin membuat repositori Amazon ECR.
   + Ganti `111122223333` dengan Akun AWS ID Anda.

   ```
   aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
   ```

1. [Buat repositori di Amazon ECR menggunakan perintah create-repository.](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/create-repository.html)

   ```
   aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
   ```
**catatan**  
Repositori Amazon ECR harus sama Wilayah AWS dengan fungsi Lambda.

   Jika berhasil, Anda melihat respons seperti ini:

   ```
   {
       "repository": {
           "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world",
           "registryId": "111122223333",
           "repositoryName": "hello-world",
           "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world",
           "createdAt": "2023-03-09T10:39:01+00:00",
           "imageTagMutability": "MUTABLE",
           "imageScanningConfiguration": {
               "scanOnPush": true
           },
           "encryptionConfiguration": {
               "encryptionType": "AES256"
           }
       }
   }
   ```

1. Salin `repositoryUri` dari output pada langkah sebelumnya.

1. Jalankan perintah [tag docker](https://docs.docker.com/engine/reference/commandline/tag/) untuk menandai gambar lokal Anda ke repositori Amazon ECR Anda sebagai versi terbaru. Dalam perintah ini:
   + `docker-image:test`adalah nama dan [tag](https://docs.docker.com/engine/reference/commandline/build/#tag) gambar Docker Anda. Ini adalah nama gambar dan tag yang Anda tentukan dalam `docker build` perintah.
   + Ganti `<ECRrepositoryUri>` dengan `repositoryUri` yang Anda salin. Pastikan untuk menyertakan `:latest` di akhir URI.

   ```
   docker tag docker-image:test <ECRrepositoryUri>:latest
   ```

   Contoh:

   ```
   docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. Jalankan perintah [docker push](https://docs.docker.com/engine/reference/commandline/push/) untuk menyebarkan gambar lokal Anda ke repositori Amazon ECR. Pastikan untuk menyertakan `:latest` di akhir URI repositori.

   ```
   docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. [Buat peran eksekusi](lambda-intro-execution-role.md#permissions-executionrole-api) untuk fungsi tersebut, jika Anda belum memilikinya. Anda memerlukan Nama Sumber Daya Amazon (ARN) dari peran tersebut di langkah berikutnya.

1. Buat fungsi Lambda. Untuk`ImageUri`, tentukan URI repositori dari sebelumnya. Pastikan untuk menyertakan `:latest` di akhir URI.

   ```
   aws lambda create-function \
     --function-name hello-world \
     --package-type Image \
     --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
     --role arn:aws:iam::111122223333:role/lambda-ex
   ```
**catatan**  
Anda dapat membuat fungsi menggunakan gambar di AWS akun yang berbeda, selama gambar berada di Wilayah yang sama dengan fungsi Lambda. Untuk informasi selengkapnya, lihat [Izin lintas akun Amazon ECR](images-create.md#configuration-images-xaccount-permissions).

1. Memanggil fungsi.

   ```
   aws lambda invoke --function-name hello-world response.json
   ```

   Anda akan melihat tanggapan seperti ini:

   ```
   {
     "ExecutedVersion": "$LATEST", 
     "StatusCode": 200
   }
   ```

1. Untuk melihat output dari fungsi, periksa `response.json` file.

Untuk memperbarui kode fungsi, Anda harus membangun gambar lagi, mengunggah gambar baru ke repositori Amazon ECR, dan kemudian menggunakan [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)perintah untuk menyebarkan gambar ke fungsi Lambda.

Lambda menyelesaikan tag gambar ke intisari gambar tertentu. Ini berarti bahwa jika Anda mengarahkan tag gambar yang digunakan untuk menyebarkan fungsi ke gambar baru di Amazon ECR, Lambda tidak secara otomatis memperbarui fungsi untuk menggunakan gambar baru.

Untuk menyebarkan gambar baru ke fungsi Lambda yang sama, Anda harus menggunakan [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)perintah, meskipun tag gambar di Amazon ECR tetap sama. Dalam contoh berikut, `--publish` opsi membuat versi baru dari fungsi menggunakan gambar kontainer yang diperbarui.

```
aws lambda update-function-code \
  --function-name hello-world \
  --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
  --publish
```

# Bekerja dengan lapisan untuk fungsi Lambda Node.js
<a name="nodejs-layers"></a>

Gunakan [lapisan Lambda](chapter-layers.md) untuk mengemas kode dan dependensi yang ingin Anda gunakan kembali di beberapa fungsi. Lapisan biasanya berisi dependensi pustaka, [runtime kustom](runtimes-custom.md), atau file konfigurasi. Membuat layer melibatkan tiga langkah umum:

1. Package konten layer Anda. Ini berarti membuat arsip file.zip yang berisi dependensi yang ingin Anda gunakan dalam fungsi Anda.

1. Buat layer di Lambda.

1. Tambahkan layer ke fungsi Anda.

**Topics**
+ [

## Package konten layer Anda
](#nodejs-layers-package)
+ [

## Buat layer di Lambda
](#publishing-layer)
+ [

## Tambahkan layer ke fungsi Anda
](#nodejs-layer-adding)
+ [

## Contoh aplikasi
](#nodejs-layer-sample-app)

## Package konten layer Anda
<a name="nodejs-layers-package"></a>

Untuk membuat layer, bundel paket Anda ke dalam arsip file.zip yang memenuhi persyaratan berikut:
+ Bangun layer menggunakan versi Node.js yang sama yang Anda rencanakan untuk digunakan untuk fungsi Lambda. Misalnya, jika Anda membangun layer Anda menggunakan Node.js 24, gunakan runtime Node.js 24 untuk fungsi Anda.
+ File zip layer Anda harus menggunakan salah satu struktur direktori ini:
  + `nodejs/node_modules`
  + `nodejs/nodeX/node_modules`(di *X* mana versi Node.js Anda, misalnya`node22`)

  Untuk informasi selengkapnya, lihat [Jalur lapisan untuk setiap runtime Lambda](packaging-layers.md#packaging-layers-paths).
+ Paket di lapisan Anda harus kompatibel dengan Linux. Fungsi Lambda berjalan di Amazon Linux.

Anda dapat membuat lapisan yang berisi pustaka Node.js pihak ketiga yang diinstal dengan `npm` (seperti `axios` atau`lodash`) atau JavaScript modul Anda sendiri.

### Ketergantungan pihak ketiga
<a name="nodejs-layers-third-party-dependencies"></a>

**Untuk membuat layer menggunakan paket npm**

1. Buat struktur direktori yang diperlukan dan instal paket langsung ke dalamnya:

   ```
   mkdir -p nodejs
   npm install --prefix nodejs lodash axios
   ```

   Perintah ini menginstal paket langsung ke `nodejs/node_modules` direktori, yang merupakan struktur yang dibutuhkan Lambda.
**catatan**  
[Untuk paket dengan dependensi asli atau komponen biner (seperti [sharp](https://www.npmjs.com/package/sharp) atau [bcrypt](https://www.npmjs.com/package/bcrypt)), pastikan bahwa mereka kompatibel dengan lingkungan Linux Lambda dan arsitektur fungsi Anda.](foundation-arch.md) Anda mungkin perlu menggunakan `--platform` bendera:  

   ```
   npm install --prefix nodejs --platform=linux --arch=x64 sharp
   ```
Untuk dependensi asli yang lebih kompleks, Anda mungkin perlu mengompilasinya di lingkungan Linux yang cocok dengan runtime Lambda. Anda dapat menggunakan Docker untuk tujuan ini.

1. Zip konten lapisan:

------
#### [ Linux/macOS ]

   ```
   zip -r layer.zip nodejs/
   ```

------
#### [ PowerShell ]

   ```
   Compress-Archive -Path .\nodejs -DestinationPath .\layer.zip
   ```

------

   Struktur direktori file.zip Anda akan terlihat seperti ini:

   ```
   nodejs/
   ├── package.json
   ├── package-lock.json
   └── node_modules/
       ├── lodash/
       ├── axios/
       └── (dependencies of the other packages)
   ```
**catatan**  
Pastikan file.zip Anda menyertakan `nodejs` direktori di tingkat root dengan `node_modules` di dalamnya. Struktur ini memastikan bahwa Lambda dapat menemukan dan mengimpor paket Anda.
`package-lock.json`File `package.json` dan dalam `nodejs/` direktori digunakan oleh npm untuk manajemen ketergantungan tetapi tidak diperlukan oleh Lambda untuk fungsionalitas lapisan. Setiap paket yang diinstal sudah berisi `package.json` file sendiri yang mendefinisikan bagaimana Lambda mengimpor paket.

### JavaScript Modul kustom
<a name="custom-nodejs-modules"></a>

**Untuk membuat layer menggunakan kode Anda sendiri**

1. Buat struktur direktori yang diperlukan untuk layer Anda:

   ```
   mkdir -p nodejs/node_modules/validator
   cd nodejs/node_modules/validator
   ```

1. Buat `package.json` file untuk modul kustom Anda untuk menentukan bagaimana seharusnya diimpor:  
**Example nodejs/node\$1modules/validator/package.json**  

   ```
   {
     "name": "validator",
     "version": "1.0.0",
     "type": "module",
     "main": "index.mjs"
   }
   ```

1. Buat file JavaScript modul Anda:  
**Example nodejs/node\$1modules/validator/index.mjs**  

   ```
   export function validateOrder(orderData) {
     // Validates an order and returns formatted data
     const requiredFields = ['productId', 'quantity'];
     
     // Check required fields
     const missingFields = requiredFields.filter(field => !(field in orderData));
     if (missingFields.length > 0) {
       throw new Error(`Missing required fields: ${missingFields.join(', ')}`);
     }
     
     // Validate quantity
     const quantity = orderData.quantity;
     if (!Number.isInteger(quantity) || quantity < 1) {
       throw new Error('Quantity must be a positive integer');
     }
     
     // Format and return the validated data
     return {
       productId: String(orderData.productId),
       quantity: quantity,
       shippingPriority: orderData.priority || 'standard'
     };
   }
   
   export function formatResponse(statusCode, body) {
     // Formats the API response
     return {
       statusCode: statusCode,
       body: JSON.stringify(body)
     };
   }
   ```

1. Zip konten lapisan:

------
#### [ Linux/macOS ]

   ```
   zip -r layer.zip nodejs/
   ```

------
#### [ PowerShell ]

   ```
   Compress-Archive -Path .\nodejs -DestinationPath .\layer.zip
   ```

------

   Struktur direktori file.zip Anda akan terlihat seperti ini:

   ```
   nodejs/              
   └── node_modules/
       └── validator/
           ├── package.json
           └── index.mjs
   ```

1. Dalam fungsi Anda, impor dan gunakan modul. Contoh:

   ```
   import { validateOrder, formatResponse } from 'validator';
   
   export const handler = async (event) => {
     try {
       // Parse the order data from the event body
       const orderData = JSON.parse(event.body || '{}');
       
       // Validate and format the order
       const validatedOrder = validateOrder(orderData);
       
       return formatResponse(200, {
         message: 'Order validated successfully',
         order: validatedOrder
       });
     } catch (error) {
       if (error instanceof Error && error.message.includes('Missing required fields')) {
         return formatResponse(400, {
           error: error.message
         });
       }
       
       return formatResponse(500, {
         error: 'Internal server error'
       });
     }
   };
   ```

   Anda dapat menggunakan [peristiwa pengujian](testing-functions.md#invoke-with-event) berikut untuk menjalankan fungsi:

   ```
   {
       "body": "{\"productId\": \"ABC123\", \"quantity\": 2, \"priority\": \"express\"}"
   }
   ```

   Tanggapan yang diharapkan:

   ```
   {
     "statusCode": 200,
     "body": "{\"message\":\"Order validated successfully\",\"order\":{\"productId\":\"ABC123\",\"quantity\":2,\"shippingPriority\":\"express\"}}"
   }
   ```

## Buat layer di Lambda
<a name="publishing-layer"></a>

Anda dapat mempublikasikan layer Anda menggunakan konsol AWS CLI atau Lambda.

------
#### [ AWS CLI ]

Jalankan [publish-layer-version](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/publish-layer-version.html) AWS CLI perintah untuk membuat layer Lambda:

```
aws lambda publish-layer-version --layer-name my-layer --zip-file fileb://layer.zip --compatible-runtimes nodejs24.x
```

Parameter [runtime yang kompatibel](https://docs.aws.amazon.com/lambda/latest/api/API_PublishLayerVersion.html#lambda-PublishLayerVersion-request-CompatibleRuntimes) adalah opsional. Saat ditentukan, Lambda menggunakan parameter ini untuk memfilter lapisan di konsol Lambda.

------
#### [ Console ]

**Untuk membuat lapisan (konsol)**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/layers) di konsol Lambda.

1. Pilih **Buat lapisan**.

1. Pilih **Unggah file.zip**, lalu unggah arsip.zip yang Anda buat sebelumnya.

1. (Opsional) Untuk **runtime yang kompatibel**, pilih runtime Node.js yang sesuai dengan versi Node.js yang Anda gunakan untuk membangun layer Anda.

1. Pilih **Buat**.

------

## Tambahkan layer ke fungsi Anda
<a name="nodejs-layer-adding"></a>

------
#### [ AWS CLI ]

Untuk melampirkan layer ke fungsi Anda, jalankan [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) AWS CLI perintah. Untuk `--layers` parameter, gunakan lapisan ARN. ARN harus menentukan versi (misalnya,`arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1`). Untuk informasi selengkapnya, lihat [Versi lapisan dan lapisan](chapter-layers.md#lambda-layer-versions).

```
aws lambda update-function-configuration --function-name my-function --cli-binary-format raw-in-base64-out --layers "arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1"
```

**cli-binary-format**Opsi ini diperlukan jika Anda menggunakan AWS CLI versi 2. Untuk menjadikan ini pengaturan default, jalankan`aws configure set cli-binary-format raw-in-base64-out`. Untuk informasi selengkapnya, lihat [opsi baris perintah global yang AWS CLI didukung](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) di *Panduan AWS Command Line Interface Pengguna untuk Versi 2*.

------
#### [ Console ]

**Untuk menambahkan lapisan ke fungsi**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsinya.

1. Gulir ke bawah ke bagian **Layers**, lalu pilih **Add a layer**.

1. Di bawah **Pilih layer**, pilih **Custom layers**, dan kemudian pilih layer Anda.
**catatan**  
Jika Anda tidak menambahkan [runtime yang kompatibel](https://docs.aws.amazon.com/lambda/latest/api/API_PublishLayerVersion.html#lambda-PublishLayerVersion-request-CompatibleRuntimes) saat membuat layer, layer Anda tidak akan tercantum di sini. Anda dapat menentukan lapisan ARN sebagai gantinya.

1. Pilih **Tambahkan**.

------

## Contoh aplikasi
<a name="nodejs-layer-sample-app"></a>

Untuk contoh lebih lanjut tentang cara menggunakan layer Lambda, lihat contoh aplikasi [layer-nodejs](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/layer-nodejs) di repositori Panduan Pengembang. AWS Lambda GitHub Aplikasi ini mencakup lapisan yang berisi pustaka [lodash](https://www.npmjs.com/package/lodash). Setelah membuat layer, Anda dapat menerapkan dan memanggil fungsi yang sesuai untuk mengonfirmasi bahwa lapisan berfungsi seperti yang diharapkan.

# Menggunakan objek konteks Lambda untuk mengambil informasi fungsi Node.js
<a name="nodejs-context"></a>

Saat Lambda menjalankan fungsi Anda, ia meneruskan objek konteks ke [handler](nodejs-handler.md). Objek ini menyediakan metode dan properti yang memberikan informasi tentang lingkungan invokasi, fungsi, dan eksekusi.

**Metode konteks**
+ `getRemainingTimeInMillis()` – Mengembalikan jumlah milidetik yang tersisa sebelum waktu eksekusi habis.

**Properti konteks**
+ `functionName` – Nama fungsi Lambda.
+ `functionVersion` – [Versi](configuration-versions.md) fungsi.
+ `invokedFunctionArn` – Amazon Resource Name (ARN) yang digunakan untuk memicu fungsi. Menunjukkan jika pemicu menyebutkan nomor versi atau alias.
+ `memoryLimitInMB` – Jumlah memori yang dialokasikan untuk fungsi tersebut.
+ `awsRequestId` – Pengidentifikasi permintaan invokasi.
+ `logGroupName` – Grup log untuk fungsi.
+ `logStreamName` – Aliran log untuk instans fungsi.
+ `identity` – (aplikasi seluler) Informasi tentang identitas Amazon Cognito yang mengesahkan permintaan.
  + `cognitoIdentityId` – Identitas Amazon Cognito terautentikasi.
  + `cognitoIdentityPoolId` – Kumpulan identitas Amazon Cognito yang mengesahkan invokasi.
+ `clientContext` – (aplikasi seluler) Konteks klien yang disediakan untuk Lambda oleh aplikasi klien.
  + `client.installation_id`
  + `client.app_title`
  + `client.app_version_name`
  + `client.app_version_code`
  + `client.app_package_name`
  + `env.platform_version`
  + `env.platform`
  + `env.make`
  + `env.model`
  + `env.locale`
  + `custom` – Nilai kustom yang ditetapkan oleh aplikasi klien. 
+ `callbackWaitsForEmptyEventLoop`— Secara default (`true`), saat menggunakan penangan fungsi berbasis callback, Lambda menunggu loop peristiwa kosong setelah panggilan balik berjalan sebelum mengakhiri pemanggilan fungsi. Setel `false` untuk mengirim respons dan mengakhiri pemanggilan segera setelah panggilan balik berjalan alih-alih menunggu loop acara kosong. Acara luar biasa terus berjalan selama doa berikutnya. Perhatikan bahwa Lambda mendukung penangan fungsi berbasis callback untuk Node.js 22 dan runtime sebelumnya saja.

Contoh fungsi berikut mencatat informasi konteks dan mengembalikan lokasi log.

**Example index.js file**  

```
exports.handler = async function(event, context) {
  console.log('Remaining time: ', context.getRemainingTimeInMillis())
  console.log('Function name: ', context.functionName)
  return context.logStreamName
}
```

# Log dan pantau fungsi Node.js Lambda
<a name="nodejs-logging"></a>

AWS Lambda secara otomatis memonitor fungsi Lambda atas nama Anda dan mengirim log ke Amazon. CloudWatch Fungsi Lambda Anda dilengkapi dengan grup CloudWatch log Log dan aliran log untuk setiap instance fungsi Anda. Lingkungan runtime Lambda mengirimkan detail tentang setiap invokasi ke pengaliran log, dan menyampaikan log serta output lain dari kode fungsi Anda. Untuk informasi selengkapnya, lihat [Mengirim log fungsi Lambda ke Log CloudWatch](monitoring-cloudwatchlogs.md).

Halaman ini menjelaskan cara menghasilkan keluaran log dari kode fungsi Lambda Anda, dan mengakses log menggunakan AWS Command Line Interface, konsol Lambda, atau konsol. CloudWatch 

**Topics**
+ [

## Membuat fungsi yang mengembalikan log
](#node-logging-output)
+ [

## Menggunakan kontrol logging lanjutan Lambda dengan Node.js
](#node-js-logging-advanced)
+ [

## Melihat log di konsol Lambda
](#nodejs-logging-console)
+ [

## Melihat log di CloudWatch konsol
](#nodejs-logging-cwconsole)
+ [

## Melihat log menggunakan AWS Command Line Interface (AWS CLI)
](#nodejs-logging-cli)
+ [

## Menghapus log
](#nodejs-logging-delete)

## Membuat fungsi yang mengembalikan log
<a name="node-logging-output"></a>

Untuk menghasilkan log dari kode fungsi, Anda dapat menggunakan metode di [objek konsol](https://developer.mozilla.org/en-US/docs/Web/API/Console), atau pustaka pencatatan yang menulis ke `stdout` atau `stderr`. Contoh berikut mencatat nilai variabel lingkungan dan objek peristiwa.

**catatan**  
Kami menyarankan Anda menggunakan teknik seperti validasi input dan pengkodean output saat mencatat input. Jika Anda mencatat data input secara langsung, penyerang mungkin dapat menggunakan kode Anda untuk membuat gangguan sulit dideteksi, memalsukan entri log, atau melewati monitor log. Untuk informasi selengkapnya, lihat [Netralisasi Output yang Tidak Tepat untuk Log](https://cwe.mitre.org/data/definitions/117.html) dalam *Pencacahan Kelemahan Umum*. 

**Example index.js file – Pencatatan**  

```
exports.handler = async function(event, context) {
  console.log("ENVIRONMENT VARIABLES\n" + JSON.stringify(process.env, null, 2))
  console.info("EVENT\n" + JSON.stringify(event, null, 2))
  console.warn("Event not processed.")
  return context.logStreamName
}
```

**Example format log**  

```
START RequestId: c793869b-ee49-115b-a5b6-4fd21e8dedac Version: $LATEST
2019-06-07T19:11:20.562Z	c793869b-ee49-115b-a5b6-4fd21e8dedac	INFO	ENVIRONMENT VARIABLES
{
  "AWS_LAMBDA_FUNCTION_VERSION": "$LATEST",
  "AWS_LAMBDA_LOG_GROUP_NAME": "/aws/lambda/my-function",
  "AWS_LAMBDA_LOG_STREAM_NAME": "2019/06/07/[$LATEST]e6f4a0c4241adcd70c262d34c0bbc85c",
  "AWS_EXECUTION_ENV": "AWS_Lambda_nodejs12.x",
  "AWS_LAMBDA_FUNCTION_NAME": "my-function",
  "PATH": "/var/lang/bin:/usr/local/bin:/usr/bin/:/bin:/opt/bin",
  "NODE_PATH": "/opt/nodejs/node10/node_modules:/opt/nodejs/node_modules:/var/runtime/node_modules",
  ...
}
2019-06-07T19:11:20.563Z	c793869b-ee49-115b-a5b6-4fd21e8dedac	INFO	EVENT
{
  "key": "value"
}
2019-06-07T19:11:20.564Z	c793869b-ee49-115b-a5b6-4fd21e8dedac	WARN	Event not processed.
END RequestId: c793869b-ee49-115b-a5b6-4fd21e8dedac
REPORT RequestId: c793869b-ee49-115b-a5b6-4fd21e8dedac	Duration: 128.83 ms	Billed Duration: 296 ms	Memory Size: 128 MB	Max Memory Used: 74 MB	Init Duration: 166.62 ms	XRAY TraceId: 1-5d9d007f-0a8c7fd02xmpl480aed55ef0	SegmentId: 3d752xmpl1bbe37e	Sampled: true
```

Runtime Node.js mencatat baris `START`, `END`, dan `REPORT` untuk setiap invokasi. Ini menambahkan stempel waktu, ID permintaan, dan tingkat log ke setiap entri yang dicatat oleh fungsi. Baris laporan memberikan perincian berikut.

**Laporkan bidang data baris**
+ **RequestId** – ID permintaan unik untuk invokasi.
+ **Durasi** – Jumlah waktu yang digunakan oleh metode handler fungsi Anda gunakan untuk memproses peristiwa.
+ **Durasi yang Ditagih** – Jumlah waktu yang ditagihkan untuk invokasi.
+ **Ukuran Memori** – Jumlah memori yang dialokasikan untuk fungsi.
+ **Memori Maks yang Digunakan** – Jumlah memori yang digunakan oleh fungsi. Saat pemanggilan berbagi lingkungan eksekusi, Lambda melaporkan memori maksimum yang digunakan di semua pemanggilan. Perilaku ini dapat menghasilkan nilai yang dilaporkan lebih tinggi dari yang diharapkan.
+ **Durasi Init** – Untuk permintaan pertama yang dilayani, lama waktu yang diperlukan runtime untuk memuat fungsi dan menjalankan kode di luar metode handler.
+ **XRAY TraceId** — Untuk permintaan yang dilacak, ID [AWS X-Ray jejak](services-xray.md).
+ **SegmentId** – Untuk permintaan yang dilacak, ID segmen X-Ray.
+ **Diambil Sampel** – Untuk permintaan yang dilacak, hasil pengambilan sampel.

Anda dapat melihat log di konsol Lambda, di konsol CloudWatch Log, atau dari baris perintah.

## Menggunakan kontrol logging lanjutan Lambda dengan Node.js
<a name="node-js-logging-advanced"></a>

Untuk memberi Anda kontrol lebih besar atas bagaimana log fungsi Anda ditangkap, diproses, dan digunakan, Anda dapat mengonfigurasi opsi logging berikut untuk runtime Node.js yang didukung:
+ **Format log** - pilih antara teks biasa dan format JSON terstruktur untuk log fungsi Anda
+ **Tingkat log** - untuk log dalam format JSON, pilih tingkat detail log yang dikirim Lambda ke CloudWatch Amazon, seperti ERROR, DEBUG, atau INFO
+ **Grup log** - pilih grup CloudWatch log fungsi Anda mengirim log ke

Untuk informasi selengkapnya tentang opsi pencatatan ini, dan petunjuk tentang cara mengonfigurasi fungsi Anda untuk menggunakannya, lihat[Mengkonfigurasi kontrol logging lanjutan untuk fungsi Lambda](monitoring-logs.md#monitoring-cloudwatchlogs-advanced).

Untuk menggunakan format log dan opsi tingkat log dengan fungsi Lambda Node.js Anda, lihat panduan di bagian berikut.

### Menggunakan log JSON terstruktur dengan Node.js
<a name="nodejs-logging-advanced-JSON"></a>

Jika Anda memilih JSON untuk format log fungsi Anda, Lambda akan mengirim output log menggunakan metode `console.trace` konsol`console.debug`,,,, `console.log` `console.info``console.error`, `console.warn` dan CloudWatch ke sebagai JSON terstruktur. Setiap objek log JSON berisi setidaknya empat pasangan nilai kunci dengan kunci berikut:
+ `"timestamp"`- waktu pesan log dihasilkan
+ `"level"`- tingkat log yang ditetapkan untuk pesan
+ `"message"`- isi pesan log
+ `"requestId"`- ID permintaan unik untuk pemanggilan fungsi

Bergantung pada metode logging yang digunakan fungsi Anda, objek JSON ini mungkin juga berisi pasangan kunci tambahan. Misalnya, jika fungsi Anda menggunakan `console` metode untuk mencatat objek kesalahan menggunakan beberapa argumen, objek JSON akan berisi pasangan nilai kunci tambahan dengan kunci`errorMessage`,`errorType`, dan`stackTrace`.

Jika kode Anda sudah menggunakan pustaka logging lain, seperti Powertools for AWS Lambda, untuk menghasilkan log terstruktur JSON, Anda tidak perlu membuat perubahan apa pun. Lambda tidak menyandikan dua kali log apa pun yang sudah dikodekan JSON, sehingga log aplikasi fungsi Anda akan terus ditangkap seperti sebelumnya.

Untuk informasi selengkapnya tentang penggunaan paket Powertools for AWS Lambda logging guna membuat log terstruktur JSON di runtime Node.js, lihat. [Log dan pantau fungsi TypeScript Lambda](typescript-logging.md)

#### Contoh keluaran log yang diformat JSON
<a name="nodejs-logging-examples"></a>

Contoh berikut menunjukkan bagaimana berbagai keluaran log yang dihasilkan menggunakan `console` metode dengan argumen tunggal dan ganda ditangkap di CloudWatch Log saat Anda menyetel format log fungsi Anda ke JSON.

Contoh pertama menggunakan `console.error` metode untuk menampilkan string sederhana.

**Example Kode pencatatan Node.js**  

```
export const handler = async (event) => {
  console.error("This is a warning message");
  ...
}
```

**Example Catatan log JSON**  

```
{
    "timestamp":"2025-11-01T00:21:51.358Z",
    "level":"ERROR",
    "message":"This is a warning message",
    "requestId":"93f25699-2cbf-4976-8f94-336a0aa98c6f"
}
```

Anda juga dapat menampilkan pesan log terstruktur yang lebih kompleks menggunakan argumen tunggal atau ganda dengan `console` metode. Dalam contoh berikutnya, Anda gunakan `console.log` untuk menampilkan dua pasangan nilai kunci menggunakan argumen tunggal. Perhatikan bahwa `"message"` bidang dalam objek JSON yang dikirim Lambda CloudWatch ke Log tidak dirangkai.

**Example Kode pencatatan Node.js**  

```
export const handler = async (event) => {
  console.log({data: 12.3, flag: false});
  ...
}
```

**Example Catatan log JSON**  

```
{
    "timestamp": "2025-12-08T23:21:04.664Z",
    "level": "INFO",
    "requestId": "405a4537-9226-4216-ac59-64381ec8654a",
    "message": {
        "data": 12.3,
        "flag": false
    }
}
```

Dalam contoh berikutnya, Anda kembali menggunakan `console.log` metode untuk membuat output log. Kali ini, metode ini mengambil dua argumen, peta yang berisi dua pasangan nilai kunci dan string pengidentifikasi. Perhatikan bahwa dalam kasus ini, karena Anda telah memberikan dua argumen, Lambda membuat stringifikasi bidang. `"message"`

**Example Kode pencatatan Node.js**  

```
export const handler = async (event) => {
  console.log('Some object - ', {data: 12.3, flag: false});
  ...
}
```

**Example Catatan log JSON**  

```
{
    "timestamp": "2025-12-08T23:21:04.664Z",
    "level": "INFO",
    "requestId": "405a4537-9226-4216-ac59-64381ec8654a",
    "message": "Some object -  { data: 12.3, flag: false }"
}
```

Lambda menetapkan output yang dihasilkan menggunakan INFO tingkat log`console.log`.

Contoh terakhir menunjukkan bagaimana objek kesalahan dapat output ke CloudWatch Log menggunakan `console` metode. Perhatikan bahwa ketika Anda mencatat objek kesalahan menggunakan beberapa argumen, Lambda menambahkan bidang`errorMessage`,`errorType`, dan `stackTrace` ke output log.

**Example Kode pencatatan Node.js**  

```
export const handler = async (event) => {
  let e1 = new ReferenceError("some reference error");
  let e2 = new SyntaxError("some syntax error");
  console.log(e1);
  console.log("errors logged - ", e1, e2);
};
```

**Example Catatan log JSON**  

```
{
    "timestamp": "2025-12-08T23:21:04.632Z",
    "level": "INFO",
    "requestId": "405a4537-9226-4216-ac59-64381ec8654a",
    "message": {
        "errorType": "ReferenceError",
        "errorMessage": "some reference error",
        "stackTrace": [
            "ReferenceError: some reference error",
            "    at Runtime.handler (file:///var/task/index.mjs:3:12)",
            "    at Runtime.handleOnceNonStreaming (file:///var/runtime/index.mjs:1173:29)"
        ]
    }
}

{
    "timestamp": "2025-12-08T23:21:04.646Z",
    "level": "INFO",
    "requestId": "405a4537-9226-4216-ac59-64381ec8654a",
    "message": "errors logged -  ReferenceError: some reference error\n    at Runtime.handler (file:///var/task/index.mjs:3:12)\n    at Runtime.handleOnceNonStreaming 
    (file:///var/runtime/index.mjs:1173:29) SyntaxError: some syntax error\n    at Runtime.handler (file:///var/task/index.mjs:4:12)\n    at Runtime.handleOnceNonStreaming 
    (file:///var/runtime/index.mjs:1173:29)",
    "errorType": "ReferenceError",
    "errorMessage": "some reference error",
    "stackTrace": [
        "ReferenceError: some reference error",
        "    at Runtime.handler (file:///var/task/index.mjs:3:12)",
        "    at Runtime.handleOnceNonStreaming (file:///var/runtime/index.mjs:1173:29)"
    ]
}
```

Saat mencatat beberapa jenis kesalahan, bidang tambahan`errorMessage`,`errorType`, dan `stackTrace` diekstraksi dari jenis kesalahan pertama yang diberikan ke `console` metode.

### Menggunakan pustaka klien format metrik tertanam (EMF) dengan log JSON terstruktur
<a name="nodejs-logging-advanced-emf"></a>

AWS menyediakan pustaka klien sumber terbuka untuk Node.js yang dapat Anda gunakan untuk membuat log [format metrik tertanam](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format_Libraries.html) (EMF). Jika Anda memiliki fungsi yang ada yang menggunakan pustaka ini dan Anda mengubah format log fungsi Anda ke JSON, CloudWatch mungkin tidak lagi mengenali metrik yang dipancarkan oleh kode Anda.

Jika kode Anda saat ini memancarkan log EMF secara langsung menggunakan `console.log` atau dengan menggunakan Powertools for AWS Lambda (TypeScript), juga tidak CloudWatch akan dapat mengurai ini jika Anda mengubah format log fungsi Anda menjadi JSON.

**penting**  
Untuk memastikan bahwa log EMF fungsi Anda terus diurai dengan benar CloudWatch, perbarui [EMF](https://www.npmjs.com/package/aws-embedded-metrics) dan [Powertools Anda untuk AWS Lambda](https://github.com/aws-powertools/powertools-lambda-typescript) pustaka ke versi terbaru. Jika beralih ke format log JSON, kami juga menyarankan Anda melakukan pengujian untuk memastikan kompatibilitas dengan metrik tertanam fungsi Anda. Jika kode Anda memancarkan log EMF secara langsung menggunakan`console.log`, ubah kode Anda untuk menampilkan metrik tersebut secara langsung `stdout` seperti yang ditunjukkan pada contoh kode berikut.

**Example kode yang memancarkan metrik tertanam ke `stdout`**  

```
process.stdout.write(JSON.stringify(
    {
        "_aws": {
            "Timestamp": Date.now(),
            "CloudWatchMetrics": [{
                "Namespace": "lambda-function-metrics",
                "Dimensions": [["functionVersion"]],
                "Metrics": [{
                    "Name": "time",
                    "Unit": "Milliseconds",
                    "StorageResolution": 60
                }]
            }]
        },
        "functionVersion": "$LATEST",
        "time": 100,
        "requestId": context.awsRequestId
    }
) + "\n")
```

### Menggunakan penyaringan tingkat log dengan Node.js
<a name="nodejs-logging-advanced-level"></a>

 AWS Lambda Untuk memfilter log aplikasi Anda sesuai dengan tingkat lognya, fungsi Anda harus menggunakan log berformat JSON. Anda dapat mencapai ini dengan dua cara:
+ Buat output log menggunakan metode konsol standar dan konfigurasikan fungsi Anda untuk menggunakan pemformatan log JSON. AWS Lambda kemudian memfilter output log Anda menggunakan pasangan nilai kunci “level” di objek JSON yang dijelaskan dalam. [Menggunakan log JSON terstruktur dengan Node.js](#nodejs-logging-advanced-JSON) Untuk mempelajari cara mengonfigurasi format log fungsi Anda, lihat[Mengkonfigurasi kontrol logging lanjutan untuk fungsi Lambda](monitoring-logs.md#monitoring-cloudwatchlogs-advanced).
+ Gunakan pustaka atau metode logging lain untuk membuat log terstruktur JSON dalam kode Anda yang menyertakan pasangan nilai kunci “level” yang menentukan tingkat keluaran log. Misalnya, Anda dapat menggunakan Powertools AWS Lambda untuk menghasilkan output log terstruktur JSON dari kode Anda. Lihat [Log dan pantau fungsi TypeScript Lambda](typescript-logging.md) untuk mempelajari lebih lanjut tentang menggunakan Powertools dengan runtime Node.js.

  Agar Lambda dapat memfilter log fungsi Anda, Anda juga harus menyertakan pasangan nilai `"timestamp"` kunci dalam keluaran log JSON Anda. Waktu harus ditentukan dalam format stempel waktu [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) yang valid. Jika Anda tidak menyediakan stempel waktu yang valid, Lambda akan menetapkan log INFO level dan menambahkan stempel waktu untuk Anda.

Ketika Anda mengonfigurasi fungsi Anda untuk menggunakan pemfilteran tingkat log, Anda memilih tingkat log yang ingin Anda kirim AWS Lambda ke CloudWatch Log dari opsi berikut:


| Tingkat log | Penggunaan standar | 
| --- | --- | 
| TRACE (paling detail) | Informasi paling halus yang digunakan untuk melacak jalur eksekusi kode Anda | 
| AWAKUTU | Informasi terperinci untuk debugging sistem | 
| INFO | Pesan yang merekam operasi normal fungsi Anda | 
| PERINGATAN | Pesan tentang potensi kesalahan yang dapat menyebabkan perilaku tak terduga jika tidak ditangani | 
| ERROR | Pesan tentang masalah yang mencegah kode berfungsi seperti yang diharapkan | 
| FATAL (paling detail) | Pesan tentang kesalahan serius yang menyebabkan aplikasi berhenti berfungsi | 

Lambda mengirimkan log dari level yang dipilih dan lebih rendah ke. CloudWatch Misalnya, jika Anda mengonfigurasi level log WARN, Lambda akan mengirim log yang sesuai dengan level WARN, ERROR, dan FATAL.

## Melihat log di konsol Lambda
<a name="nodejs-logging-console"></a>

Anda dapat menggunakan konsol Lambda untuk melihat output log setelah Anda memanggil fungsi Lambda.

Jika kode Anda dapat diuji dari editor **Kode** tertanam, Anda akan menemukan log dalam **hasil eksekusi**. Saat Anda menggunakan fitur pengujian konsol untuk menjalankan fungsi, Anda akan menemukan **Keluaran Log** di bagian **Detail**.

## Melihat log di CloudWatch konsol
<a name="nodejs-logging-cwconsole"></a>

Anda dapat menggunakan CloudWatch konsol Amazon untuk melihat log untuk semua pemanggilan fungsi Lambda.

**Untuk melihat log di CloudWatch konsol**

1. Buka [halaman Grup log](https://console.aws.amazon.com/cloudwatch/home?#logs:) di CloudWatch konsol.

1. Pilih grup log untuk fungsi Anda (**/aws/lambda/ *your-function-name***).

1. Pilih pengaliran log.

Setiap aliran log sesuai dengan [instans fungsi Anda](lambda-runtime-environment.md). Aliran log muncul saat Anda memperbarui fungsi Lambda, dan saat instance tambahan dibuat untuk menangani pemanggilan bersamaan. Untuk menemukan log untuk pemanggilan tertentu, kami sarankan untuk menginstrumentasi fungsi Anda dengan. AWS X-Ray X-Ray mencatat detail tentang permintaan dan pengaliran log di jejak.

## Melihat log menggunakan AWS Command Line Interface (AWS CLI)
<a name="nodejs-logging-cli"></a>

 AWS CLI Ini adalah alat sumber terbuka yang memungkinkan Anda berinteraksi dengan AWS layanan menggunakan perintah di shell baris perintah Anda. Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki [AWS CLI versi 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

Anda dapat menggunakan [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) untuk mengambil log untuk invokasi menggunakan opsi perintah `--log-type`. Respons berisi bidang `LogResult` yang memuat hingga 4 KB log berkode base64 dari invokasi.

**Example mengambil ID log**  
Contoh berikut menunjukkan cara mengambil *ID log* dari `LogResult` untuk fungsi bernama `my-function`.  

```
aws lambda invoke --function-name my-function out --log-type Tail
```
Anda akan melihat output berikut:  

```
{
    "StatusCode": 200,
    "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...",
    "ExecutedVersion": "$LATEST"
}
```

**Example mendekode log**  
Pada prompt perintah yang sama, gunakan utilitas `base64` untuk mendekodekan log. Contoh berikut menunjukkan cara mengambil log berkode base64 untuk `my-function`.  

```
aws lambda invoke --function-name my-function out --log-type Tail \
--query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode
```
**cli-binary-format**Opsi ini diperlukan jika Anda menggunakan AWS CLI versi 2. Untuk menjadikan ini pengaturan default, jalankan`aws configure set cli-binary-format raw-in-base64-out`. Untuk informasi selengkapnya, lihat [opsi baris perintah global yang AWS CLI didukung](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) di *Panduan AWS Command Line Interface Pengguna untuk Versi 2*.  
Anda akan melihat output berikut:  

```
START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST
"AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib",
END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8
REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8  Duration: 79.67 ms      Billed Duration: 80 ms         Memory Size: 128 MB     Max Memory Used: 73 MB
```
Utilitas `base64` tersedia di Linux, macOS, dan [Ubuntu pada Windows](https://docs.microsoft.com/en-us/windows/wsl/install-win10). Pengguna macOS mungkin harus menggunakan `base64 -D`.

**Example Skrip get-logs.sh**  
Pada prompt perintah yang sama, gunakan script berikut untuk mengunduh lima peristiwa log terakhir. Skrip menggunakan `sed` untuk menghapus kutipan dari file output, dan akan tidur selama 15 detik untuk memberikan waktu agar log tersedia. Output mencakup respons dari Lambda dan output dari perintah `get-log-events`.   
Salin konten dari contoh kode berikut dan simpan dalam direktori proyek Lambda Anda sebagai `get-logs.sh`.  
**cli-binary-format**Opsi ini diperlukan jika Anda menggunakan AWS CLI versi 2. Untuk menjadikan ini pengaturan default, jalankan`aws configure set cli-binary-format raw-in-base64-out`. Untuk informasi selengkapnya, lihat [opsi baris perintah global yang AWS CLI didukung](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) di *Panduan AWS Command Line Interface Pengguna untuk Versi 2*.  

```
#!/bin/bash
aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key": "value"}' out
sed -i'' -e 's/"//g' out
sleep 15
aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name stream1 --limit 5
```

**Example macOS dan Linux (khusus)**  
Pada prompt perintah yang sama, pengguna macOS dan Linux mungkin perlu menjalankan perintah berikut untuk memastikan skrip dapat dijalankan.  

```
chmod -R 755 get-logs.sh
```

**Example mengambil lima log acara terakhir**  
Pada prompt perintah yang sama, gunakan skrip berikut untuk mendapatkan lima log acara terakhir.  

```
./get-logs.sh
```
Anda akan melihat output berikut:  

```
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
{
    "events": [
        {
            "timestamp": 1559763003171,
            "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n",
            "ingestionTime": 1559763003309
        },
        {
            "timestamp": 1559763003173,
            "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r  \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003173,
            "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r  \"key\": \"value\"\r}\n",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003218,
            "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003218,
            "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n",
            "ingestionTime": 1559763018353
        }
    ],
    "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795",
    "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080"
}
```

## Menghapus log
<a name="nodejs-logging-delete"></a>

Grup log tidak terhapus secara otomatis ketika Anda menghapus suatu fungsi. Untuk menghindari penyimpanan log secara tidak terbatas, hapus kelompok log, atau [lakukan konfigurasi periode penyimpanan](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#SettingLogRetention), yang setelahnya log akan dihapus secara otomatis.

# Menginstrumentasi kode Node.js di AWS Lambda
<a name="nodejs-tracing"></a>

Lambda terintegrasi dengan AWS X-Ray untuk membantu Anda melacak, men-debug, dan mengoptimalkan aplikasi Lambda. Anda dapat menggunakan X-Ray untuk melacak permintaan saat melintasi sumber daya dalam aplikasi Anda, yang mungkin termasuk fungsi Lambda dan layanan lainnya. AWS 

Untuk mengirim data penelusuran ke X-Ray, Anda dapat menggunakan salah satu dari dua pustaka SDK:
+ [AWS Distro for OpenTelemetry (ADOT)](https://aws.amazon.com/otel) — Distribusi SDK () yang aman, siap produksi, dan AWS didukung. OpenTelemetry OTel
+ [AWS X-Ray SDK for Node.js](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-nodejs.html)SDK untuk menghasilkan dan mengirim data jejak ke X-Ray.

Masing-masing SDKs menawarkan cara untuk mengirim data telemetri Anda ke layanan X-Ray. Anda kemudian dapat menggunakan X-Ray untuk melihat, memfilter, dan mendapatkan wawasan tentang metrik kinerja aplikasi Anda untuk mengidentifikasi masalah dan peluang pengoptimalan.

**penting**  
X-Ray dan Powertools untuk AWS Lambda SDKs adalah bagian dari solusi instrumentasi terintegrasi yang ditawarkan oleh. AWS Lapisan Lambda ADOT adalah bagian dari standar industri untuk melacak instrumentasi yang mengumpulkan lebih banyak data secara umum, tetapi mungkin tidak cocok untuk semua kasus penggunaan. Anda dapat menerapkan end-to-end penelusuran di X-Ray menggunakan salah satu solusi. Untuk mempelajari lebih lanjut tentang memilih di antara mereka, lihat [Memilih antara AWS Distro untuk Telemetri Terbuka dan](https://docs.aws.amazon.com/xray/latest/devguide/xray-instrumenting-your-app.html#xray-instrumenting-choosing) X-Ray. SDKs

**Topics**
+ [

## Menggunakan ADOT untuk menginstruksikan fungsi Node.js Anda
](#nodejs-adot)
+ [

## Menggunakan X-Ray SDK untuk menginstruksikan fungsi Node.js
](#nodejs-xray-sdk)
+ [

## Mengaktifkan penelusuran dengan konsol Lambda
](#nodejs-tracing-console)
+ [

## Mengaktifkan penelusuran dengan Lambda API
](#nodejs-tracing-api)
+ [

## Mengaktifkan penelusuran dengan CloudFormation
](#nodejs-tracing-cloudformation)
+ [

## Menafsirkan jejak X-Ray
](#nodejs-tracing-interpretation)
+ [

## Menyimpan dependensi runtime dalam lapisan (X-Ray SDK)
](#nodejs-tracing-layers)

## Menggunakan ADOT untuk menginstruksikan fungsi Node.js Anda
<a name="nodejs-adot"></a>

ADOT menyediakan lapisan [Lambda](chapter-layers.md) yang dikelola sepenuhnya yang mengemas semua yang Anda butuhkan untuk mengumpulkan data telemetri menggunakan SDK. OTel Dengan menggunakan lapisan ini, Anda dapat menginstruksikan fungsi Lambda Anda tanpa harus memodifikasi kode fungsi apa pun. Anda juga dapat mengonfigurasi lapisan Anda untuk melakukan inisialisasi kustom. OTel Untuk informasi selengkapnya, lihat [Konfigurasi khusus untuk Kolektor ADOT di Lambda](https://aws-otel.github.io/docs/getting-started/lambda#custom-configuration-for-the-adot-collector-on-lambda) dalam dokumentasi ADOT.

Untuk runtime Node.js, Anda dapat menambahkan **layer Lambda AWS terkelola untuk ADOT Javascript untuk** menginstruksikan fungsi Anda secara otomatis. Untuk petunjuk rinci tentang cara menambahkan layer ini, lihat [AWS Distro untuk OpenTelemetry Lambda JavaScript Support untuk](https://aws-otel.github.io/docs/getting-started/lambda/lambda-js) dalam dokumentasi ADOT.

## Menggunakan X-Ray SDK untuk menginstruksikan fungsi Node.js
<a name="nodejs-xray-sdk"></a>

Untuk merekam detail tentang panggilan yang dilakukan oleh fungsi Lambda Anda ke sumber daya lain dalam aplikasi Anda, Anda juga dapat menggunakan. AWS X-Ray SDK for Node.js Untuk mendapatkan SDK, tambahkan paket `aws-xray-sdk-core` ke dependensi aplikasi Anda.

**Example [kosong-nodejs/package.json](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-nodejs/package.json)**  

```
{
  "name": "blank-nodejs",
  "version": "1.0.0",
  "private": true,
  "devDependencies": {
    "jest": "29.7.0"
  },
  "dependencies": {
    "@aws-sdk/client-lambda": "3.345.0",
    "aws-xray-sdk-core": "3.5.3"
  },
  "scripts": {
    "test": "jest"
  }
}
```

Untuk AWS menginstrumentasikan klien SDK di [AWS SDK untuk JavaScript v3](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/welcome.html), bungkus instance klien dengan metode. `captureAWSv3Client`

**Example [blank- nodejs/function/index .js](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-nodejs/function/index.js) - Menelusuri klien SDK AWS**  

```
const AWSXRay = require('aws-xray-sdk-core');
const { LambdaClient, GetAccountSettingsCommand } = require('@aws-sdk/client-lambda');

// Create client outside of handler to reuse
const lambda = AWSXRay.captureAWSv3Client(new LambdaClient());

// Handler
exports.handler = async function(event, context) {
    event.Records.forEach(record => {
  ...
```

Runtime Lambda menetapkan beberapa variabel lingkungan untuk mengonfigurasi X-Ray SDK. Misalnya, Lambda disetel `AWS_XRAY_CONTEXT_MISSING` `LOG_ERROR` untuk menghindari kesalahan runtime dari X-Ray SDK. Untuk menetapkan strategi yang hilang dalam konteks khusus, timpa variabel lingkungan dalam konfigurasi fungsi Anda agar tidak memiliki nilai, lalu Anda dapat menetapkan konteks yang tidak memiliki strategi yang terprogram.

**Example Kode inisialisasi contoh**  

```
const AWSXRay = require('aws-xray-sdk-core');

// Configure the context missing strategy to do nothing
AWSXRay.setContextMissingStrategy(() => {});
```

Untuk informasi selengkapnya, lihat [Bekerja dengan variabel lingkungan Lambda](configuration-envvars.md).

Setelah Anda menambahkan dependensi yang benar dan membuat perubahan kode yang diperlukan, aktifkan penelusuran dalam konfigurasi fungsi Anda melalui konsol Lambda atau API.

## Mengaktifkan penelusuran dengan konsol Lambda
<a name="nodejs-tracing-console"></a>

Untuk mengaktifkan penelusuran aktif pada fungsi Lambda Anda dengan konsol, ikuti langkah-langkah berikut:

**Untuk mengaktifkan penelusuran aktif**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi.

1. Pilih **Konfigurasi** dan kemudian pilih **Alat Pemantauan dan operasi**.

1. Di bawah **Alat pemantauan tambahan**, pilih **Edit**.

1. Di bawah **Sinyal CloudWatch Aplikasi dan AWS X-Ray**, pilih **Aktifkan** untuk **jejak layanan Lambda**.

1. Pilih **Simpan**.

## Mengaktifkan penelusuran dengan Lambda API
<a name="nodejs-tracing-api"></a>

Konfigurasikan penelusuran pada fungsi Lambda Anda dengan AWS CLI AWS atau SDK, gunakan operasi API berikut:
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
+ [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html)
+ [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html)

Contoh AWS CLI perintah berikut memungkinkan penelusuran aktif pada fungsi bernama **my-function**.

```
aws lambda update-function-configuration --function-name my-function \
--tracing-config Mode=Active
```

Mode penelusuran adalah bagian dari konfigurasi khusus versi saat Anda memublikasikan versi fungsi Anda. Anda tidak dapat mengubah mode pelacakan pada versi yang telah diterbitkan.

## Mengaktifkan penelusuran dengan CloudFormation
<a name="nodejs-tracing-cloudformation"></a>

Untuk mengaktifkan penelusuran pada `AWS::Lambda::Function` sumber daya dalam CloudFormation templat, gunakan `TracingConfig` properti.

**Example [function-inline.yml](https://github.com/awsdocs/aws-lambda-developer-guide/blob/master/templates/function-inline.yml) – Konfigurasi pelacakan**  

```
Resources:
  function:
    Type: [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)
    Properties:
      TracingConfig:
        Mode: Active
      ...
```

Untuk sumber `AWS::Serverless::Function` daya AWS Serverless Application Model (AWS SAM), gunakan `Tracing` properti.

**Example [template.yml](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-nodejs/template.yml) – Konfigurasi pelacakan**  

```
Resources:
  function:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    Properties:
      Tracing: Active
      ...
```

## Menafsirkan jejak X-Ray
<a name="nodejs-tracing-interpretation"></a>

Fungsi Anda memerlukan izin untuk mengunggah data jejak ke X-Ray. [Saat Anda mengaktifkan penelusuran di konsol Lambda, Lambda menambahkan izin yang diperlukan ke peran eksekusi fungsi Anda.](lambda-intro-execution-role.md) Atau, tambahkan kebijakan [AWSXRayDaemonWriteAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess) ke peran eksekusi.

Setelah mengonfigurasi penelusuran aktif, Anda dapat mengamati permintaan tertentu melalui aplikasi Anda. [Grafik layanan X-Ray](https://docs.aws.amazon.com/xray/latest/devguide/aws-xray.html#xray-concepts-servicegraph) menunjukkan informasi tentang aplikasi Anda dan semua komponennya. Contoh berikut menunjukkan aplikasi dengan dua fungsi. Fungsi utama memproses kejadian dan terkadang mengembalikan kesalahan. Fungsi kedua di bagian atas memproses kesalahan yang muncul di grup log pertama dan menggunakan AWS SDK untuk memanggil X-Ray, Amazon Simple Storage Service (Amazon S3), dan Amazon Logs. CloudWatch 

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/sample-errorprocessor-servicemap.png)


X-Ray tidak melacak semua permintaan ke aplikasi Anda. X-Ray menerapkan algoritma pengambilan sampel untuk memastikan bahwa penelusuran efisien, sambil tetap memberikan sampel yang representatif dari semua permintaan. Tingkat pengambilan sampel adalah 1 permintaan per detik dan 5 persen dari permintaan tambahan. Anda tidak dapat mengonfigurasi laju pengambilan sampel X-Ray untuk fungsi Anda.

Di X-Ray, *jejak* merekam informasi tentang permintaan yang diproses oleh satu atau beberapa *layanan*. Lambda mencatat 2 segmen per jejak, yang menciptakan dua node pada grafik layanan. Gambar berikut menyoroti dua node ini:

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/xray-servicemap-function.png)


Node pertama di sebelah kiri mewakili layanan Lambda, yang menerima permintaan pemanggilan. Node kedua mewakili fungsi Lambda spesifik Anda. Contoh berikut menunjukkan jejak dengan dua segmen ini. Keduanya bernama **fungsi saya**, tetapi yang satu memiliki asal `AWS::Lambda` dan yang lainnya memiliki asal usul. `AWS::Lambda::Function` Jika `AWS::Lambda` segmen menunjukkan kesalahan, layanan Lambda mengalami masalah. Jika `AWS::Lambda::Function` segmen menunjukkan kesalahan, fungsi Anda mengalami masalah.

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/V2_sandbox_images/my-function-2-v1.png)


Contoh ini memperluas `AWS::Lambda::Function` segmen untuk menunjukkan tiga subsegmennya.

**catatan**  
AWS saat ini menerapkan perubahan pada layanan Lambda. Karena perubahan ini, Anda mungkin melihat perbedaan kecil antara struktur dan konten pesan log sistem dan segmen jejak yang dipancarkan oleh fungsi Lambda yang berbeda di Anda. Akun AWS  
Contoh jejak yang ditunjukkan di sini menggambarkan segmen fungsi gaya lama. Perbedaan antara segmen gaya lama dan baru dijelaskan dalam paragraf berikut.  
Perubahan ini akan diterapkan selama beberapa minggu mendatang, dan semua fungsi di semua Wilayah AWS kecuali China GovCloud dan wilayah akan bertransisi untuk menggunakan pesan log format baru dan segmen pelacakan.

Segmen fungsi gaya lama berisi subsegmen berikut:
+ **Inisialisasi** – Mewakili waktu yang dihabiskan untuk memuat fungsi dan menjalankan [kode inisialisasi](foundation-progmodel.md). Subsegmen ini hanya muncul untuk peristiwa pertama yang diproses oleh setiap instance fungsi Anda.
+ **Doa** - Merupakan waktu yang dihabiskan untuk menjalankan kode handler Anda.
+ **Overhead** - Merupakan waktu yang dihabiskan runtime Lambda untuk mempersiapkan diri untuk menangani acara berikutnya.

Segmen fungsi gaya baru tidak berisi subsegmen. `Invocation` Sebagai gantinya, subsegmen pelanggan dilampirkan langsung ke segmen fungsi. Untuk informasi lebih lanjut tentang struktur segmen fungsi gaya lama dan baru, lihat. [Memahami jejak X-Ray](services-xray.md#services-xray-traces)

Anda juga dapat melakukan instrumentasi klien HTTP, merekam kueri SQL, dan membuat subsegmen khusus dengan anotasi dan metadata. Untuk informasi selengkapnya, lihat [AWS X-Ray SDK for Node.js](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-nodejs.html)di *Panduan AWS X-Ray Pengembang*.

**Harga**  
Anda dapat menggunakan penelusuran X-Ray secara gratis setiap bulan hingga batas tertentu sebagai bagian dari Tingkat AWS Gratis. Di luar ambang batas itu, X-Ray mengenakan biaya untuk penyimpanan dan pengambilan jejak. Untuk informasi selengkapnya, lihat [harga AWS X-Ray](https://aws.amazon.com/xray/pricing/).

## Menyimpan dependensi runtime dalam lapisan (X-Ray SDK)
<a name="nodejs-tracing-layers"></a>

Jika Anda menggunakan X-Ray SDK untuk menginstruksikan klien AWS SDK kode fungsi Anda, paket penerapan Anda bisa menjadi cukup besar. [Untuk menghindari mengunggah dependensi runtime setiap kali Anda memperbarui kode fungsi, paketkan X-Ray SDK di lapisan Lambda.](chapter-layers.md)

Contoh berikut menunjukkan `AWS::Serverless::LayerVersion` sumber daya yang menyimpan file AWS X-Ray SDK for Node.js.

**Example [template.yml](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-nodejs/template.yml) – Lapisan dependensi**  

```
Resources:
  function:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    Properties:
      CodeUri: function/.
      Tracing: Active
      Layers:
        - !Ref libs
      ...
  libs:
    Type: [AWS::Serverless::LayerVersion](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-layerversion.html)
    Properties:
      LayerName: blank-nodejs-lib
      Description: Dependencies for the blank sample app.
      ContentUri: lib/.
      CompatibleRuntimes:
        - nodejs24.x
```

Dengan konfigurasi ini, Anda memperbarui lapisan pustaka hanya jika Anda mengubah dependensi runtime Anda. Karena paket penerapan fungsi hanya berisi kode Anda, ini dapat membantu mengurangi waktu upload.

Membuat lapisan untuk dependensi memerlukan perubahan build untuk membuat arsip lapisan sebelum deployment. Untuk contoh pekerjaan, lihat contoh aplikasi [blank-nodejs](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-nodejs).