Usa le funzioni Lambda come obiettivi di un Application Load Balancer - Sistema di bilanciamento del carico elastico

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

Usa le funzioni Lambda come obiettivi di un Application Load Balancer

Puoi registrare le tue funzioni Lambda come destinazioni e configurare una regola del listener per inoltrare le richieste al gruppo di destinazioni della funzione Lambda. Quando inoltra la richiesta a un gruppo di destinazioni con una funzione Lambda come destinazione, il sistema di bilanciamento del carico richiama la funzione Lambda e trasferisce i contenuti della richiesta alla funzione Lambda, nel formato JSON.

Il load balancer richiama direttamente la funzione Lambda invece di utilizzare una connessione di rete. Pertanto, non esistono requisiti per le regole in uscita dei gruppi di sicurezza Network Load Balancer.

Limiti
  • La funzione Lambda e il gruppo di destinazioni devono trovarsi nello stesso account e nella stessa regione.

  • Le dimensioni massime del corpo della richiesta che puoi inviare a una funzione Lambda sono di 1 MB. Per i limiti correlati delle dimensioni, consulta HTTP header limits.

  • Le dimensioni massime dell'oggetto JSON di risposta che può inviare la funzione Lambda sono di 1 MB.

  • WebSockets non sono supportati. Le richieste di aggiornamento vengono rifiutate con un codice HTTP 400.

  • Le zone locali non sono supportate.

  • Automatic Target Weights (ATW) non è supportato.

Per una demo, consulta Lambda target on Application Load Balancer.

Preparazione della funzione Lambda

Le seguenti raccomandazioni si applicano se utilizzi la funzione Lambda con un Application Load Balancer.

Autorizzazioni a richiamare la funzione Lambda

Se crei il gruppo di destinazioni e registri la funzione Lambda tramite la AWS Management Console, questa aggiunge automaticamente le autorizzazioni richieste alla tua policy delle funzioni Lambda. Altrimenti, dopo aver creato il gruppo target e registrato la funzione utilizzando AWS CLI, è necessario utilizzare il comando add-permission per concedere a Elastic Load Balancing l'autorizzazione a richiamare la funzione Lambda. Consigliamo di includere le chiavi di condizione aws:SourceAccount e aws:SourceArn per limitare l'invocazione della funzione al gruppo di destinazioni specificato. Per ulteriori informazioni, consulta Problema del "confused deputy" nella Guida per l'utente IAM.

aws lambda add-permission \ --function-name lambda-function-arn-with-alias-name \ --statement-id elb1 \ --principal elasticloadbalancing.amazonaws.com \ --action lambda:InvokeFunction \ --source-arn target-group-arn \ --source-account target-group-account-id
Controllo delle versioni della funzione Lambda

Puoi registrare una funzione Lambda per gruppo di destinazioni. Per accertarti di poter cambiare la funzione Lambda e che il sistema di bilanciamento del carico richiami sempre la versione corrente della funzione Lambda, crea un alias della funzione e includilo nell'ARN della funzione al momento della registrazione della funzione con il sistema di bilanciamento del carico. Per ulteriori informazioni, consulta gli alias delle AWS Lambda funzioni nella Guida per gli sviluppatori.AWS Lambda

Timeout della funzione.

Il sistema di bilanciamento del carico attende finché la funzione Lambda non risponde o scade. Ti consigliamo di configurare il timeout della funzione Lambda in base al runtime previsto. Per informazioni sul valore di timeout predefinito e su come modificarlo, consulta Configurare il timeout della funzione Lambda. Per informazioni sul valore di timeout massimo che puoi configurare, vedi quote.AWS Lambda

Creazione di un gruppo di destinazioni per la funzione Lambda

Creare un gruppo target, che viene utilizzato nell'instradamento delle richieste. Se il contenuto della richiesta corrisponde a una regola del listener con un'operazione per l'inoltro al gruppo di destinazioni, il sistema di bilanciamento del carico richiama la funzione Lambda registrata.

Console
Per creare un gruppo di destinazioni e registrare la funzione Lambda
  1. Apri la EC2 console Amazon all'indirizzo https://console.aws.amazon.com/ec2/.

  2. Nel pannello di navigazione, in Load balancing (Bilanciamento del carico) scegli Target Groups (Gruppi di destinazione).

  3. Scegliere Crea gruppo target.

  4. Per Seleziona destinazione, scegli Funzione Lambda.

  5. In Nome gruppo di destinazione, immetti un nome per il gruppo di destinazione.

  6. (Facoltativo) Per abilitare i controlli dell'integrità, scegli Controllo dell'integrità, Abilita.

  7. (Facoltativo) Espandi i tag. Per ogni tag, scegli Aggiungi nuovo tag e inserisci una chiave per il tag e un valore per il tag.

  8. Scegli Next (Successivo).

  9. Se sei pronto per registrare la funzione Lambda, scegli Seleziona una funzione Lambda e scegli la funzione Lambda dall'elenco, oppure scegli Inserisci una funzione Lambda ARN e inserisci l'ARN della funzione Lambda,

    Se non sei pronto per registrare la funzione Lambda, scegli Registra la funzione Lambda più tardi e registra la destinazione in un secondo momento. Per ulteriori informazioni, consulta Registrazione di destinazioni.

  10. Scegliere Crea gruppo target.

AWS CLI
Per creare un gruppo target di tipo lambda

Utilizza il comando create-target-group.

aws elbv2 create-target-group \ --name my-target-group \ --target-type lambda
Per registrare la funzione Lambda

Utilizzate il comando register-targets.

aws elbv2 register-targets \ --target-group-arn target-group-arn \ --targets Id=lambda-function-arn
CloudFormation
Per creare un gruppo di destinazioni e registrare la funzione Lambda

Definire un tipo di risorsa. AWS::ElasticLoadBalancingV2::TargetGroup Se non sei pronto per registrare la funzione Lambda ora, puoi omettere la Targets proprietà e aggiungerla in un secondo momento.

Resources: myTargetGroup: Type: 'AWS::ElasticLoadBalancingV2::TargetGroup' Properties: Name: my-target-group TargetType: lambda Tags: - Key: 'department' Value: '123' Targets: - Id: !Ref myLambdaFunction

Ricezione di eventi dal sistema di bilanciamento del carico

Il sistema di bilanciamento del carico supporta l'invocazione Lambda per le richieste sia da HTTP che HTTPS. Il sistema di bilanciamento del carico invia un evento in formato JSON. Il sistema di bilanciamento del carico aggiunge le seguenti intestazioni a ogni richiesta: X-Amzn-Trace-Id, X-Forwarded-For, X-Forwarded-Port e X-Forwarded-Proto.

Se è presente l'intestazione content-encoding, il sistema di bilanciamento del carico Base64 codifica il corpo e imposta isBase64Encoded su true.

Se l'intestazione content-encoding non è presente, la codifica Base64 dipende dal tipo di contenuto. Per i seguenti tipi, il load balancer invia il corpo così com'è e lo imposta sufalse: isBase64Encoded text/*,. application/json, application/javascript, and application/xml In caso contrario, il sistema di bilanciamento del carico Base64 codifica il corpo e imposta isBase64Encoded su true.

Di seguito è riportato un esempio di evento.

{ "requestContext": { "elb": { "targetGroupArn": "arn:aws:elasticloadbalancing:region:123456789012:targetgroup/my-target-group/6d0ecf831eec9f09" } }, "httpMethod": "GET", "path": "/", "queryStringParameters": {parameters}, "headers": { "accept": "text/html,application/xhtml+xml", "accept-language": "en-US,en;q=0.8", "content-type": "text/plain", "cookie": "cookies", "host": "lambda-846800462-us-east-2.elb.amazonaws.com", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6)", "x-amzn-trace-id": "Root=1-5bdb40ca-556d8b0c50dc66f0511bf520", "x-forwarded-for": "72.21.198.66", "x-forwarded-port": "443", "x-forwarded-proto": "https" }, "isBase64Encoded": false, "body": "request_body" }

Risposta al sistema di bilanciamento del carico

La risposta dalla funzione Lambda deve includere lo stato della codifica Base64, il codice di stato e le intestazioni. Puoi omettere il corpo della risposta.

Per includere un contenuto binario nel corpo della risposta, devi sottoporre a codifica Base64 il contenuto e impostare isBase64Encoded su true. Il sistema di bilanciamento del carico decodifica il contenuto per recuperare la parte binaria e inviarla al client nel corpo della risposta HTTP.

Il sistema di bilanciamento del carico non rispetta le hop-by-hop intestazioni, come o. Connection Transfer-Encoding Puoi omettere l'intestazione Content-Length in quanto il sistema di bilanciamento del carico la calcola prima di inviare le risposte ai client.

Di seguito è riportata una risposta di esempio da una funzione Lambda basata su nodejs.

{ "isBase64Encoded": false, "statusCode": 200, "statusDescription": "200 OK", "headers": { "Set-cookie": "cookies", "Content-Type": "application/json" }, "body": "Hello from Lambda (optional)" }

Per i modelli di funzioni Lambda che funzionano con Application Load Balancer, vedi application-load-balancer-serverless -app su github. In alternativa, aprire la console Lambda, scegli Applicazioni, Crea applicazione e seleziona una delle seguenti opzioni da AWS Serverless Application Repository:

  • Obiettivo Lambda ALB - S3 UploadFileto

  • Obiettivo ALB-Lambda- BinaryResponse

  • ALB-Lambda-Target IP WhatisMy

Intestazioni con più valori

Se le richieste provenienti da un client o le risposte da una funzione Lambda contengono intestazioni con più valori o la stessa intestazione più volte oppure parametri di query con più valori per la stessa chiave, puoi abilitare il supporto della sintassi delle intestazioni con più valori. Dopo aver abilitato le intestazioni con più valori, le intestazioni e i parametri di query scambiati tra il sistema di bilanciamento del carico e la funzione Lambda utilizzano array anziché stringhe. Se non abiliti la sintassi delle intestazioni con più valori e un intestazione o un parametro di query dispongono di più valori, il sistema di bilanciamento del carico utilizza l'ultimo valore ricevuto.

Richieste con intestazioni con più valori

I nomi dei campi utilizzati per le intestazioni e i parametri delle stringhe di query sono diversi a seconda se sono abilitate le intestazioni multivalore per il gruppo target.

La seguente richiesta di esempio ha due parametri di query con la stessa chiave:

http://www.example.com?&myKey=val1&myKey=val2

Con il formato predefinito, il sistema di bilanciamento del carico utilizza l'ultimo valore inviato dal client e invia un evento che include parametri di stringhe di query tramite queryStringParameters. Per esempio:

"queryStringParameters": { "myKey": "val2"},

Con le intestazioni con più valori, il sistema di bilanciamento del carico utilizza entrambi i valori della chiave inviati dal client e invia un evento che include parametri di stringhe di query tramite multiValueQueryStringParameters. Per esempio:

"multiValueQueryStringParameters": { "myKey": ["val1", "val2"] },

Analogamente, supponiamo che il client invii una richiesta con due cookie nell'intestazione:

"cookie": "name1=value1", "cookie": "name2=value2",

Con il formato predefinito, il sistema di bilanciamento del carico utilizza l'ultimo cookie inviato dal client e invia un evento che include intestazioni tramite headers. Per esempio:

"headers": { "cookie": "name2=value2", ... },

Con le intestazioni con più valori, il sistema di bilanciamento del carico utilizza entrambi i cookie inviati dal client e invia un evento che include le intestazioni tramite multiValueHeaders. Per esempio:

"multiValueHeaders": { "cookie": ["name1=value1", "name2=value2"], ... },

Se i parametri di query sono codificati in formato URL, il sistema di bilanciamento del carico non li decodifica. Devi decodificarli nella funzione Lambda.

Risposte con intestazioni con più valori

I nomi dei campi utilizzati per le intestazioni sono diversi a seconda se sono abilitate le intestazioni multivalore per il gruppo target. Devi utilizzare multiValueHeaders se hai abilitato le intestazioni multivalore e headers in caso contrario.

Con il formato predefinito, puoi specificare un singolo cookie:

{ "headers": { "Set-cookie": "cookie-name=cookie-value;Domain=myweb.com;Secure;HttpOnly", "Content-Type": "application/json" }, }

Con le intestazioni con più valori, è necessario specificare più cookie come segue:

{ "multiValueHeaders": { "Set-cookie": ["cookie-name=cookie-value;Domain=myweb.com;Secure;HttpOnly","cookie-name=cookie-value;Expires=May 8, 2019"], "Content-Type": ["application/json"] }, }

Il sistema di bilanciamento del carico potrebbe inviare le intestazioni al client in un ordine diverso rispetto a quello specificato nel payload della risposta di Lambda. Pertanto, non fare affidamento sul fatto che le intestazioni verranno restituite in un ordine specifico.

Abilitazione delle intestazioni con più valori

Puoi abilitare o disabilitare le intestazioni con più valori per un gruppo di destinazioni con tipo lambda.

Console
Per abilitare le intestazioni multivalore
  1. Apri la EC2 console Amazon all'indirizzo https://console.aws.amazon.com/ec2/.

  2. Nel pannello di navigazione, in Bilanciamento del carico scegli Gruppi di destinazione.

  3. Scegli il nome del gruppo di destinazione per aprire la relativa pagina dei dettagli.

  4. Nella scheda Attributi, scegli Modifica.

  5. Abilita le intestazioni multivalore.

  6. Scegli Save changes (Salva modifiche).

AWS CLI
Per abilitare le intestazioni multivalore

Usa il modify-target-group-attributescomando con l'attributo. lambda.multi_value_headers.enabled

aws elbv2 modify-target-group-attributes \ --target-group-arn target-group-arn \ --attributes "Key=lambda.multi_value_headers.enabled,Value=true"
CloudFormation
Per abilitare le intestazioni multivalore

Aggiorna la AWS::ElasticLoadBalancingV2::TargetGrouprisorsa per includere l'lambda.multi_value_headers.enabledattributo.

Resources: myTargetGroup: Type: 'AWS::ElasticLoadBalancingV2::TargetGroup' Properties: Name: my-target-group TargetType: lambda Tags: - Key: 'department' Value: '123' Targets: - Id: !Ref myLambdaFunction TargetGroupAttributes: - Key: "lambda.multi_value_headers.enabled" Value: "true"

Abilitazione dei controlli dell'integrità

Per impostazione predefinita, i controlli dello stato sono disabilitati per i gruppi di destinazioni di tipo lambda. È possibile abilitare i controlli dell'integrità per implementare il failover DNS con Amazon Route 53. La funzione Lambda è in grado di verificare l'integrità di un servizio downstream prima di rispondere alla richiesta di controllo dello stato. Se la risposta dalla funzione Lambda indica un errore del controllo dell'integrità, l'errore viene trasmesso a Route 53. Puoi configurare Route 53 affinché esegua il failover sullo stack di un'applicazione di backup.

Ti verrà addebitato il costo per i controlli dello stato, allo stesso modo che per qualsiasi invocazione della funzione Lambda.

Di seguito è riportato il formato dell'evento di controllo dello stato inviato alla funzione Lambda. Per controllare se un evento è un evento di controllo dello stato, controlla il valore del campo utente-agente. L'agente utente per i controlli dello stato è ELB-HealthChecker/2.0.

{ "requestContext": { "elb": { "targetGroupArn": "arn:aws:elasticloadbalancing:region:123456789012:targetgroup/my-target-group/6d0ecf831eec9f09" } }, "httpMethod": "GET", "path": "/", "queryStringParameters": {}, "headers": { "user-agent": "ELB-HealthChecker/2.0" }, "body": "", "isBase64Encoded": false }
Console
Per abilitare i controlli sanitari per un gruppo lambda target
  1. Apri la EC2 console Amazon all'indirizzo https://console.aws.amazon.com/ec2/.

  2. Nel pannello di navigazione, in Bilanciamento del carico scegli Gruppi di destinazione.

  3. Scegli il nome del gruppo di destinazione per visualizzarne i dettagli.

  4. Nella scheda Controlli dello stato, seleziona Modifica.

  5. In Controlli dell'integrità, scegli Abilita.

  6. (Facoltativo) Aggiorna le impostazioni del controllo sanitario in base alle esigenze.

  7. Scegli Save changes (Salva modifiche).

AWS CLI
Per abilitare i controlli sanitari per un gruppo lambda target

Utilizza il comando modify-target-group.

aws elbv2 modify-target-group \ --target-group-arn target-group-arn \ --health-check-enabled
CloudFormation
Per abilitare i controlli sanitari per un gruppo lambda target

Aggiorna la AWS::ElasticLoadBalancingV2::TargetGrouprisorsa.

Resources: myTargetGroup: Type: 'AWS::ElasticLoadBalancingV2::TargetGroup' Properties: Name: my-target-group TargetType: lambda HealthCheckEnabled: true Tags: - Key: 'department' Value: '123' Targets: - Id: !Ref myLambdaFunction

Registra la funzione Lambda

È possibile registrare una singola funzione Lambda in ogni gruppo di destinazioni. Per sostituire una funzione Lambda, ti consigliamo di creare un nuovo gruppo target, registrare la nuova funzione con il nuovo gruppo target e aggiornare le regole del listener per utilizzare il nuovo gruppo target.

Console
Per registrare una funzione di Lambda
  1. Apri la EC2 console Amazon all'indirizzo https://console.aws.amazon.com/ec2/.

  2. Nel pannello di navigazione, in Bilanciamento del carico scegli Gruppi di destinazione.

  3. Scegli il nome del gruppo di destinazione per visualizzarne i dettagli.

  4. Nella scheda Target, se non è registrata alcuna funzione Lambda, scegli Registra destinazione.

  5. Seleziona la funzione Lambda o inserisci il relativo ARN.

  6. Scegli Registrati.

AWS CLI
Per registrare una funzione di Lambda

Utilizzate il comando register-targets.

aws elbv2 register-targets \ --target-group-arn target-group-arn \ --targets Id=lambda-function-arn
CloudFormation
Per registrare una funzione di Lambda

Aggiorna la risorsa. AWS::ElasticLoadBalancingV2::TargetGroup

Resources: myTargetGroup: Type: 'AWS::ElasticLoadBalancingV2::TargetGroup' Properties: Name: my-target-group TargetType: lambda Tags: - Key: 'department' Value: '123' Targets: - Id: !Ref myLambdaFunction

Annullamento della registrazione della funzione Lambda

Se non hai più bisogno di inviare traffico alla funzione Lambda, puoi annullare la relativa registrazione. Dopo avere annullato la registrazione di una funzione Lambda, le richieste in transito hanno esito negativo con 5XX errori HTTP.

Per sostituire una funzione Lambda, ti consigliamo di creare un nuovo gruppo target, registrare la nuova funzione con il nuovo gruppo target e aggiornare le regole del listener per utilizzare il nuovo gruppo target.

Console
Per annullare la registrazione di una funzione Lambda
  1. Apri la EC2 console Amazon all'indirizzo https://console.aws.amazon.com/ec2/.

  2. Nel pannello di navigazione, in Bilanciamento del carico scegli Gruppi di destinazione.

  3. Scegli il nome del gruppo di destinazione per visualizzarne i dettagli.

  4. Nella scheda Target, seleziona l'obiettivo e scegli Annulla registrazione.

  5. Quando viene richiesta la conferma, seleziona Annulla registrazione.

AWS CLI
Per annullare la registrazione di una funzione Lambda

Utilizza il comando deregister-targets.

aws elbv2 deregister-targets \ --target-group-arn target-group-arn \ --targets Id=lambda-function-arn