

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

# Membangun fungsi Lambda dengan TypeScript
<a name="lambda-typescript"></a>

Anda dapat menggunakan runtime Node.js untuk menjalankan TypeScript kode. AWS Lambda Karena Node.js tidak menjalankan TypeScript kode secara asli, Anda harus terlebih dahulu mengubah TypeScript kode Anda menjadi. JavaScript Kemudian, gunakan JavaScript file untuk menyebarkan kode fungsi Anda ke Lambda. Kode Anda berjalan di lingkungan yang menyertakan AWS SDK for JavaScript, dengan kredensyal 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](lambda-nodejs.md#nodejs-sdk-included)

Lambda mendukung runtime Node.js berikut.


| 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   | 

**Topics**
+ [Menyiapkan lingkungan TypeScript pengembangan](#typescript-dev)
+ [Jenis definisi untuk Lambda](#typescript-type-definitions)
+ [Tentukan penangan fungsi Lambda di TypeScript](typescript-handler.md)
+ [Terapkan TypeScript kode yang ditranspilasikan di Lambda dengan arsip file.zip](typescript-package.md)
+ [Terapkan TypeScript kode yang ditranspilasikan di Lambda dengan gambar kontainer](typescript-image.md)
+ [Menggunakan objek konteks Lambda untuk mengambil informasi fungsi TypeScript](typescript-context.md)
+ [Log dan pantau fungsi TypeScript Lambda](typescript-logging.md)
+ [Menelusuri TypeScript kode di AWS Lambda](typescript-tracing.md)

## Menyiapkan lingkungan TypeScript pengembangan
<a name="typescript-dev"></a>

Gunakan lingkungan pengembangan terintegrasi lokal (IDE) atau editor teks untuk menulis kode TypeScript fungsi Anda. Anda tidak dapat membuat TypeScript kode di konsol Lambda.

Anda dapat menggunakan [esbuild](https://esbuild.github.io/) atau TypeScript compiler (`tsc`) Microsoft untuk mentranspile kode Anda TypeScript ke dalam. JavaScript The [AWS Serverless Application Model (AWS SAM)](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started.html) dan [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html)keduanya menggunakan esbuild.

Saat menggunakan esbuild, pertimbangkan hal berikut:
+ Ada beberapa [TypeScript peringatan](https://esbuild.github.io/content-types/#typescript-caveats).
+ Anda harus mengonfigurasi pengaturan TypeScript transpilasi agar sesuai dengan runtime Node.js yang akan Anda gunakan. Untuk informasi selengkapnya, lihat [Target](https://esbuild.github.io/api/#target) dalam dokumentasi esbuild. [Untuk contoh file **tsconfig.json** yang menunjukkan cara menargetkan versi Node.js tertentu yang didukung oleh Lambda, lihat repositori. TypeScript GitHub ](https://github.com/tsconfig/bases/blob/main/bases/node14.json)
+ esbuild tidak melakukan pemeriksaan tipe. Untuk memeriksa jenis, gunakan `tsc` kompiler. Jalankan `tsc -noEmit` atau tambahkan `"noEmit"` parameter ke file **tsconfig.json** Anda, seperti yang ditunjukkan pada contoh berikut. Ini mengkonfigurasi `tsc` untuk tidak memancarkan file JavaScript . Setelah memeriksa jenis, gunakan esbuild untuk mengonversi TypeScript file menjadi JavaScript.

**Example tsconfig.json**  

```
 {
  "compilerOptions": {
    "target": "es2020",
    "strict": true,
    "preserveConstEnums": true,
    "noEmit": true,
    "sourceMap": false,
    "module":"commonjs",
    "moduleResolution":"node",
    "esModuleInterop": true, 
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true, 
    "isolatedModules": true, 
  },
  "exclude": ["node_modules", "**/*.test.ts"]
}
```

## Jenis definisi untuk Lambda
<a name="typescript-type-definitions"></a>

Paket [@types /aws-lambda](https://www.npmjs.com/package/@types/aws-lambda) memberikan definisi tipe untuk fungsi Lambda. Instal paket ini ketika fungsi Anda menggunakan salah satu dari berikut ini:
+ Sumber AWS acara umum, seperti:
  + `APIGatewayProxyEvent`: Untuk [integrasi proxy Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html) 
  + `SNSEvent`: Untuk [pemberitahuan Layanan Pemberitahuan Sederhana Amazon](with-sns.md)
  + `SQSEvent`: Untuk pesan [Layanan Antrian Sederhana Amazon](with-sqs.md)
  + `S3Event`: Untuk peristiwa [pemicu S3](with-s3.md)
  + `DynamoDBStreamEvent`: Untuk [Amazon DynamoDB Streams](with-ddb.md)
+ [Objek Konteks Lambda](typescript-context.md)
+ Pola [handler callback](typescript-handler.md#typescript-handler-callback)

Untuk menambahkan definisi tipe Lambda ke fungsi Anda, instal `@types/aws-lambda` sebagai dependensi pengembangan:

```
npm install -D @types/aws-lambda
```

Kemudian, impor jenis dari`aws-lambda`:

```
import { Context, S3Event, APIGatewayProxyEvent } from 'aws-lambda';

export const handler = async (event: S3Event, context: Context) => {
    // Function code
};
```

`import ... from 'aws-lambda'`Pernyataan tersebut mengimpor definisi tipe. Itu tidak mengimpor paket `aws-lambda` npm, yang merupakan alat pihak ketiga yang tidak terkait. Untuk informasi selengkapnya, lihat [aws-lambda](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/aws-lambda) di repositori. DefinitelyTyped GitHub 

**catatan**  
Anda tidak memerlukan [@types /aws-lambda](https://www.npmjs.com/package/@types/aws-lambda) saat menggunakan definisi tipe kustom Anda sendiri. Untuk fungsi contoh yang mendefinisikan jenisnya sendiri untuk objek peristiwa, lihat[Contoh kode TypeScript fungsi Lambda](typescript-handler.md#typescript-example-code).

# Tentukan penangan fungsi Lambda di TypeScript
<a name="typescript-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 TypeScript, termasuk opsi untuk penyiapan proyek, konvensi penamaan, dan praktik terbaik. Halaman ini juga menyertakan contoh fungsi TypeScript Lambda 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 [Terapkan TypeScript kode yang ditranspilasikan di Lambda dengan arsip file.zip](typescript-package.md) atau[Terapkan TypeScript kode yang ditranspilasikan di Lambda dengan gambar kontainer](typescript-image.md).

**Topics**
+ [Menyiapkan TypeScript proyek Anda](#typescript-handler-setup)
+ [Contoh kode TypeScript fungsi Lambda](#typescript-example-code)
+ [Modul CommonJS dan ES](#typescript-commonjs-es-modules)
+ [Inisialisasi Node.js](#typescript-initialization)
+ [Konvensi penamaan handler](#typescript-handler-naming)
+ [Mendefinisikan dan mengakses objek peristiwa masukan](#typescript-example-input)
+ [Pola handler yang valid untuk fungsi TypeScript](#typescript-handler-signatures)
+ [Menggunakan SDK untuk JavaScript v3 di handler Anda](#typescript-example-sdk-usage)
+ [Mengakses variabel lingkungan](#typescript-example-envvars)
+ [Menggunakan status global](#typescript-handler-state)
+ [Praktik terbaik kode untuk fungsi TypeScript Lambda](#typescript-best-practices)

## Menyiapkan TypeScript proyek Anda
<a name="typescript-handler-setup"></a>

Gunakan lingkungan pengembangan terintegrasi lokal (IDE) atau editor teks untuk menulis kode TypeScript fungsi Anda. Anda tidak dapat membuat TypeScript kode di konsol Lambda.

Ada beberapa cara untuk menginisialisasi proyek TypeScript Lambda. Misalnya, Anda dapat membuat proyek menggunakan`npm`, membuat [AWS SAM aplikasi](typescript-package.md#aws-sam-ts), atau membuat [AWS CDK aplikasi](typescript-package.md#aws-cdk-ts). Untuk membuat proyek menggunakan`npm`:

```
npm init
```

Kode fungsi Anda berada dalam `.ts` file, yang Anda transpilasikan menjadi JavaScript file pada waktu pembuatan. Anda dapat menggunakan [esbuild](https://esbuild.github.io/) atau TypeScript compiler (`tsc`) Microsoft untuk mentranspile kode Anda TypeScript ke dalam. JavaScript Untuk menggunakan esbuild, tambahkan sebagai dependensi pengembangan:

```
npm install -D esbuild
```

Proyek fungsi TypeScript Lambda yang khas mengikuti struktur umum ini:

```
/project-root
  ├── index.ts - Contains main handler
  ├── dist/ - Contains compiled JavaScript
  ├── package.json - Project metadata and dependencies
  ├── package-lock.json - Dependency lock file
  ├── tsconfig.json - TypeScript configuration
  └── node_modules/ - Installed dependencies
```

## Contoh kode TypeScript fungsi Lambda
<a name="typescript-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. Contoh ini mendefinisikan jenis acara kustom (`OrderEvent`). Untuk mempelajari cara mengimpor definisi tipe untuk sumber AWS peristiwa, lihat [Definisi jenis untuk Lambda](lambda-typescript.md#typescript-type-definitions).

**catatan**  
Contoh ini menggunakan penangan modul ES. Lambda mendukung modul ES dan penangan CommonJS. Untuk informasi selengkapnya, lihat [Modul CommonJS dan ES](nodejs-handler.md#nodejs-commonjs-es-modules).

**Example index.ts fungsi Lambda**  

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

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

// Define the shape of the input event
type OrderEvent = {
    order_id: string;
    amount: number;
    item: string;
}

/**
 * Lambda handler for processing orders and storing receipts in S3.
 */
export const handler = async (event: OrderEvent): Promise<string> => {
    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 instanceof Error ? error.message : 'Unknown error'}`);
        throw error;
    }
};

/**
 * Helper function to upload receipt to S3
 */
async function uploadReceiptToS3(bucketName: string, key: string, receiptContent: string): Promise<void> {
    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 instanceof Error ? error.message : 'Unknown error'}`);
    }
}
```

`index.ts`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.
+ `type OrderEvent`: Mendefinisikan struktur peristiwa input yang diharapkan.
+ `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="typescript-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.](#typescript-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.

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

Node.js menggunakan I/O model non-blocking yang mendukung operasi asinkron 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 antrian 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 nol 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="typescript-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="typescript-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 TypeScript, Anda dapat menentukan bentuk peristiwa input menggunakan tipe atau antarmuka. Dalam contoh ini, kita mendefinisikan struktur acara menggunakan tipe:

```
type OrderEvent = {
    order_id: string;
    amount: number;
    item: string;
}
```

Setelah Anda menentukan jenis atau antarmuka, gunakan itu dalam tanda tangan handler Anda untuk memastikan keamanan tipe:

```
export const handler = async (event: OrderEvent): Promise<string> => {
```

Selama kompilasi, TypeScript memvalidasi bahwa objek acara berisi bidang wajib dengan tipe yang benar. Misalnya, TypeScript kompiler melaporkan kesalahan jika Anda mencoba menggunakan `event.order_id` sebagai angka atau `event.amount` sebagai string.

## Pola handler yang valid untuk fungsi TypeScript
<a name="typescript-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.

Contoh di bagian ini menggunakan `S3Event` tipe. Namun, Anda dapat menggunakan jenis AWS acara lain dalam paket [@types /aws-lambda](https://www.npmjs.com/package/@types/aws-lambda), atau menentukan jenis acara Anda sendiri. Untuk menggunakan tipe dari@types/aws-lambda:

1. Tambahkan @types/aws-lambda paket sebagai dependensi pengembangan:

   ```
   npm install -D @types/aws-lambda
   ```

1. Impor jenis yang Anda butuhkan, seperti`Context`,`S3Event`, atau`Callback`.

### penangan fungsi async (disarankan)
<a name="typescript-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 TypeScript](typescript-context.md).

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

```
export const handler = async (event: S3Event): Promise<void> => { };
```

```
export const handler = async (event: S3Event, context: Context): Promise<void> => { };
```

**catatan**  
Saat memproses array item secara asinkron, pastikan untuk menggunakan await with `Promise.all` untuk memastikan semua operasi selesai. Metode seperti `forEach` jangan menunggu panggilan balik asinkron selesai. Untuk informasi selengkapnya, lihat [Array.prototype.forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) () di dokumentasi Mozilla.

### Penangan fungsi sinkron
<a name="typescript-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: S3Event): void => { };
```

```
export const handler = (event: S3Event, context: Context): void => { };
```

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

Lambda mendukung streaming respons dengan Node.js. Penangan fungsi streaming respons menggunakan dekorator AWSLAMBDA.streamifyResponse () dan mengambil 3 parameter: event, responseStream, dan konteks. Tanda tangan fungsi adalah:

```
export const handler = awslambda.streamifyResponse(async (event: APIGatewayProxyEvent, responseStream: NodeJS.WritableStream, context: Context) => { });
```

Untuk informasi selengkapnya, lihat Streaming respons untuk fungsi Lambda.

### Penangan fungsi berbasis panggilan balik
<a name="typescript-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 dapat menggunakan argumen event, konteks, dan callback. Argumen callback mengharapkan `Error` dan respons, yang harus JSON-serializable.

Berikut adalah tanda tangan yang valid untuk pola handler callback:

```
export const handler = (event: S3Event, context: Context, callback: Callback<void>): void => { };
```

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](typescript-context.md)untuk palsu.

**Example TypeScript fungsi dengan callback**  
Contoh berikut menggunakan`APIGatewayProxyCallback`, yang merupakan jenis callback khusus khusus untuk integrasi API Gateway. Sebagian besar sumber AWS acara menggunakan `Callback` tipe generik yang ditunjukkan pada tanda tangan di atas.  

```
import { Context, APIGatewayProxyCallback, APIGatewayEvent } from 'aws-lambda';

export const lambdaHandler = (event: APIGatewayEvent, context: Context, callback: APIGatewayProxyCallback): void => {
    console.log(`Event: ${JSON.stringify(event, null, 2)}`);
    console.log(`Context: ${JSON.stringify(context, null, 2)}`);
    callback(null, {
        statusCode: 200,
        body: JSON.stringify({
            message: 'hello world',
        }),
    });
};
```

## Menggunakan SDK untuk JavaScript v3 di handler Anda
<a name="typescript-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 AWS SDK untuk JavaScript. Semua runtime Lambda Node.js yang didukung 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.

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 ketergantungan 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="typescript-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="typescript-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 TypeScript Lambda
<a name="typescript-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/) .

# Terapkan TypeScript kode yang ditranspilasikan di Lambda dengan arsip file.zip
<a name="typescript-package"></a>

Sebelum Anda dapat menerapkan TypeScript kode ke AWS Lambda, Anda perlu mentranspilasinya menjadi. JavaScript Halaman ini menjelaskan tiga cara untuk membangun dan menyebarkan TypeScript kode ke Lambda dengan arsip file.zip:
+ [Menggunakan AWS Serverless Application Model (AWS SAM)](#aws-sam-ts)
+ [Menggunakan AWS Cloud Development Kit (AWS CDK)](#aws-cdk-ts)
+ [Menggunakan AWS Command Line Interface (AWS CLI) dan esbuild](#aws-cli-ts)

AWS SAM dan AWS CDK menyederhanakan fungsi membangun dan menyebarkan TypeScript . [Spesifikasi AWS SAM template](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-specification.html) menyediakan sintaks sederhana dan bersih untuk menggambarkan fungsi Lambda, izin APIs, konfigurasi, dan peristiwa yang membentuk aplikasi tanpa server Anda. Ini [AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/home.html)memungkinkan Anda membangun aplikasi yang andal, terukur, dan hemat biaya di cloud dengan kekuatan ekspresif yang cukup besar dari bahasa pemrograman. AWS CDK Ini ditujukan untuk AWS pengguna yang cukup hingga sangat berpengalaman. Baik esbuild AWS CDK dan AWS SAM use untuk mentranspile TypeScript kode menjadi. JavaScript

## Menggunakan AWS SAM untuk menyebarkan TypeScript kode ke Lambda
<a name="aws-sam-ts"></a>

Ikuti langkah-langkah di bawah ini untuk mengunduh, membangun, dan menyebarkan contoh aplikasi Hello World menggunakan TypeScript aplikasi Hello World. AWS SAM Aplikasi ini mengimplementasikan backend API dasar. Ini terdiri dari titik akhir Amazon API Gateway dan fungsi Lambda. Ketika Anda mengirim permintaan GET ke titik akhir API Gateway, fungsi Lambda dipanggil. Fungsi mengembalikan `hello world` pesan.

**catatan**  
AWS SAM menggunakan esbuild untuk membuat fungsi Lambda Node.js TypeScript dari kode. dukungan esbuild saat ini dalam pratinjau publik. Selama pratinjau publik, dukungan esbuild mungkin mengalami perubahan yang tidak kompatibel ke belakang.

**Prasyarat**

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)
+ [AWS SAM CLI versi 1.75 atau yang lebih baru](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)
+ Node.js

**Menyebarkan aplikasi sampel AWS SAM**

1. Inisialisasi aplikasi menggunakan TypeScript template Hello World.

   ```
   sam init --app-template hello-world-typescript --name sam-app --package-type Zip --runtime nodejs24.x
   ```

1. (Opsional) Aplikasi sampel mencakup konfigurasi untuk alat yang umum digunakan, seperti [ESLlint](https://eslint.org/)untuk linting kode dan [Jest](https://jestjs.io/) untuk pengujian unit. Untuk menjalankan perintah lint dan test:

   ```
   cd sam-app/hello-world
   npm install
   npm run lint
   npm run test
   ```

1. Bangun aplikasi.

   ```
   cd sam-app
   sam build
   ```

1. Terapkan aplikasi.

   ```
   sam deploy --guided
   ```

1. Ikuti petunjuk di layar. Untuk menerima opsi default yang disediakan dalam pengalaman interaktif, respons dengan `Enter`.

1. Output menunjukkan titik akhir untuk REST API. Buka titik akhir di browser untuk menguji fungsinya. Anda akan melihat tanggapan ini:

   ```
   {"message":"hello world"}
   ```

1. Ini adalah titik akhir API publik yang dapat diakses melalui internet. Kami menyarankan Anda menghapus titik akhir setelah pengujian.

   ```
   sam delete
   ```

## Menggunakan TypeScript kode AWS CDK untuk menyebarkan ke Lambda
<a name="aws-cdk-ts"></a>

Ikuti langkah-langkah di bawah ini untuk membangun dan menerapkan TypeScript aplikasi sampel menggunakan aplikasi. AWS CDK Aplikasi ini mengimplementasikan backend API dasar. Ini terdiri dari titik akhir API Gateway dan fungsi Lambda. Ketika Anda mengirim permintaan GET ke titik akhir API Gateway, fungsi Lambda dipanggil. Fungsi mengembalikan `hello world` pesan.

**Prasyarat**

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)
+ [AWS CDK versi 2](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_prerequisites)
+ Node.js
+ [Baik [Docker atau esbuild](https://www.docker.com/get-started/)](https://esbuild.github.io/)

**Menyebarkan aplikasi sampel AWS CDK**

1. Buat direktori proyek untuk aplikasi baru Anda.

   ```
   mkdir hello-world
   cd hello-world
   ```

1. Inisialisasi aplikasi.

   ```
   cdk init app --language typescript
   ```

1. Tambahkan paket [@types /aws-lambda](https://www.npmjs.com/package/@types/aws-lambda) sebagai dependensi pengembangan. Paket ini berisi definisi tipe untuk Lambda.

   ```
   npm install -D @types/aws-lambda
   ```

1. Buka direktori **lib**. Anda akan melihat file bernama **hello-world-stack.ts.** **Buat dua file baru di direktori ini: **hello-world.function.ts dan hello-world.ts**.**

1. Buka **hello-world.function.ts** dan tambahkan kode berikut ke file. Ini adalah kode untuk fungsi Lambda.
**catatan**  
`import`Pernyataan tersebut mengimpor definisi tipe dari [@types /aws-lambda](https://www.npmjs.com/package/@types/aws-lambda). Itu tidak mengimpor paket `aws-lambda` NPM, yang merupakan alat pihak ketiga yang tidak terkait. Untuk informasi selengkapnya, lihat [aws-lambda](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/aws-lambda) di repositori. DefinitelyTyped GitHub 

   ```
   import { Context, APIGatewayProxyResult, APIGatewayEvent } from 'aws-lambda';
   
   export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => {
       console.log(`Event: ${JSON.stringify(event, null, 2)}`);
       console.log(`Context: ${JSON.stringify(context, null, 2)}`);
       return {
           statusCode: 200,
           body: JSON.stringify({
               message: 'hello world',
           }),
       };
   };
   ```

1. Buka **hello-world.ts** dan tambahkan kode berikut ke file. Ini berisi [NodejsFunction konstruksi](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_nodejs-readme.html), yang menciptakan fungsi Lambda, dan konstruksi, [LambdaRestApi yang](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_apigateway.LambdaRestApi.html) membuat REST API.

   ```
   import { Construct } from 'constructs';
   import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
   import { LambdaRestApi } from 'aws-cdk-lib/aws-apigateway';
     
   export class HelloWorld extends Construct {
     constructor(scope: Construct, id: string) {
       super(scope, id);
       const helloFunction = new NodejsFunction(this, 'function');
       new LambdaRestApi(this, 'apigw', {
         handler: helloFunction,
       });
     }
   }
   ```

   `NodejsFunction`Konstruk mengasumsikan hal berikut secara default:
   + Penangan fungsi Anda dipanggil`handler`.
   + **File.ts yang berisi kode fungsi (**hello-world.function.ts) berada di direktori yang sama dengan file.ts** yang berisi konstruksi (hello-world.ts).** Konstruk menggunakan ID konstruksi (“hello-world”) dan nama file penangan Lambda (“fungsi”) untuk menemukan kode fungsi. **Misalnya, jika kode fungsi Anda ada dalam file bernama **hello-world.my-function.ts, file hello-world.ts harus** mereferensikan kode fungsi seperti ini:**

     ```
     const helloFunction = new NodejsFunction(this, 'my-function');
     ```

   Anda dapat mengubah perilaku ini dan mengonfigurasi parameter esbuild lainnya. Untuk informasi selengkapnya, lihat [Mengonfigurasi esbuild](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_nodejs-readme.html#configuring-esbuild) di referensi AWS CDK API.

1. Buka **hello-world-stack.ts.** Ini adalah kode yang mendefinisikan [AWS CDK tumpukan](https://docs.aws.amazon.com/cdk/v2/guide/stacks.html) Anda. Ganti kode dengan yang berikut ini:

   ```
   import { Stack, StackProps } from 'aws-cdk-lib';
   import { Construct } from 'constructs';
   import { HelloWorld } from './hello-world';
     
   export class HelloWorldStack extends Stack {
     constructor(scope: Construct, id: string, props?: StackProps) {
       super(scope, id, props);
       new HelloWorld(this, 'hello-world');
     }
   }
   ```

1. dari `hello-world` direktori yang berisi `cdk.json` file Anda, terapkan aplikasi Anda.

   ```
   cdk deploy
   ```

1.  AWS CDK Membangun dan mengemas fungsi Lambda menggunakan esbuild, lalu menerapkan fungsi tersebut ke runtime Lambda. Output menunjukkan titik akhir untuk REST API. Buka titik akhir di browser untuk menguji fungsinya. Anda akan melihat tanggapan ini:

   ```
   {"message":"hello world"}
   ```

   Ini adalah titik akhir API publik yang dapat diakses melalui internet. Kami menyarankan Anda menghapus titik akhir setelah pengujian.

## Menggunakan AWS CLI dan esbuild untuk menyebarkan TypeScript kode ke Lambda
<a name="aws-cli-ts"></a>

Contoh berikut menunjukkan cara mentranspile dan menyebarkan kode TypeScript ke Lambda menggunakan esbuild dan. esbuild menghasilkan satu file dengan semua AWS CLI dependensi. JavaScript Ini adalah satu-satunya file yang perlu Anda tambahkan ke arsip.zip.

**Prasyarat**

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)
+ Node.js
+ [Peran eksekusi](lambda-intro-execution-role.md) untuk fungsi Lambda
+ Untuk pengguna Windows, utilitas file zip seperti [7zip](https://www.7-zip.org/download.html).

**Menyebarkan fungsi sampel**

1. Pada mesin lokal Anda, buat direktori proyek untuk fungsi baru Anda. 

1. Buat proyek Node.js baru dengan npm atau manajer paket pilihan Anda.

   ```
   npm init
   ```

1. Tambahkan paket [@types /aws-lambda](https://www.npmjs.com/package/@types/aws-lambda) dan [esbuild](https://esbuild.github.io/) sebagai dependensi pengembangan. `@types/aws-lambda`Paket berisi definisi tipe untuk Lambda.

   ```
   npm install -D @types/aws-lambda esbuild
   ```

1. Buat file baru bernama **index.ts**. Tambahkan kode berikut ke file baru. Ini adalah kode untuk fungsi Lambda. Fungsi mengembalikan `hello world` pesan. Fungsi ini tidak membuat sumber daya API Gateway apa pun.
**catatan**  
`import`Pernyataan tersebut mengimpor definisi tipe dari [@types /aws-lambda](https://www.npmjs.com/package/@types/aws-lambda). Itu tidak mengimpor paket `aws-lambda` NPM, yang merupakan alat pihak ketiga yang tidak terkait. Untuk informasi selengkapnya, lihat [aws-lambda](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/aws-lambda) di repositori. DefinitelyTyped GitHub 

   ```
   import { Context, APIGatewayProxyResult, APIGatewayEvent } from 'aws-lambda';
   
   export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => {
     console.log(`Event: ${JSON.stringify(event, null, 2)}`);
     console.log(`Context: ${JSON.stringify(context, null, 2)}`);
     return {
         statusCode: 200,
         body: JSON.stringify({
             message: 'hello world',
         }),
      };
   };
   ```

1. Tambahkan skrip build ke file **package.json**. Ini mengonfigurasi esbuild untuk secara otomatis membuat paket penyebaran.zip. Untuk informasi selengkapnya, lihat [Membuat skrip](https://esbuild.github.io/getting-started/#build-scripts) di dokumentasi esbuild.

------
#### [ Linux and MacOS ]

   ```
   "scripts": {
     "prebuild": "rm -rf dist",
     "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js",
     "postbuild": "cd dist && zip -r index.zip index.js*"
   },
   ```

------
#### [ Windows ]

   Dalam contoh ini, `"postbuild"` perintah menggunakan utilitas [7zip](https://www.7-zip.org/download.html) untuk membuat file.zip Anda. Gunakan utilitas zip Windows pilihan Anda sendiri dan modifikasi perintah seperlunya.

   ```
   "scripts": {
     "prebuild": "del /q dist",
     "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js",
     "postbuild": "cd dist && 7z a -tzip index.zip index.js*"
   },
   ```

------

1. Bangun paketnya.

   ```
   npm run build
   ```

1. Buat fungsi Lambda menggunakan paket.zip deployment. Ganti teks yang disorot dengan Amazon Resource Name (ARN) dari peran [eksekusi](lambda-intro-execution-role.md) Anda.

   ```
   aws lambda create-function --function-name hello-world --runtime "nodejs24.x" --role arn:aws:iam::123456789012:role/lambda-ex --zip-file "fileb://dist/index.zip" --handler index.handler
   ```

1. [Jalankan acara uji](testing-functions.md) untuk mengonfirmasi bahwa fungsi mengembalikan respons berikut. Jika Anda ingin menjalankan fungsi ini menggunakan API Gateway, [buat dan konfigurasikan REST API](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-create-api.html).

   ```
   {
     "statusCode": 200,
     "body": "{\"message\":\"hello world\"}"
   }
   ```

# Terapkan TypeScript kode yang ditranspilasikan di Lambda dengan gambar kontainer
<a name="typescript-image"></a>

Anda dapat menerapkan TypeScript kode Anda ke AWS Lambda fungsi sebagai [gambar kontainer](images-create.md) Node.js. AWS menyediakan [gambar dasar](nodejs-image.md#nodejs-image-base) untuk Node.js untuk membantu Anda membangun gambar kontainer. Gambar dasar ini dimuat sebelumnya dengan runtime bahasa dan komponen lain yang diperlukan untuk menjalankan gambar di Lambda. AWS menyediakan Dockerfile untuk setiap gambar dasar untuk membantu membangun gambar kontainer Anda.

Jika Anda menggunakan image basis komunitas atau perusahaan pribadi, Anda harus [menambahkan Node.js runtime interface client (RIC)](nodejs-image.md#nodejs-image-clients) ke image dasar agar kompatibel dengan Lambda.

Lambda menyediakan emulator antarmuka runtime untuk pengujian lokal. Gambar AWS dasar untuk Node.js menyertakan emulator antarmuka runtime. Jika Anda menggunakan gambar dasar alternatif, seperti gambar Alpine Linux atau Debian, 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 [menginstalnya di mesin lokal Anda](https://github.com/aws/aws-lambda-runtime-interface-emulator/?tab=readme-ov-file#test-an-image-without-adding-rie-to-the-image).

## Menggunakan image dasar Node.js untuk membangun dan mengemas kode TypeScript fungsi
<a name="base-image-typescript"></a>

### Prasyarat
<a name="typescript-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 22.x

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

**Untuk membuat gambar dari gambar AWS dasar untuk Lambda**

1. Pada mesin lokal Anda, buat direktori proyek untuk fungsi baru Anda.

1. Buat proyek Node.js baru dengan `npm` atau manajer paket pilihan Anda.

   ```
   npm init
   ```

1. Tambahkan paket [@types /aws-lambda](https://www.npmjs.com/package/@types/aws-lambda) dan [esbuild](https://esbuild.github.io/) sebagai dependensi pengembangan. `@types/aws-lambda`Paket berisi definisi tipe untuk Lambda.

   ```
   npm install -D @types/aws-lambda esbuild
   ```

1. Tambahkan [skrip build](https://esbuild.github.io/getting-started/#build-scripts) ke `package.json` file.

   ```
     "scripts": {
     "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js"
   }
   ```

1. Buat file baru bernama`index.ts`. Tambahkan kode contoh berikut ke file baru. Ini adalah kode untuk fungsi Lambda. Fungsi mengembalikan `hello world` pesan.
**catatan**  
`import`Pernyataan mengimpor definisi tipe dari [@types /aws-lambda](https://www.npmjs.com/package/@types/aws-lambda). Itu tidak mengimpor paket `aws-lambda` NPM, yang merupakan alat pihak ketiga yang tidak terkait. Untuk informasi selengkapnya, lihat [aws-lambda](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/aws-lambda) di repositori. DefinitelyTyped GitHub 

   ```
   import { Context, APIGatewayProxyResult, APIGatewayEvent } from 'aws-lambda';
   
   export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => {
       console.log(`Event: ${JSON.stringify(event, null, 2)}`);
       console.log(`Context: ${JSON.stringify(context, null, 2)}`);
       return {
           statusCode: 200,
           body: JSON.stringify({
               message: 'hello world',
           }),
       };
   };
   ```

1. Buat Dockerfile baru dengan konfigurasi berikut:
   + Atur properti `FROM` untuk URI dari gambar dasar.
   + Atur argumen `CMD` untuk menentukan handler fungsi Lambda.

   Contoh berikut Dockerfile menggunakan build multi-tahap. Langkah pertama mentransformasikan TypeScript kode ke dalam JavaScript. Langkah kedua menghasilkan gambar kontainer yang hanya berisi JavaScript file dan dependensi produksi.

   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 as builder
   WORKDIR /usr/app
   COPY package.json index.ts  ./
   RUN npm install
   RUN npm run build
       
   FROM public.ecr.aws/lambda/nodejs:22
   WORKDIR ${LAMBDA_TASK_ROOT}
   COPY --from=builder /usr/app/dist/* ./
   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="typescript-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="typescript-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 objek konteks Lambda untuk mengambil informasi fungsi TypeScript
<a name="typescript-context"></a>

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

Untuk mengaktifkan pemeriksaan tipe untuk objek konteks, Anda harus menambahkan paket [@types /aws-lambda](https://www.npmjs.com/package/@types/aws-lambda) sebagai dependensi pengembangan dan mengimpor jenisnya. `Context` Untuk informasi selengkapnya, lihat [Jenis definisi untuk Lambda](lambda-typescript.md#typescript-type-definitions).

**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.

**Example file index.ts**  
Contoh fungsi berikut mencatat informasi konteks dan mengembalikan lokasi log.  
Sebelum menggunakan kode ini dalam fungsi Lambda, Anda harus menambahkan paket [@types /aws-lambda](https://www.npmjs.com/package/@types/aws-lambda) sebagai dependensi pengembangan. Paket ini berisi definisi tipe untuk Lambda. Lihat informasi yang lebih lengkap di [Jenis definisi untuk Lambda](lambda-typescript.md#typescript-type-definitions).

```
import { Context } from 'aws-lambda';
export const lambdaHandler = async (event: string, context: Context): Promise<string> => {
  console.log('Remaining time: ', context.getRemainingTimeInMillis());
  console.log('Function name: ', context.functionName);
  return context.logStreamName;
};
```

# Log dan pantau fungsi TypeScript Lambda
<a name="typescript-logging"></a>

AWS Lambda secara otomatis memonitor fungsi Lambda dan mengirim entri 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 pemanggilan dan output lainnya dari kode fungsi Anda ke aliran log. Untuk informasi selengkapnya tentang CloudWatch Log, lihat[Mengirim log fungsi Lambda ke Log CloudWatch](monitoring-cloudwatchlogs.md).

Untuk mengeluarkan log dari kode fungsi Anda, Anda dapat menggunakan metode pada [objek konsol](https://nodejs.org/docs/latest-v18.x/api/console.html). Untuk pencatatan yang lebih rinci, Anda dapat menggunakan pustaka logging apa pun yang menulis ke `stdout` atau`stderr`.

**Topics**
+ [Menggunakan alat logging dan pustaka](#typescript-tools-libraries)
+ [Menggunakan Powertools for AWS Lambda (TypeScript) dan AWS SAM untuk logging terstruktur](#typescript-logging-sam)
+ [Menggunakan Powertools for AWS Lambda (TypeScript) dan AWS CDK untuk logging terstruktur](#typescript-logging-cdk)
+ [Melihat log di konsol Lambda](#typescript-logging-console)
+ [Melihat log di CloudWatch konsol](#typescript-logging-cwconsole)

## Menggunakan alat logging dan pustaka
<a name="typescript-tools-libraries"></a>

[Powertools for AWS Lambda (TypeScript)](https://docs.aws.amazon.com/powertools/typescript/) adalah toolkit pengembang untuk mengimplementasikan praktik terbaik Tanpa Server dan meningkatkan kecepatan pengembang. [Utilitas Logger menyediakan logger](https://docs.powertools.aws.dev/lambda/typescript/latest/features/logger/) yang dioptimalkan Lambda yang mencakup informasi tambahan tentang konteks fungsi di semua fungsi Anda dengan output terstruktur sebagai JSON. Gunakan utilitas ini untuk melakukan hal berikut:
+ Tangkap bidang kunci dari konteks Lambda, cold start, dan struktur logging output sebagai JSON
+ Log peristiwa pemanggilan Lambda saat diinstruksikan (dinonaktifkan secara default)
+ Cetak semua log hanya untuk persentase pemanggilan melalui pengambilan sampel log (dinonaktifkan secara default)
+ Tambahkan kunci tambahan ke log terstruktur kapan saja
+ Gunakan pemformat log kustom (Bring Your Own Formatter) untuk mengeluarkan log dalam struktur yang kompatibel dengan RFC Logging organisasi Anda

## Menggunakan Powertools for AWS Lambda (TypeScript) dan AWS SAM untuk logging terstruktur
<a name="typescript-logging-sam"></a>

Ikuti langkah-langkah di bawah ini untuk mengunduh, membangun, dan menyebarkan contoh TypeScript aplikasi Hello World dengan modul [Powertools for AWS Lambda (TypeScript)](https://docs.powertools.aws.dev/lambda-typescript) terintegrasi menggunakan modul. AWS SAM Aplikasi ini mengimplementasikan backend API dasar dan menggunakan Powertools untuk memancarkan log, metrik, dan jejak. Ini terdiri dari titik akhir Amazon API Gateway dan fungsi Lambda. Saat Anda mengirim permintaan GET ke titik akhir API Gateway, fungsi Lambda memanggil, mengirim log dan metrik menggunakan Format Metrik Tertanam CloudWatch ke, dan mengirimkan jejak ke. AWS X-Ray Fungsi mengembalikan `hello world` pesan.

**Prasyarat**

Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:
+ Node.js 20 atau yang lebih baru
+ [AWS CLI versi 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [AWS SAM CLI versi 1.75](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) atau yang lebih baru. Jika Anda memiliki versi CLI yang lebih lama, lihat [Memutakhirkan AWS SAM CLI. AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/manage-sam-cli-versions.html#manage-sam-cli-versions-upgrade)

**Menyebarkan aplikasi sampel AWS SAM**

1. Inisialisasi aplikasi menggunakan TypeScript template Hello World.

   ```
   sam init --app-template hello-world-powertools-typescript --name sam-app --package-type Zip --runtime nodejs24.x
   ```

1. Bangun aplikasi.

   ```
   cd sam-app && sam build
   ```

1. Terapkan aplikasi.

   ```
   sam deploy --guided
   ```

1. Ikuti petunjuk di layar. Untuk menerima opsi default yang disediakan dalam pengalaman interaktif, tekan`Enter`.
**catatan**  
Karena **HelloWorldFunction mungkin tidak memiliki otorisasi yang ditentukan, Apakah ini baik-baik saja?** , pastikan untuk masuk`y`.

1. Dapatkan URL aplikasi yang digunakan:

   ```
   aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
   ```

1. Memanggil titik akhir API:

   ```
   curl <URL_FROM_PREVIOUS_STEP>
   ```

   Jika berhasil, Anda akan melihat tanggapan ini:

   ```
   {"message":"hello world"}
   ```

1. Untuk mendapatkan log untuk fungsi tersebut, jalankan [log sam](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-logs.html). Untuk informasi selengkapnya, lihat [Bekerja dengan log](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-logging.html) di *Panduan AWS Serverless Application Model Pengembang*.

   ```
   sam logs --stack-name sam-app
   ```

   Output log terlihat seperti ini:

   ```
   2025/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2025-08-31T09:33:10.552000 START RequestId: 70693159-7e94-4102-a2af-98a6343fb8fb Version: $LATEST
   2025/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2025-08-31T09:33:10.594000 2025-08-31T09:33:10.557Z 70693159-7e94-4102-a2af-98a6343fb8fb INFO {"_aws":{"Timestamp":1661938390556,"CloudWatchMetrics":[{"Namespace":"sam-app","Dimensions":[["service"]],"Metrics":[{"Name":"ColdStart","Unit":"Count"}]}]},"service":"helloWorld","ColdStart":1}
   2025/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2025-08-31T09:33:10.595000 2025-08-31T09:33:10.595Z 70693159-7e94-4102-a2af-98a6343fb8fb INFO {"level":"INFO","message":"This is an INFO log - sending HTTP 200 - hello world response","service":"helloWorld","timestamp":"2025-08-31T09:33:10.594Z"}
   2025/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2025-08-31T09:33:10.655000 2025-08-31T09:33:10.655Z 70693159-7e94-4102-a2af-98a6343fb8fb INFO {"_aws":{"Timestamp":1661938390655,"CloudWatchMetrics":[{"Namespace":"sam-app","Dimensions":[["service"]],"Metrics":[]}]},"service":"helloWorld"}
   2025/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2025-08-31T09:33:10.754000 END RequestId: 70693159-7e94-4102-a2af-98a6343fb8fb
   2025/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2025-08-31T09:33:10.754000 REPORT RequestId: 70693159-7e94-4102-a2af-98a6343fb8fb Duration: 201.55 ms Billed Duration: 202 ms Memory Size: 128 MB Max Memory Used: 66 MB Init Duration: 252.42 ms
   XRAY TraceId: 1-630f2ad5-1de22b6d29a658a466e7ecf5 SegmentId: 567c116658fbf11a Sampled: true
   ```

1. Ini adalah titik akhir API publik yang dapat diakses melalui internet. Kami menyarankan Anda menghapus titik akhir setelah pengujian.

   ```
   sam delete
   ```

### Mengelola retensi log
<a name="typescript-log-retention"></a>

Grup log tidak terhapus secara otomatis ketika Anda menghapus suatu fungsi. Untuk menghindari penyimpanan log tanpa batas waktu, hapus grup log, atau konfigurasikan periode retensi setelah itu secara CloudWatch otomatis menghapus log. Untuk mengatur penyimpanan log, tambahkan yang berikut ini ke AWS SAM templat Anda:

```
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
    # Omitting other properties
  
  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub "/aws/lambda/${HelloWorldFunction}"
      RetentionInDays: 7
```

## Menggunakan Powertools for AWS Lambda (TypeScript) dan AWS CDK untuk logging terstruktur
<a name="typescript-logging-cdk"></a>

Ikuti langkah-langkah di bawah ini untuk mengunduh, membangun, dan menyebarkan contoh TypeScript aplikasi Hello World dengan modul [Powertools for AWS Lambda (TypeScript)](https://docs.powertools.aws.dev/lambda-typescript) terintegrasi menggunakan modul. AWS CDK Aplikasi ini mengimplementasikan backend API dasar dan menggunakan Powertools untuk memancarkan log, metrik, dan jejak. Ini terdiri dari titik akhir Amazon API Gateway dan fungsi Lambda. Saat Anda mengirim permintaan GET ke titik akhir API Gateway, fungsi Lambda memanggil, mengirim log dan metrik menggunakan Format Metrik Tertanam CloudWatch ke, dan mengirimkan jejak ke. AWS X-Ray Fungsi mengembalikan `hello world` pesan.

**Prasyarat**

Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:
+ Node.js 20 atau yang lebih baru
+ [AWS CLI versi 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [AWS CDK versi 2](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_prerequisites)
+ [AWS SAM CLI versi 1.75](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) atau yang lebih baru. Jika Anda memiliki versi CLI yang lebih lama, lihat [Memutakhirkan AWS SAM CLI. AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/manage-sam-cli-versions.html#manage-sam-cli-versions-upgrade)

**Menyebarkan aplikasi sampel AWS CDK**

1. Buat direktori proyek untuk aplikasi baru Anda.

   ```
   mkdir hello-world
   cd hello-world
   ```

1. Inisialisasi aplikasi.

   ```
   cdk init app --language typescript
   ```

1. Tambahkan paket [@types /aws-lambda](https://www.npmjs.com/package/@types/aws-lambda) sebagai dependensi pengembangan.

   ```
   npm install -D @types/aws-lambda
   ```

1. Instal utilitas Powertools [Logger](https://docs.aws.amazon.com/powertools/typescript/latest/features/logger/).

   ```
   npm install @aws-lambda-powertools/logger
   ```

1. Buka direktori **lib**. Anda akan melihat file bernama **hello-world-stack.ts.** **Buat dua file baru di direktori ini: **hello-world.function.ts dan hello-world.ts**.**

1. Buka **hello-world.function.ts** dan tambahkan kode berikut ke file. Ini adalah kode untuk fungsi Lambda.

   ```
   import { APIGatewayEvent, APIGatewayProxyResult, Context } from 'aws-lambda';
   import { Logger } from '@aws-lambda-powertools/logger';
   const logger = new Logger();
     
   export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => {
     logger.info('This is an INFO log - sending HTTP 200 - hello world response');
     return {
       statusCode: 200,
       body: JSON.stringify({
         message: 'hello world',
       }),
     };
   };
   ```

1. Buka **hello-world.ts** dan tambahkan kode berikut ke file. Ini berisi [NodejsFunction konstruksi](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_nodejs-readme.html), yang membuat fungsi Lambda, mengonfigurasi variabel lingkungan untuk Powertools, dan menetapkan retensi log menjadi satu minggu. Ini juga mencakup [LambdaRestApi konstruksi](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_apigateway.LambdaRestApi.html), yang menciptakan REST API.

   ```
   import { Construct } from 'constructs';
   import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
   import { LambdaRestApi } from 'aws-cdk-lib/aws-apigateway';
   import { RetentionDays } from 'aws-cdk-lib/aws-logs';
   import { CfnOutput } from 'aws-cdk-lib';
     
   export class HelloWorld extends Construct {
     constructor(scope: Construct, id: string) {
       super(scope, id);
       const helloFunction = new NodejsFunction(this, 'function', {
         environment: {
           Powertools_SERVICE_NAME: 'helloWorld',
           LOG_LEVEL: 'INFO',
         },
         logRetention: RetentionDays.ONE_WEEK,
       });
       const api = new LambdaRestApi(this, 'apigw', {
         handler: helloFunction,
       });
       new CfnOutput(this, 'apiUrl', {
         exportName: 'apiUrl',
         value: api.url,
       });
     }
   }
   ```

1. Buka **hello-world-stack.ts.** Ini adalah kode yang mendefinisikan [AWS CDK tumpukan](https://docs.aws.amazon.com/cdk/v2/guide/stacks.html) Anda. Ganti kode dengan yang berikut ini:

   ```
   import { Stack, StackProps } from 'aws-cdk-lib';
   import { Construct } from 'constructs';
   import { HelloWorld } from './hello-world';
       
   export class HelloWorldStack extends Stack {
     constructor(scope: Construct, id: string, props?: StackProps) {
       super(scope, id, props);
       new HelloWorld(this, 'hello-world');
     }
   }
   ```

1. Kembali ke direktori proyek.

   ```
   cd hello-world
   ```

1. Men-deploy aplikasi Anda.

   ```
   cdk deploy
   ```

1. Dapatkan URL aplikasi yang digunakan:

   ```
   aws cloudformation describe-stacks --stack-name HelloWorldStack --query 'Stacks[0].Outputs[?ExportName==`apiUrl`].OutputValue' --output text
   ```

1. Memanggil titik akhir API:

   ```
   curl <URL_FROM_PREVIOUS_STEP>
   ```

   Jika berhasil, Anda akan melihat tanggapan ini:

   ```
   {"message":"hello world"}
   ```

1. Untuk mendapatkan log untuk fungsi tersebut, jalankan [log sam](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-logs.html). Untuk informasi selengkapnya, lihat [Bekerja dengan log](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-logging.html) di *Panduan AWS Serverless Application Model Pengembang*.

   ```
   sam logs --stack-name HelloWorldStack
   ```

   Output log terlihat seperti ini:

   ```
   2025/01/31/[$LATEST]2ca67f180dcd4d3e88b5d68576740c8e 2025-08-31T14:48:37.047000 START RequestId: 19ad1007-ff67-40ce-9afe-0af0a9eb512c Version: $LATEST
   2025/01/31/[$LATEST]2ca67f180dcd4d3e88b5d68576740c8e 2025-08-31T14:48:37.050000 {
   "level": "INFO",
   "message": "This is an INFO log - sending HTTP 200 - hello world response",
   "service": "helloWorld",
   "timestamp": "2025-08-31T14:48:37.048Z",
   "xray_trace_id": "1-630f74c4-2b080cf77680a04f2362bcf2"
   }
   2025/01/31/[$LATEST]2ca67f180dcd4d3e88b5d68576740c8e 2025-08-31T14:48:37.082000 END RequestId: 19ad1007-ff67-40ce-9afe-0af0a9eb512c
   2025/01/31/[$LATEST]2ca67f180dcd4d3e88b5d68576740c8e 2025-08-31T14:48:37.082000 REPORT RequestId: 19ad1007-ff67-40ce-9afe-0af0a9eb512c Duration: 34.60 ms Billed Duration: 35 ms Memory Size: 128 MB Max Memory Used: 57 MB Init Duration: 173.48 ms
   ```

1. Ini adalah titik akhir API publik yang dapat diakses melalui internet. Kami menyarankan Anda menghapus titik akhir setelah pengujian.

   ```
   cdk destroy
   ```

## Melihat log di konsol Lambda
<a name="typescript-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="typescript-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.

# Menelusuri TypeScript kode di AWS Lambda
<a name="typescript-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 tiga 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 untuk Node.js](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-nodejs.html) — SDK untuk menghasilkan dan mengirim data jejak ke X-Ray.
+ [Powertools for AWS Lambda (TypeScript)](https://docs.aws.amazon.com/powertools/typescript/latest/) — Toolkit pengembang untuk mengimplementasikan praktik terbaik Tanpa Server dan meningkatkan kecepatan pengembang.

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 Powertools for AWS Lambda (TypeScript) dan AWS SAM untuk tracing](#typescript-tracing-sam)
+ [Menggunakan Powertools for AWS Lambda (TypeScript) dan AWS CDK for tracing](#typescript-tracing-cdk)
+ [Menafsirkan jejak X-Ray](#typescript-tracing-interpretation)

## Menggunakan Powertools for AWS Lambda (TypeScript) dan AWS SAM untuk tracing
<a name="typescript-tracing-sam"></a>

Ikuti langkah-langkah di bawah ini untuk mengunduh, membangun, dan menyebarkan contoh TypeScript aplikasi Hello World dengan modul [Powertools for AWS Lambda (TypeScript)](https://docs.powertools.aws.dev/lambda-typescript) terintegrasi menggunakan modul. AWS SAM Aplikasi ini mengimplementasikan backend API dasar dan menggunakan Powertools untuk memancarkan log, metrik, dan jejak. Ini terdiri dari titik akhir Amazon API Gateway dan fungsi Lambda. Saat Anda mengirim permintaan GET ke titik akhir API Gateway, fungsi Lambda memanggil, mengirim log dan metrik menggunakan Format Metrik Tertanam CloudWatch ke, dan mengirimkan jejak ke. AWS X-Ray Fungsi mengembalikan `hello world` pesan.

**Prasyarat**

Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:
+ Node.js
+ [AWS CLI versi 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [AWS SAM CLI versi 1.75](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) atau yang lebih baru. Jika Anda memiliki versi CLI yang lebih lama, lihat [Memutakhirkan AWS SAM CLI. AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/manage-sam-cli-versions.html#manage-sam-cli-versions-upgrade)

**Menyebarkan aplikasi sampel AWS SAM**

1. Inisialisasi aplikasi menggunakan TypeScript template Hello World.

   ```
   sam init --app-template hello-world-powertools-typescript --name sam-app --package-type Zip --runtime nodejs24.x --no-tracing
   ```

1. Bangun aplikasi.

   ```
   cd sam-app && sam build
   ```

1. Terapkan aplikasi.

   ```
   sam deploy --guided
   ```

1. Ikuti petunjuk di layar. Untuk menerima opsi default yang disediakan dalam pengalaman interaktif, tekan`Enter`.
**catatan**  
Karena **HelloWorldFunction mungkin tidak memiliki otorisasi yang ditentukan, Apakah ini baik-baik saja?** , pastikan untuk masuk`y`.

1. Dapatkan URL aplikasi yang digunakan:

   ```
   aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
   ```

1. Memanggil titik akhir API:

   ```
   curl <URL_FROM_PREVIOUS_STEP>
   ```

   Jika berhasil, Anda akan melihat tanggapan ini:

   ```
   {"message":"hello world"}
   ```

1. Untuk mendapatkan jejak untuk fungsi tersebut, jalankan [jejak sam](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-traces.html).

   ```
   sam traces
   ```

   Output jejak terlihat seperti ini:

   ```
   XRay Event [revision 1] at (2023-01-31T11:29:40.527000) with id (1-11a2222-111a222222cb33de3b95daf9) and duration (0.483s)
     - 0.425s - sam-app/Prod [HTTP: 200]
       - 0.422s - Lambda [HTTP: 200]
     - 0.406s - sam-app-HelloWorldFunction-Xyzv11a1bcde [HTTP: 200]
     - 0.172s - sam-app-HelloWorldFunction-Xyzv11a1bcde
       - 0.179s - Initialization
       - 0.112s - Invocation
         - 0.052s - ## app.lambdaHandler
           - 0.001s - ### MySubSegment
       - 0.059s - Overhead
   ```

1. Ini adalah titik akhir API publik yang dapat diakses melalui internet. Kami menyarankan Anda menghapus titik akhir setelah pengujian.

   ```
   sam delete
   ```

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.

## Menggunakan Powertools for AWS Lambda (TypeScript) dan AWS CDK for tracing
<a name="typescript-tracing-cdk"></a>

Ikuti langkah-langkah di bawah ini untuk mengunduh, membangun, dan menyebarkan contoh TypeScript aplikasi Hello World dengan modul [Powertools for AWS Lambda (TypeScript)](https://docs.powertools.aws.dev/lambda-typescript) terintegrasi menggunakan modul. AWS CDK Aplikasi ini mengimplementasikan backend API dasar dan menggunakan Powertools untuk memancarkan log, metrik, dan jejak. Ini terdiri dari titik akhir Amazon API Gateway dan fungsi Lambda. Saat Anda mengirim permintaan GET ke titik akhir API Gateway, fungsi Lambda memanggil, mengirim log dan metrik menggunakan Format Metrik Tertanam CloudWatch ke, dan mengirimkan jejak ke. AWS X-Ray Fungsi mengembalikan `hello world` pesan.

**Prasyarat**

Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:
+ Node.js
+ [AWS CLI versi 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [AWS CDK versi 2](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_prerequisites)
+ [AWS SAM CLI versi 1.75](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) atau yang lebih baru. Jika Anda memiliki versi CLI yang lebih lama, lihat [Memutakhirkan AWS SAM CLI. AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/manage-sam-cli-versions.html#manage-sam-cli-versions-upgrade)

**Menyebarkan aplikasi sampel AWS Cloud Development Kit (AWS CDK)**

1. Buat direktori proyek untuk aplikasi baru Anda.

   ```
   mkdir hello-world
   cd hello-world
   ```

1. Inisialisasi aplikasi.

   ```
   cdk init app --language typescript
   ```

1. Tambahkan paket [@types /aws-lambda](https://www.npmjs.com/package/@types/aws-lambda) sebagai dependensi pengembangan.

   ```
   npm install -D @types/aws-lambda
   ```

1. Instal utilitas Powertools [Tracer.](https://docs.aws.amazon.com/powertools/typescript/latest/features/tracer/)

   ```
   npm install @aws-lambda-powertools/tracer
   ```

1. Buka direktori **lib**. Anda akan melihat file bernama **hello-world-stack.ts.** **Buat dua file baru di direktori ini: **hello-world.function.ts dan hello-world.ts**.**

1. Buka **hello-world.function.ts** dan tambahkan kode berikut ke file. Ini adalah kode untuk fungsi Lambda.

   ```
   import { APIGatewayEvent, APIGatewayProxyResult, Context } from 'aws-lambda';
   import { Tracer } from '@aws-lambda-powertools/tracer';
   const tracer = new Tracer();
   
   export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => {
     // Get facade segment created by Lambda
     const segment = tracer.getSegment();
   
     // Create subsegment for the function and set it as active
     const handlerSegment = segment.addNewSubsegment(`## ${process.env._HANDLER}`);
     tracer.setSegment(handlerSegment);
   
     // Annotate the subsegment with the cold start and serviceName
     tracer.annotateColdStart();
     tracer.addServiceNameAnnotation();
   
     // Add annotation for the awsRequestId
     tracer.putAnnotation('awsRequestId', context.awsRequestId);
     // Create another subsegment and set it as active
     const subsegment = handlerSegment.addNewSubsegment('### MySubSegment');
     tracer.setSegment(subsegment);
     let response: APIGatewayProxyResult = {
       statusCode: 200,
       body: JSON.stringify({
         message: 'hello world',
       }),
     };
     // Close subsegments (the Lambda one is closed automatically)
     subsegment.close(); // (### MySubSegment)
     handlerSegment.close(); // (## index.handler)
   
     // Set the facade segment as active again (the one created by Lambda)
     tracer.setSegment(segment);
     return response;
   };
   ```

1. Buka **hello-world.ts** dan tambahkan kode berikut ke file. Ini berisi [NodejsFunction konstruksi](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_nodejs-readme.html), yang membuat fungsi Lambda, mengonfigurasi variabel lingkungan untuk Powertools, dan menetapkan retensi log menjadi satu minggu. Ini juga mencakup [LambdaRestApi konstruksi](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_apigateway.LambdaRestApi.html), yang menciptakan REST API.

   ```
   import { Construct } from 'constructs';
   import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
   import { LambdaRestApi } from 'aws-cdk-lib/aws-apigateway';
   import { CfnOutput } from 'aws-cdk-lib';
   import { Tracing } from 'aws-cdk-lib/aws-lambda';
   
   export class HelloWorld extends Construct {
     constructor(scope: Construct, id: string) {
       super(scope, id);
       const helloFunction = new NodejsFunction(this, 'function', {
         environment: {
           POWERTOOLS_SERVICE_NAME: 'helloWorld',
         },
         tracing: Tracing.ACTIVE,
       });
       const api = new LambdaRestApi(this, 'apigw', {
         handler: helloFunction,
       });
       new CfnOutput(this, 'apiUrl', {
         exportName: 'apiUrl',
         value: api.url,
       });
     }
   }
   ```

1. Buka **hello-world-stack.ts.** Ini adalah kode yang mendefinisikan [AWS CDK tumpukan](https://docs.aws.amazon.com/cdk/v2/guide/stacks.html) Anda. Ganti kode dengan yang berikut ini:

   ```
   import { Stack, StackProps } from 'aws-cdk-lib';
   import { Construct } from 'constructs';
   import { HelloWorld } from './hello-world';
     
   export class HelloWorldStack extends Stack {
     constructor(scope: Construct, id: string, props?: StackProps) {
       super(scope, id, props);
       new HelloWorld(this, 'hello-world');
     }
   }
   ```

1. Men-deploy aplikasi Anda.

   ```
   cd ..
   cdk deploy
   ```

1. Dapatkan URL aplikasi yang digunakan:

   ```
   aws cloudformation describe-stacks --stack-name HelloWorldStack --query 'Stacks[0].Outputs[?ExportName==`apiUrl`].OutputValue' --output text
   ```

1. Memanggil titik akhir API:

   ```
   curl <URL_FROM_PREVIOUS_STEP>
   ```

   Jika berhasil, Anda akan melihat tanggapan ini:

   ```
   {"message":"hello world"}
   ```

1. Untuk mendapatkan jejak untuk fungsi tersebut, jalankan [jejak sam](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-traces.html).

   ```
   sam traces
   ```

   Output jejak terlihat seperti ini:

   ```
   XRay Event [revision 1] at (2023-01-31T11:50:06.997000) with id (1-11a2222-111a222222cb33de3b95daf9) and duration (0.449s)
     - 0.350s - HelloWorldStack-helloworldfunction111A2BCD-Xyzv11a1bcde [HTTP: 200]
     - 0.157s - HelloWorldStack-helloworldfunction111A2BCD-Xyzv11a1bcde
       - 0.169s - Initialization
       - 0.058s - Invocation
         - 0.055s - ## index.handler
           - 0.000s - ### MySubSegment
       - 0.099s - Overhead
   ```

1. Ini adalah titik akhir API publik yang dapat diakses melalui internet. Kami menyarankan Anda menghapus titik akhir setelah pengujian.

   ```
   cdk destroy
   ```

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

Setelah mengonfigurasi penelusuran aktif, Anda dapat mengamati permintaan tertentu melalui aplikasi Anda. [Peta jejak X-Ray](https://docs.aws.amazon.com/xray/latest/devguide/xray-console-servicemap.html) memberikan informasi tentang aplikasi Anda dan semua komponennya. Contoh berikut menunjukkan jejak dari aplikasi sampel:

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