

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Streaming di risposte per le funzioni Lambda
<a name="configuration-response-streaming"></a>

Le funzioni Lambda possono trasmettere nativamente i payload di risposta ai client tramite la [funzione Lambda URLs](urls-configuration.md) o utilizzando l'[InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)API (tramite l' AWS SDK o le chiamate API dirette). La tua funzione Lambda può anche trasmettere i payload di risposta tramite l'[integrazione proxy di Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/response-transfer-mode-lambda.html), che utilizza l'[InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)API per richiamare la tua funzione. Lo streaming delle risposte può favorire le applicazioni sensibili alla latenza migliorando le prestazioni del time to first byte (TTFB). Questo perché consente di inviare risposte parziali al client non appena diventano disponibili. Inoltre, le funzioni di streaming di risposta possono restituire payload fino a 200 MB, rispetto al massimo di 6 MB per le risposte bufferizzate. Lo streaming di una risposta significa anche che la funzione non deve contenere l'intera risposta in memoria. Per risposte molto grandi, ciò può ridurre la quantità di memoria necessaria per configurare la funzione. 

**Nota**  
Lo streaming di risposta Lambda non è ancora disponibile in tutti. Regioni AWS Per informazioni sulla disponibilità delle funzionalità per [regione, consulta AWS le funzionalità di](https://builder.aws.com/build/capabilities) Builder Center.

La velocità con cui Lambda trasmette le tue risposte dipende dalla dimensione della risposta. La velocità di streaming per i primi 6 MB di risposta della funzione è illimitata. Per le risposte superiori a 6 MB, il resto della risposta è soggetto a un limite di larghezza di banda. Per ulteriori informazioni sulla larghezza di banda dello streaming, consulta la sezione [Limiti di larghezza di banda per lo streaming delle risposte](#config-rs-bandwidth-cap).

Le risposte in streaming comportano costi e le risposte in streaming non vengono interrotte o interrotte quando la connessione del client che effettua la chiamata viene interrotta. Ai clienti verrà fatturata l'intera durata della funzione, quindi i clienti devono prestare attenzione quando configurano lunghi timeout di funzionamento.

Lambda supporta lo streaming delle risposte sui runtime gestiti di Node.js. Per altri linguaggi, incluso Python, puoi [utilizzare un runtime personalizzato con un'integrazione API Runtime personalizzata](runtimes-custom.md#runtimes-custom-response-streaming) per lo streaming delle risposte o utilizzare il [Lambda](https://github.com/awslabs/aws-lambda-web-adapter) Web Adapter.

**Nota**  
Quando testi la funzione tramite la console Lambda, vedrai sempre le risposte come memorizzate nel buffer.

**Topics**
+ [Limiti di larghezza di banda per lo streaming delle risposte](#config-rs-bandwidth-cap)
+ [Compatibilità VPC con streaming di risposta](#config-rs-vpc-compatibility)
+ [Scrittura di funzioni Lambda abilitate allo streaming delle risposte](config-rs-write-functions.md)
+ [Richiamo di una funzione abilitata allo streaming di risposte utilizzando la funzione Lambda URLs](config-rs-invoke-furls.md)
+ [Tutorial: creazione di una funzione Lambda di streaming delle risposte con un URL della funzione](response-streaming-tutorial.md)

## Limiti di larghezza di banda per lo streaming delle risposte
<a name="config-rs-bandwidth-cap"></a>

I primi 6 MB del payload di risposta della funzione hanno una larghezza di banda illimitata. Dopo questa raffica iniziale, Lambda trasmette la tua risposta a una velocità massima di 2. MBps Se le risposte delle tue funzioni non superano mai i 6 MB, questo limite di larghezza di banda non verrà mai applicato. 

**Nota**  
I limiti di larghezza di banda si applicano solo al payload di risposta della funzione e non all'accesso alla rete da parte della funzione.

La velocità della larghezza di banda illimitata varia in base a una serie di fattori, inclusa la velocità di elaborazione della funzione. Normalmente puoi aspettarti una frequenza superiore a 2 MBps per i primi 6 MB di risposta della funzione. Se la tua funzione trasmette in streaming una risposta a una destinazione esterna AWS, la velocità di streaming dipende anche dalla velocità della connessione Internet esterna. 

## Compatibilità VPC con streaming di risposta
<a name="config-rs-vpc-compatibility"></a>

Quando utilizzi le funzioni Lambda in un ambiente VPC, per lo streaming di risposta è importante tenere in considerazione quanto segue:
+ La funzione Lambda URLs non supporta lo streaming di risposte all'interno di un ambiente VPC.
+ Puoi utilizzare lo streaming di risposte all'interno di un VPC richiamando la funzione Lambda tramite l'SDK utilizzando l' AWS API. `InvokeWithResponseStream` Ciò richiede la configurazione degli endpoint VPC appropriati per Lambda.
+ Per gli ambienti VPC, dovrai creare un endpoint VPC di interfaccia per Lambda per abilitare la comunicazione tra le tue risorse nel VPC e il servizio Lambda.

Un'architettura tipica per lo streaming di risposta in un VPC potrebbe includere:

```
Client in VPC -> Interface VPC endpoint for Lambda -> Lambda function -> Response streaming back through the same path
```

# Scrittura di funzioni Lambda abilitate allo streaming delle risposte
<a name="config-rs-write-functions"></a>

La scrittura del gestore per le funzioni di streaming delle risposte è diversa dai modelli di gestore tipici. Quando scrivi funzioni di streaming, assicurati di completare le seguenti operazioni:
+ Completa la funzione con il decoratore `awslambda.streamifyResponse()`. L'oggetto globale `awslambda` è fornito dall'ambiente di runtime Node.js di Lambda.
+ Termina il flusso in modo corretto per assicurarti che tutta l'elaborazione dei dati sia completa.

## Configurazione di un gestore delle funzioni per lo streaming delle risposte
<a name="config-rs-write-functions-handler"></a>

Per indicare al runtime che Lambda deve trasmettere in streaming le risposte della funzione, è necessario racchiudere la funzione con il decoratore `streamifyResponse()`. Questo indica al runtime di utilizzare il percorso logico corretto per lo streaming delle risposte e consente alla funzione di trasmettere le risposte.

Il decoratore `streamifyResponse()` accetta una funzione che accetta i seguenti parametri:
+ `event`: fornisce informazioni sull'evento di chiamata dell'URL della funzione, ad esempio il metodo HTTP, i parametri della query e il corpo della richiesta.
+ `responseStream`: fornisce un flusso scrivibile.
+ `context`: fornisce i metodi e le proprietà con informazioni sulla chiamata, sulla funzione e sull'ambiente di esecuzione.

L'oggetto `responseStream` è un [`writableStream` Node.js](https://nodesource.com/blog/understanding-streams-in-nodejs/). Come con qualsiasi flusso di questo tipo, dovresti usare il metodo `pipeline()`.

**Nota**  
L'oggetto globale `awslambda` viene fornito automaticamente dal runtime Node.js di Lambda e non è richiesta alcuna importazione.

**Example gestore abilitato allo streaming delle risposte**  

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

export const echo = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  // As an example, convert event to a readable stream.
  const requestStream = Readable.from(Buffer.from(JSON.stringify(event)));

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

Sebbene `responseStream` offra il metodo `write()` per scrivere sul flusso, ti consigliamo di utilizzare [https://nodejs.org/api/stream.html#streampipelinesource-transforms-destination-callback](https://nodejs.org/api/stream.html#streampipelinesource-transforms-destination-callback)laddove possibile. L'utilizzo di `pipeline()` garantisce che il flusso scrivibile non venga sopraffatto da un flusso leggibile più veloce.

## Terminazione dello streaming
<a name="config-rs-write-functions-end"></a>

Assicurati di terminare correttamente il flusso prima che torni al gestore. Il metodo `pipeline()` gestisce questo aspetto automaticamente.

Per altri casi d'uso, chiama il metodo `responseStream.end()` per terminare correttamente un flusso. Questo metodo segnala che nel flusso non devono essere scritti altri dati. Questo metodo non è necessario se si scrive nel flusso con `pipeline()` o `pipe()`.

A partire da Node.js 24, Lambda non attende più che le promesse non risolte vengano completate dopo il ritorno del gestore o il termine del flusso di risposta. Se la tua funzione dipende da operazioni asincrone aggiuntive, come timer o recuperi, dovresti inserirle nel tuo gestore. `await`

**Example Esempio di terminazione di un flusso con pipeline()**  

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

export const handler = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  await pipeline(requestStream, responseStream);
});
```

**Example Esempio di terminazione di un flusso senza pipeline()**  

```
export const handler = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  responseStream.write("Hello ");
  responseStream.write("world ");
  responseStream.write("from ");
  responseStream.write("Lambda!");
  responseStream.end();
});
```

# Richiamo di una funzione abilitata allo streaming di risposte utilizzando la funzione Lambda URLs
<a name="config-rs-invoke-furls"></a>

**Nota**  
La tua funzione Lambda può ora trasmettere in streaming i payload di risposta tramite l'integrazione proxy di [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/response-transfer-mode-lambda.html).

Puoi richiamare le funzioni abilitate allo streaming delle risposte modificando la modalità di richiamo dell'URL della funzione. La modalità di richiamo determina quale operazione API Lambda utilizza per richiamare la funzione. Le modalità di richiamo disponibili sono:
+ `BUFFERED`: questa è l'opzione predefinita. Lambda richiama la funzione utilizzando l'operazione API `Invoke`. I risultati delle chiamate sono disponibili quando il payload è completo. La dimensione massima del payload è pari a 6 MB.
+ `RESPONSE_STREAM`: consente alla funzione di trasmettere in streaming i risultati del payload non appena diventano disponibili. Lambda richiama la funzione utilizzando l'operazione API `InvokeWithResponseStream`. La dimensione massima del payload di risposta è di 200 MB.

Puoi comunque richiamare la funzione senza lo streaming delle risposte chiamando direttamente l'operazione API `Invoke`. Tuttavia, Lambda trasmette in streaming tutti i payload di risposta per le chiamate che arrivano tramite l'URL della funzione fino a quando non si modifica la modalità di richiamo in `BUFFERED`.

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

**Creazione di un URL della funzione (console)**

1. Aprire la pagina [Funzioni](https://console.aws.amazon.com/lambda/home#/functions) della console Lambda.

1. Scegli il nome della funzione per la quale desideri impostare la modalità di richiamo.

1. Scegli la scheda **Configurazione**, quindi scegli **URL della funzione**.

1. Scegli **Modifica**, quindi scegli **Impostazioni aggiuntive**.

1. In **Modalità di richiamo**, scegli la modalità di richiamo desiderata.

1. Scegli **Save** (Salva).

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

**Per impostare la modalità di richiamo di un URL della funzione (AWS CLI)**

```
aws lambda update-function-url-config \
  --function-name my-function \
  --invoke-mode RESPONSE_STREAM
```

------
#### [ CloudFormation ]

**Per impostare la modalità di richiamo di un URL della funzione (CloudFormation)**

```
MyFunctionUrl:
  Type: AWS::Lambda::Url
  Properties:
    AuthType: AWS_IAM
    InvokeMode: RESPONSE_STREAM
```

------

Per ulteriori informazioni sulla configurazione della funzione URLs, vedere Funzione [ URLsLambda](urls-configuration.md).

# Tutorial: creazione di una funzione Lambda di streaming delle risposte con un URL della funzione
<a name="response-streaming-tutorial"></a>

In questo tutorial viene creata una funzione Lambda definita come archivio file .zip con un endpoint funzione URL che restituisce un flusso di risposte. Per ulteriori informazioni sulla configurazione della funzione URLs, vedere[Funzione URLs](urls-configuration.md).

## Prerequisiti
<a name="response-streaming-prepare"></a>

Questo tutorial presuppone una certa conoscenza delle operazioni di base di Lambda e della console relativa. Se non lo si è già fatto, seguire le istruzioni riportate in [Creare una funzione Lambda con la console](getting-started.md#getting-started-create-function) per creare la prima funzione Lambda.

Per completare i passaggi seguenti, è necessaria la [AWS CLI versione 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html). I comandi e l'output previsto sono elencati in blocchi separati:

```
aws --version
```

Verrà visualizzato l'output seguente:

```
aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2
```

Per i comandi lunghi viene utilizzato un carattere di escape (`\`) per dividere un comando su più righe.

In Linux e macOS utilizzare la propria shell e il proprio programma di gestione dei pacchetti preferiti.

**Nota**  
Su Windows, alcuni comandi della CLI Bash utilizzati comunemente con Lambda (ad esempio, `zip`) non sono supportati dai terminali integrati del sistema operativo. Per ottenere una versione integrata su Windows di Ubuntu e Bash, [installa il sottosistema Windows per Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10). I comandi della CLI di esempio in questa guida utilizzano la formattazione Linux. Se si utilizza la CLI di Windows, i comandi che includono documenti JSON in linea dovranno essere riformattati. 

## Creazione di un ruolo di esecuzione
<a name="response-streaming-create-iam-role"></a>

Creare il [ruolo di esecuzione](lambda-intro-execution-role.md) che offre l'autorizzazione alla funzione Lambda per accedere alle risorse AWS .

**Creazione di un ruolo di esecuzione**

1. Aprire la pagina [Roles (Ruoli)](https://console.aws.amazon.com/iam/home#/roles) della console IAM AWS Identity and Access Management .

1. Scegli **Crea ruolo**.

1. Creare un ruolo con le seguenti proprietà:
   + **Tipo di entità affidabile**: **servizio di AWS **
   + **Caso d'uso**: **Lambda**
   + **Autorizzazioni**: **AWSLambdaBasicExecutionRole**
   + **Nome ruolo** – **response-streaming-role**

La **AWSLambdaBasicExecutionRole**policy dispone delle autorizzazioni necessarie alla funzione per scrivere log su Amazon CloudWatch Logs. Una volta creato il ruolo, prendi nota del relativo nome della risorsa Amazon (ARN). Questo valore servirà nella fase successiva.

## Creazione di una funzione di streaming delle risposte (AWS CLI)
<a name="response-streaming-tutorial-create-function-cli"></a>

Crea una funzione Lambda di streaming delle risposte con un endpoint URL della funzione utilizzando l' AWS Command Line Interface (AWS CLI).

**Creazione di una funzione in grado di trasmettere le risposte**

1. Copiare il codice di esempio seguente in un file denominato `index.js`. Questa funzione trasmette tre risposte, separate da 1 secondo.

   ```
   exports.handler = awslambda.streamifyResponse(
   	async (event, responseStream, _context) => {
   		// Metadata is a JSON serializable JS object. Its shape is not defined here.
   		const metadata = {
   		statusCode: 200,
   		headers: {
   			"Content-Type": "application/json",
   			"CustomHeader": "outerspace"
   		}
   		};
   	
   		// Assign to the responseStream parameter to prevent accidental reuse of the non-wrapped stream.
   		responseStream = awslambda.HttpResponseStream.from(responseStream, metadata);
   	
   		responseStream.write("Streaming with Helper \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.write("Hello 0 \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.write("Hello 1 \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.write("Hello 2 \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.end();
   		await responseStream.finished();
   	}
     );
   ```

1. Crea un pacchetto di implementazione.

   ```
   zip function.zip index.js
   ```

1. Creare una funzione Lambda con il comando `create-function`. Sostituisci il valore di `--role` con l'ARN del ruolo del passaggio precedente. Questo comando imposta il timeout della funzione su 10 secondi, il che consente alla funzione di trasmettere tre risposte.

   ```
   aws lambda create-function \
     --function-name my-streaming-function \
     --runtime nodejs24.x \
     --zip-file fileb://function.zip \
     --handler index.handler \
     --timeout 10 \
     --role arn:aws:iam::123456789012:role/response-streaming-role
   ```

**Creazione di un URL della funzione**

1. Aggiungi alla tua funzione una politica basata sulle risorse che concede e autorizzazioni. `lambda:InvokeFunctionUrl` `lambda:InvokeFunction` Ogni istruzione deve essere aggiunta in un comando separato. Sostituisci il valore di `--principal` con il tuo Account AWS ID.

   ```
   aws lambda add-permission \
     --function-name my-streaming-function \
     --action lambda:InvokeFunctionUrl \
     --statement-id UrlPolicyInvokeURL \
     --principal 123456789012 \
     --function-url-auth-type AWS_IAM
   ```

   ```
   aws lambda add-permission \
       --function-name my-streaming-function \
       --action lambda:InvokeFunction \
       --statement-id UrlPolicyInvokeFunction \
       --principal 123456789012
   ```

1. Crea un endpoint URL per la funzione con il comando `create-function-url-config`.

   ```
   aws lambda create-function-url-config \
     --function-name my-streaming-function \
     --auth-type AWS_IAM \
     --invoke-mode RESPONSE_STREAM
   ```
**Nota**  
Se ricevi un errore in merito`--invoke-mode`, potrebbe essere necessario eseguire l'aggiornamento a una [versione più recente di AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

## Verifica l'endpoint URL della funzione
<a name="response-streaming-tutorial-test"></a>

Testa l'integrazione richiamando la tua funzione. Puoi aprire l'URL della funzione in un browser oppure puoi usare curl.

```
curl --request GET "https://abcdefghijklm7nop7qrs740abcd.lambda-url.us-east-1.on.aws/" --user "AKIAIOSFODNN7EXAMPLE" --aws-sigv4 "aws:amz:us-east-1:lambda" --no-buffer
```

La nostra funzione URL utilizza il tipo di autenticazione `IAM_AUTH`. Ciò implica che devi firmare le richieste sia con la [chiave di accesso AWS che con la chiave segreta](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html). Nel comando precedente, sostituiscilo `AKIAIOSFODNN7EXAMPLE` con l'ID della chiave di AWS accesso. Inserisci la tua chiave AWS segreta quando richiesto. Se non disponi della chiave AWS segreta, puoi invece [utilizzare AWS credenziali temporanee](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html).

Dovresti ottenere una risposta simile a questa:

```
Streaming with Helper 
Hello 0 
Hello 1
Hello 2
```

## Pulizia delle risorse
<a name="cleanup"></a>

Ora è possibile eliminare le risorse create per questo tutorial, a meno che non si voglia conservarle. Eliminando AWS le risorse che non utilizzi più, eviti addebiti inutili a tuo carico. Account AWS

**Come eliminare il ruolo di esecuzione**

1. Aprire la pagina [Ruoli](https://console.aws.amazon.com/iam/home#/roles) della console IAM.

1. Selezionare il ruolo di esecuzione creato.

1. Scegliere **Elimina**.

1. Inserisci il nome del ruolo nel campo di immissione testo e seleziona **Delete** (Elimina).

**Per eliminare la funzione Lambda**

1. Aprire la pagina [Functions (Funzioni)](https://console.aws.amazon.com/lambda/home#/functions) della console Lambda.

1. Selezionare la funzione creata.

1. Scegliere **Operazioni**, **Elimina**.

1. Digita **confirm** nel campo di immissione testo e scegli **Delete** (Elimina).