

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

# Siapkan integrasi proxy Lambda dengan streaming respons payload di API Gateway
<a name="response-transfer-mode-lambda"></a>

Anda dapat melakukan streaming respons fungsi Lambda untuk meningkatkan kinerja time to first byte (TTFB) dan mengirim sebagian tanggapan kembali ke klien saat tersedia. API Gateway mengharuskan Anda menggunakan API [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)Lambda untuk menjalankan fungsi Lambda Anda. API Gateway meneruskan objek peristiwa ke fungsi Lambda. Fungsi backend Lambda mem-parsing data permintaan yang masuk untuk menentukan respons yang dikembalikan. Agar API Gateway dapat melakukan streaming output Lambda, fungsi Lambda harus menampilkan [format](#response-transfer-mode-lambda-format) yang diperlukan oleh API Gateway.

## Perbedaan integrasi proxy Lambda antara mode transfer respons streaming dan buffer
<a name="response-transfer-mode-lambda-comparison"></a>

Daftar berikut menjelaskan perbedaan antara integrasi proxy Lambda dan integrasi proxy Lambda untuk streaming respons:
+ API Gateway menggunakan [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)API untuk menjalankan integrasi proxy Lambda untuk streaming respons. Ini menghasilkan URI yang berbeda, yaitu sebagai berikut:

  ```
  arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations
  ```

  ARN ini menggunakan tanggal yang berbeda untuk versi API dan tindakan layanan yang berbeda dibandingkan dengan integrasi proxy Lambda.

  Jika Anda menggunakan konsol API Gateway untuk streaming respons, konsol menggunakan URI yang benar untuk Anda.
+ Dalam integrasi proxy Lambda, API Gateway mengirimkan respons ke klien hanya setelah menerima respons penuh dari Lambda. Dalam integrasi proxy Lambda untuk streaming respons, API Gateway memulai aliran muatan setelah menerima metadata dan pembatas yang valid dari Lambda. 
+ Integrasi proxy Lambda untuk streaming respons menggunakan format input yang sama dengan integrasi proxy, tetapi memerlukan format output yang berbeda.

## Format integrasi proxy Lambda untuk streaming respons
<a name="response-transfer-mode-lambda-format"></a>

Saat API Gateway memanggil fungsi Lambda dengan streaming respons, format input sama dengan format input fungsi Lambda untuk integrasi proxy. Untuk informasi selengkapnya, lihat [Format input fungsi Lambda untuk integrasi proxy](set-up-lambda-proxy-integrations.md#api-gateway-simple-proxy-for-lambda-input-format). 

Saat Lambda mengalirkan respons ke API Gateway, respons harus mematuhi format berikut. Format ini menggunakan pembatas untuk memisahkan metadata JSON dan muatan mentah. Dalam hal ini, data payload dialirkan saat ditransmisikan oleh fungsi Lambda streaming Anda:

```
{
  "headers": {"headerName": "headerValue", ...},
  "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
  "cookies" : ["cookie1", "cookie2"],
  "statusCode": httpStatusCode
}<DELIMITER>PAYLOAD1 | PAYLOAD2 | PAYLOAD3
```

Dalam output:
+ `statusCode`Tombol `headers``multiValueHeaders`,`cookies`, dan dapat tidak ditentukan jika tidak ada header respons tambahan yang akan dikembalikan.
+ `headers`Kuncinya hanya dapat berisi header nilai tunggal.
+ Output mengharapkan header berisi salah satu atau`Transfer-Encoding: chunked`. `Content-length: number` Jika fungsi Anda tidak mengembalikan salah satu header ini, API Gateway akan ditambahkan `Transfer-Encoding: chunked` ke header respons.
+ `multiValueHeaders`Kuncinya dapat berisi header multi-nilai serta header nilai tunggal. Anda dapat menggunakan `multiValueHeaders` kunci untuk menentukan semua header tambahan Anda, termasuk yang bernilai tunggal.
+ Jika Anda menentukan nilai untuk keduanya `headers` dan`multiValueHeaders`, API Gateway menggabungkannya ke dalam satu daftar. Jika pasangan kunci-nilai yang sama ditentukan di keduanya, hanya nilai dari yang `multiValueHeaders` akan muncul dalam daftar gabungan.
+ Metadata harus JSON yang valid. Hanya`headers`,`multiValueHeaders`, `cookies` dan `statusCode` kuncinya didukung.
+ Anda harus memberikan pembatas setelah metadata JSON. Pembatas harus 8 byte nol dan harus muncul dalam 16KB pertama data aliran.
+ API Gateway tidak memerlukan format khusus untuk payload respons metode.

Jika Anda menggunakan URL fungsi untuk melakukan streaming fungsi Lambda Anda, Anda harus memodifikasi input dan output fungsi Lambda Anda untuk memenuhi persyaratan ini.

Jika output fungsi Lambda Anda tidak mematuhi persyaratan format ini, API Gateway mungkin masih menjalankan fungsi Lambda Anda. Tabel berikut menunjukkan kombinasi setelan permintaan integrasi API dan kode fungsi Lambda yang didukung oleh API Gateway. Ini termasuk kombinasi yang didukung untuk mode transfer respons buffer.


| Mode transfer respons | Kode fungsi mematuhi format yang diperlukan | Lambda memanggil API | Didukung oleh API Gateway | 
| --- | --- | --- | --- | 
|  Streaming  |  Ya  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  Ya. API Gateway mengalirkan respons Anda.  | 
|  Streaming  |  Tidak  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  Tidak. API Gateway memanggil fungsi Lambda Anda dan mengembalikan respons kesalahan 500.  | 
|  Streaming  |  Ya  |   [Memohon](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  Tidak. API Gateway tidak mendukung konfigurasi integrasi ini.  | 
|  Streaming  |  Tidak  |   [Memohon](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  Tidak. API Gateway tidak mendukung konfigurasi integrasi ini.  | 
|  Buffer  |  Ya  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  Tidak. API Gateway tidak mendukung konfigurasi integrasi ini.  | 
|  Buffer  |  Tidak  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  Tidak. API Gateway tidak mendukung konfigurasi integrasi ini.  | 
|  Buffer  |  Ya  |   [Memohon](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  API Gateway mengembalikan header HTTP dan kode status tetapi bukan badan respons.  | 
|  Buffer  |  Tidak  |   [Memohon](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  Ya. Ini adalah integrasi proxy Lambda. Untuk informasi selengkapnya, lihat Integrasi [proxy Lambda](set-up-lambda-proxy-integrations.md).  | 

# Konfigurasikan integrasi proxy Lambda dengan streaming respons payload di API Gateway
<a name="response-streaming-lambda-configure"></a>

Saat mengatur streaming payload respons, Anda menentukan mode transfer dalam permintaan integrasi sumber daya Anda. Anda mengonfigurasi setelan ini dalam permintaan integrasi untuk mengontrol perilaku API Gateway sebelum dan selama respons integrasi.

## Contoh fungsi Lambda untuk streaming respons
<a name="response-streaming-lambda-example"></a>

Fungsi Lambda Anda harus mematuhi. [Format integrasi proxy Lambda untuk streaming respons](response-transfer-mode-lambda.md#response-transfer-mode-lambda-format) Kami menyarankan Anda menggunakan salah satu dari tiga contoh fungsi Lambda untuk menguji streaming respons. Saat Anda membuat fungsi Lambda, pastikan untuk melakukan hal berikut:
+ Berikan batas waktu yang memadai untuk fungsi Anda. Kami menyarankan Anda mengonfigurasi batas waktu minimal 1 menit untuk mempelajari tentang streaming respons. Saat Anda membuat sumber daya produksi, pastikan batas waktu fungsi Lambda Anda mencakup siklus permintaan penuh. Untuk informasi selengkapnya, lihat [Mengonfigurasi batas waktu fungsi Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html).
+ Gunakan runtime Node.js terbaru.
+ Gunakan Wilayah tempat streaming respons Lambda tersedia.

------
#### [ Using HttpResponseStream.from ]

Contoh kode berikut mengalirkan objek metadata JSON dan muatan kembali ke klien menggunakan `awslambda.HttpResponseStream()` metode tanpa menggunakan metode pipeline. Anda tidak perlu membuat pembatas. Untuk informasi selengkapnya, lihat [Menulis fungsi Lambda yang mendukung streaming respons](https://docs.aws.amazon.com/lambda/latest/dg/config-rs-write-functions.html).

```
export const handler = awslambda.streamifyResponse(
  async (event, responseStream, context) => {
    const httpResponseMetadata = {
      "statusCode": 200,
      "headers": {
        "x-foo": "bar"
      },
      "multiValueHeaders": {
        "x-mv1": ["hello", "world"],
        "Set-Cookie": ["c1=blue", "c2=red"]
      }
    };

    responseStream = awslambda.HttpResponseStream.from(responseStream, httpResponseMetadata);
    await new Promise(r => setTimeout(r, 1000)); // synthetic delay

    responseStream.write("First payload ");
    await new Promise(r => setTimeout(r, 1000)); // synthetic delay

    responseStream.write("Final payload");
    responseStream.end();
});
```

------
#### [ Using the pipeline method ]

Lambda merekomendasikan bahwa ketika Anda menulis fungsi yang mendukung streaming respons, Anda menggunakan `awslambda.streamifyResponse()` dekorator yang disediakan runtime Node.js asli, dan metodenya. `pipeline()` Saat Anda menggunakan metode pipeline, Anda tidak perlu membuat pembatas, Lambda melakukan ini untuk Anda. Untuk informasi selengkapnya, lihat [Menulis fungsi Lambda yang mendukung streaming respons](https://docs.aws.amazon.com/lambda/latest/dg/config-rs-write-functions.html).

Contoh kode berikut mengalirkan objek metadata JSON dan tiga muatan kembali ke klien.

```
import { pipeline } from 'node:stream/promises';
import { Readable } from 'node:stream';

export const handler = awslambda.streamifyResponse(
  async (event, responseStream, context) => {
    const httpResponseMetadata = {
      statusCode: 200,
      headers: {
        "Content-Type": "text/plain",
        "X-Custom-Header": "Example-Custom-Header"
      }
    };

    responseStream = awslambda.HttpResponseStream.from(responseStream, httpResponseMetadata);

    const dataStream = Readable.from(async function* () {
      yield "FIRST payload\n";
      await new Promise(r => setTimeout(r, 1000));
      yield "SECOND payload\n";
      await new Promise(r => setTimeout(r, 1000));
      yield "THIRD payload\n";
      await new Promise(r => setTimeout(r, 1000));
    }());

    await pipeline(dataStream, responseStream);
  }
);
```

------
#### [ Without using the pipeline method ]

Contoh kode berikut mengalirkan objek metadata JSON dan tiga muatan kembali ke klien tanpa menggunakan metode ini. `awslambda.HttpResponseStream()` Tanpa `awslambda.HttpResponseStream()` metode ini, Anda harus menyertakan pembatas 8 byte nol antara metadata dan muatan. 

```
export const handler = awslambda.streamifyResponse(async (event, response, ctx) => {
  response.write('{"statusCode": 200, "headers": {"hdr-x": "val-x"}}');
  response.write("\x00".repeat(8)); // DELIMITER
  await new Promise(r => setTimeout(r, 1000));

  response.write("FIRST payload");
  await new Promise(r => setTimeout(r, 1000));

  response.write("SECOND payload");
  await new Promise(r => setTimeout(r, 1000));

  response.write("FINAL payload");
  response.end();
});
```

------

## Buat integrasi proxy Lambda dengan streaming respons payload
<a name="response-streaming-lambda-create"></a>

Prosedur berikut menunjukkan cara membuat integrasi proxy Lambda dengan streaming respons payload. Gunakan contoh fungsi Lambda atau buat sendiri.

------
#### [ Konsol Manajemen AWS ]

**Untuk membuat integrasi proxy Lambda dengan streaming respons payload**

1. Masuk ke konsol API Gateway di [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Pilih REST API.

1. Pilih **Buat sumber daya**.

1. Untuk **Nama sumber daya**, masukkan **streaming**.

1. Pilih **Buat sumber daya**.

1. Dengan sumber daya **/streaming** yang dipilih, pilih **Create method**.

1. Untuk **jenis Metode**, pilih **APAPUN**.

1. Untuk **jenis Integrasi**, pilih **Lambda**.

1. Pilih integrasi **proxy Lambda**.

1. Untuk **mode transfer Respons**, pilih **Streaming**.

1. Untuk fungsi **Lambda, pilih nama fungsi** Lambda Anda.

   Konsol API Gateway secara otomatis menggunakan [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)API untuk menjalankan fungsi Lambda. Anda bertanggung jawab untuk menulis fungsi Lambda yang mendukung streaming respons. Sebagai contoh, lihat [Contoh fungsi Lambda untuk streaming respons](#response-streaming-lambda-example).

1. Pilih **metode Buat**.

Setelah Anda membuat metode, terapkan API Anda.

**Untuk men-deploy API Anda**

1. Pilih **Deploy API**.

1. Untuk **Stage**, pilih **New stage**.

1. Untuk **nama Panggung**, masukkan**prod**.

1. (Opsional) Untuk **Deskripsi**, masukkan deskripsi.

1. Pilih **Deploy**.

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

Prosedur berikut menunjukkan cara mengimpor API baru dengan `responseTransferMode` set ke`STREAM`. Jika Anda memiliki API integrasi yang ada dan ingin memodifikasinya`responseTransferMode`, lihat[Perbarui mode transfer respons untuk integrasi proxy Lambda](#response-streaming-lambda-update).

**Untuk membuat API baru dengan streaming respons payload**

1. Salin file Open API berikut, lalu simpan sebagai file`ResponseStreamDemoSwagger.yaml`. Dalam file ini, `responseTransferMode` diatur ke`STREAM`, dan URI integrasi diatur ke`arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations`.

   Ganti nama fungsi dari `my-function` dengan fungsi berkemampuan streaming dan ganti kredensialnya dengan peran IAM yang memiliki kebijakan yang memungkinkan layanan `apigateway` memanggil fungsi Lambda.

   ```
   openapi: "3.0.1"
   info:
     title: "ResponseStreamingDemo"
     version: "2025-04-28T17:28:25Z"
   servers:
   - url: "{basePath}"
     variables:
       basePath:
         default: "prod"
   paths:
     /lambda:
       get:
         x-amazon-apigateway-integration:
           httpMethod: "POST"
           uri: "arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations"
           type: "aws_proxy"
           timeoutInMillis: 90000
           responseTransferMode: "STREAM"
           credentials: "arn:aws:iam::111122223333:role/apigateway-lambda-role"
   ```

   Alih-alih menyediakan peran IAM untuk kredensyal, Anda dapat menggunakan perintah untuk Lambda `add-permission` untuk menambahkan izin berbasis sumber daya.

1. Gunakan `import-rest-api` perintah berikut untuk mengimpor definisi OpenAPI Anda:

   ```
   aws apigateway import-rest-api \
     --body 'fileb://~/ResponseStreamDemoSwagger.yaml' \
     --parameters endpointConfigurationTypes=REGIONAL \
     --region us-west-1
   ```

1. Gunakan `create-deployment` perintah berikut untuk menerapkan API baru Anda ke panggung:

   ```
   aws apigateway create-deployment \
     --rest-api-id a1b2c2 \
     --stage-name prod \
     --region us-west-1
   ```

------

### Perbarui mode transfer respons untuk integrasi proxy Lambda
<a name="response-streaming-lambda-update"></a>

Prosedur berikut menunjukkan cara memperbarui mode transfer respons untuk integrasi proxy Lambda. Saat Anda mengubah mode transfer respons ke streaming, perbarui fungsi Lambda Anda sehingga mematuhi persyaratan untuk streaming respons. Gunakan contoh fungsi Lambda atau buat sendiri.

------
#### [ Konsol Manajemen AWS ]

**Untuk memperbarui mode transfer respons untuk integrasi proxy Lambda**

1. Masuk ke konsol API Gateway di [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Pilih REST API.

1. Pilih metode.

1. Pada tab **Permintaan integrasi**, di bawah **Pengaturan permintaan integrasi**, pilih **Edit**.

1. Untuk **mode transfer Respons**, pilih **Streaming**.

1. Untuk fungsi **Lambda, pilih nama fungsi** Lambda Anda.

1. Pilih **Simpan**.

Setelah memperbarui metode, terapkan API Anda.

**Untuk men-deploy API Anda**

1. Pilih **Deploy API**.

1. Untuk **Stage**, pilih **New stage**.

1. Untuk **nama Panggung**, masukkan**prod**.

1. (Opsional) Untuk **Deskripsi**, masukkan deskripsi.

1. Pilih **Deploy**.

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

1. Perbarui fungsi Lambda Anda agar diaktifkan streaming.

1. Gunakan AWS CLI perintah berikut untuk memperbarui URI integrasi dan mode transfer respons integrasi Anda:

   ```
   aws apigateway update-integration \
    --rest-api-id a1b2c3 \
    --resource-id aaa111 \
    --http-method ANY \
    --patch-operations "[{\"op\":\"replace\",\"path\":\"/uri\",\"value\":\"arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations\"}, {\"op\":\"replace\",\"path\":\"/responseTransferMode\",\"value\":\"STREAM\"}]" \
    --region us-west-1
   ```

1. Menerapkan ulang API Anda agar perubahan diterapkan.

------