Verwenden Sie Lambda-Funktionen als Ziele eines Application Load Balancer - Elastic Load Balancing

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verwenden Sie Lambda-Funktionen als Ziele eines Application Load Balancer

Sie können Ihre Lambda-Funktionen als Ziele registrieren und eine Listener-Regel für das Weiterleiten von Anfragen an die Zielgruppe für Ihre Lambda-Funktion konfigurieren. Wenn der Load Balancer die Anfrage an eine Zielgruppe mit einer Lambda-Funktion als Ziel weiterleitet, ruft er Ihre Lambda-Funktion auf und übergibt den Inhalt der Anfrage im JSON-Format an die Lambda-Funktion.

Der Load Balancer ruft die Lambda-Funktion direkt auf, anstatt eine Netzwerkverbindung zu verwenden. Daher gibt es keine Anforderungen für die ausgehenden Regeln der Network Load Balancer Balancer-Sicherheitsgruppen.

Einschränkungen
  • Die Lambda-Funktion und die Zielgruppe müssen sich im gleichen Konto und in der gleichen Region befinden.

  • Der Anfragetext, den Sie an eine Lambda-Funktion senden können, darf maximal 1 MB betragen. Entsprechende Größenbeschränkungen finden Sie unter HTTP-Header-Limits.

  • Die Lambda-Funktion darf als Antwort-JSON maximal 1 MB senden.

  • WebSockets werden nicht unterstützt. Upgrade-Anfragen werden mit dem HTTP 400-Code abgelehnt.

  • Local Zones werden nicht unterstützt.

  • Automatic Target Weights (ATW) wird nicht unterstützt.

Eine Demo finden Sie unter Lambda-Ziel im Application Load Balancer.

Vorbereiten der Lambda-Funktion

Die folgenden Empfehlungen gelten, wenn Sie Ihre Lambda-Funktion mit einem Application Load Balancer verwenden.

Berechtigungen zum Aufrufen der Lambda-Funktion

Wenn Sie die Zielgruppe erstellen und die Lambda-Funktion mithilfe der AWS Management Console registrieren, fügt die Konsole in Ihrem Namen die erforderlichen Berechtigungen zu Ihrer Lambda-Funktionsrichtlinie hinzu. Andernfalls müssen Sie, nachdem Sie die Zielgruppe erstellt und die Funktion mit dem registriert haben AWS CLI, den Befehl add-permission verwenden, um Elastic Load Balancing die Berechtigung zum Aufrufen Ihrer Lambda-Funktion zu erteilen. Es wird empfohlen, die aws:SourceAccount- und aws:SourceArn-Bedingungsschlüssel zum Einschränken des Funktionsaufrufs an die angegebene Zielgruppe zu verwenden. Weitere Informationen finden Sie unter Das Problem des verwirrten Stellvertreters im IAM-Benutzerhandbuch.

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
Versionsverwaltung der Lambda-Funktion

Sie können eine Lambda-Funktion pro Zielgruppe registrieren. Um sicherzustellen, dass Sie Ihre Lambda-Funktion ändern können und dass der Load Balancer immer die aktuelle Version der Lambda-Funktion aufruft, erstellen Sie einen Funktionsalias und schließen Sie den Alias in den Funktions-ARN ein, wenn Sie die Lambda-Funktion bei dem Load Balancer registrieren. Weitere Informationen finden Sie unter AWS Lambda Funktionsaliasnamen im Developer Guide.AWS Lambda

Funktion Zeitüberschreitung

Der Load Balancer wartet, bis die Lambda-Funktion reagiert oder eine Zeitüberschreitung auftritt. Es wird empfohlen, die Zeitüberschreitung der Lambda-Funktion auf der Grundlage Ihrer erwarteten Laufzeit zu konfigurieren. Informationen zum Standard-Timeout-Wert und wie Sie ihn ändern können, finden Sie unter Lambda-Funktions-Timeout konfigurieren. Informationen zum maximalen Timeout-Wert, den Sie konfigurieren können, finden Sie unter Kontingente.AWS Lambda

Erstellen Sie einer Zielgruppe für die Lambda-Funktion

Erstellen Sie eine Zielgruppe, die bei der Weiterleitung von Anforderungen verwendet wird. Wenn der Inhalt der Anfrage mit einer Listener-Regel mit einer Aktion für ihre Weiterleitung an diese Zielgruppe übereinstimmt, ruft der Load Balancer die registrierte Lambda-Funktion auf.

Console
So erstellen Sie eine Zielgruppe und registrieren die Lambda-Funktion
  1. Öffnen Sie die EC2 Amazon-Konsole unter https://console.aws.amazon.com/ec2/.

  2. Wählen Sie im Navigationsbereich unter Load Balancing die Option Target Groups (Zielgruppen) aus.

  3. Wählen Sie Zielgruppe erstellen aus.

  4. Wählen Sie unter Zieltyp auswählen die Option Lambda-Funktion aus.

  5. Geben Sie unter Zielgruppenname einen Namen für die Zielgruppe ein.

  6. (Optional) Um Zustandsprüfungen zu aktivieren, wählen Sie Aktivieren im Abschnitt Zustandsprüfungen aus.

  7. (Optional) Erweitern Sie Tags. Wählen Sie für jedes Tag die Option Neues Tag hinzufügen aus und geben Sie einen Tag-Schlüssel und einen Tag-Wert ein.

  8. Wählen Sie Weiter aus.

  9. Wenn Sie bereit sind, die Lambda-Funktion zu registrieren, wählen Sie Lambda-Funktion auswählen und wählen Sie die Lambda-Funktion aus der Liste aus, oder wählen Sie Eine Lambda-Funktion eingeben ARN und geben Sie den ARN der Lambda-Funktion ein.

    Wenn Sie noch nicht bereit sind, die Lambda-Funktion zu registrieren, wählen Sie Lambda-Funktion später registrieren und registrieren Sie das Ziel später. Weitere Informationen finden Sie unter Ziele registrieren.

  10. Wählen Sie Zielgruppe erstellen aus.

AWS CLI
Um eine Zielgruppe vom Typ zu erstellen lambda

Verwenden Sie den create-target-group-Befehl.

aws elbv2 create-target-group \ --name my-target-group \ --target-type lambda
Um die Lambda-Funktion zu registrieren

Verwenden Sie den Befehl register-targets.

aws elbv2 register-targets \ --target-group-arn target-group-arn \ --targets Id=lambda-function-arn
CloudFormation
So erstellen Sie eine Zielgruppe und registrieren die Lambda-Funktion

Definieren Sie eine Ressource des Typs. AWS::ElasticLoadBalancingV2::TargetGroup Wenn Sie noch nicht bereit sind, die Lambda-Funktion zu registrieren, können Sie die Targets Eigenschaft weglassen und später hinzufügen.

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

Empfangen von Ereignissen vom Load Balancer

Der Load Balancer unterstützt den Lambda-Aufruf für Anfragen über HTTP und HTTPS. Der Load Balancer sendet ein Ereignis im JSON-Format. Der Load Balancer fügt zu jeder Anfrage die folgenden Header hinzu: X-Amzn-Trace-Id, X-Forwarded-For, X-Forwarded-Port und X-Forwarded-Proto.

Wenn der content-encoding-Header vorhanden ist, codiert der Load Balancer mit Base64 den Text und setzt isBase64Encoded auf true.

Wenn der content-encoding-Header nicht vorhanden ist, hängt die Base64-Codierung vom Inhaltstyp ab. Bei den folgenden Typen sendet der Load Balancer den Text unverändert und setzt ihn isBase64Encoded auffalse: text/*,. application/json, application/javascript, and application/xml Andernfalls codiert der Load Balancer den Text mit Base64 und stellt isBase64Encoded auf true ein.

Es folgt ein Beispielereignis.

{ "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" }

Antwort an den Load Balancer

Die Antwort von Ihrer Lambda-Funktion muss den Base64-codierten Status, Statuscode und die Header beinhalten. Sie können den Text weglassen.

Um den binären Inhalt in den Text der Antwort einzuschließen, müssen Sie den Inhalt mit Base64 codieren und isBase64Encoded auf true einstellen. Der Load Balancer decodiert die Inhalte, um den binären Inhalt abzurufen, und sendet ihn im Text der HTTP-Antwort zum Client.

Der Load Balancer berücksichtigt keine hop-by-hop Header wie oder. Connection Transfer-Encoding Sie können den Content-Length-Header weglassen, da der Load Balancer ihn berechnet, bevor er Antworten an Clients sendet.

Nachfolgend finden Sie eine Beispielantwort von einer auf nodejs basierenden Lambda-Funktion.

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

Lambda-Funktionsvorlagen, die mit Application Load Balancers funktionieren, finden Sie unter application-load-balancer-serverless-app auf github. Öffnen Sie alternativ die Lambda-Konsole, wählen Sie Anwendungen, Anwendung erstellen und dann eine der folgenden Optionen aus: AWS Serverless Application Repository

  • ALB-Lambda-Ziel-S3 UploadFileto

  • ALB-Lambda-Ziel- BinaryResponse

  • ALB-Lambda-Ziel-IP WhatisMy

Header mit mehreren Werten

Wenn Anfragen von einem Client oder Antworten von einer Lambda-Funktion Header mit mehreren Werten, denselben Header mehrmals oder Abfrageparameter mit mehreren Werten für den gleichen Schlüssel enthalten, können Sie Unterstützung für die Syntax von Headern mit mehreren Werten aktivieren Nach dem Aktivieren von Headern mit mehreren Werten werden in den Headern und Abfrageparametern, die zwischen dem Load Balancer und der Lambda-Funktion ausgetauscht werden, Arrays anstelle von Zeichenfolgen verwendet. Wenn Sie die Syntax für Header mit mehreren Werten nicht aktivieren und ein Header oder Abfrageparameter mehrere Werte aufweist, verwendet der Load Balancer den zuletzt empfangenen Wert.

Anfragen mit Headern mit mehreren Werten

Die Namen der Felder, die für Header und Abfragezeichenfolgeparameter verwendet werden, unterscheiden sich abhängig davon, ob Sie Header mit mehreren Werten für die Zielgruppe aktivieren.

Die folgende Beispielanfrage enthält zwei Abfrageparameter mit demselben Schlüssel:

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

Bei dem Standardformat verwendet der Load Balancer den letzten vom Client gesendeten Wert und sendet Ihnen mit queryStringParameters ein Ereignis, das Abfragezeichenfolgeparameter umfasst. Zum Beispiel:

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

Wenn Sie Header mit mehreren Werten aktivieren, verwendet der Load Balancer beide vom Client gesendeten Schlüsselwerte und sendet Ihnen einen Zeichenfolgeparameter für eine Ereignisabfrage, der multiValueQueryStringParameters verwendet. Zum Beispiel:

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

Dementsprechend gilt Folgendes, wenn der Client eine Anfrage mit zwei Cookies im Header sendet:

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

Bei dem Standardformat verwendet der Load Balancer den letzten vom Client gesendeten Cookie und sendet Ihnen mit headers ein Ereignis, das Header umfasst. Zum Beispiel:

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

Bei Headern mit mehreren Werten verwendet der Load Balancer beide vom Client gesendeten Cookies und sendet Ihnen mit multiValueHeaders ein Ereignis, das Header umfasst: Zum Beispiel:

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

Wenn die Abfrageparameter URL-kodiert sind, dekodiert der Load Balancer sie nicht. Sie müssen sie in Ihrer Lambda-Funktion dekodieren.

Antworten mit Headern mit mehreren Werten

Der Name der für Header verwendeten Felder unterscheidet sich abhängig davon, ob Sie Header mit mehreren Werten für die Zielgruppe verwenden. Sie müssen multiValueHeaders verwenden, wenn Sie Header mit mehreren Werten aktivieren. Andernfalls verwenden Sie headers.

Bei dem Standardformat können Sie ein einziges Cookie angeben:

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

Bei Headern mit mehreren Werten müssen Sie wie folgt mehrere Cookies angeben:

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

Der Load Balancer sendet die Header ggf. in einer anderen Reihenfolge als der in der Lambda-Antwortnutzlast angegebenen Reihenfolge an den Client. Verlassen Sie sich daher nicht darauf, dass Header in einer bestimmten Reihenfolge zurückgegeben werden.

Aktivieren von Headern mit mehreren Werten

Sie können Header mit mehreren Werten für eine Zielgruppe mit dem Zieltyp lambda aktivieren oder deaktivieren.

Console
Um Header mit mehreren Werten zu aktivieren
  1. Öffnen Sie die EC2 Amazon-Konsole unter https://console.aws.amazon.com/ec2/.

  2. Wählen Sie im Navigationsbereich unter Load Balancing die Option Target Groups (Zielgruppen) aus.

  3. Wählen Sie den Namen der Zielgruppe aus, um deren Detailseite zu öffnen.

  4. Klicken Sie auf der Registerkarte Attribute auf Bearbeiten.

  5. Aktivieren Sie Header mit mehreren Werten.

  6. Wählen Sie Änderungen speichern aus.

AWS CLI
Um mehrwertige Header zu aktivieren

Verwenden Sie den modify-target-group-attributesBefehl mit dem lambda.multi_value_headers.enabled Attribut.

aws elbv2 modify-target-group-attributes \ --target-group-arn target-group-arn \ --attributes "Key=lambda.multi_value_headers.enabled,Value=true"
CloudFormation
Um Header mit mehreren Werten zu aktivieren

Aktualisieren Sie die AWS::ElasticLoadBalancingV2::TargetGroupRessource so, dass sie das lambda.multi_value_headers.enabled Attribut enthält.

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"

Aktivieren von Zustandsprüfungen

Zustandsprüfungen sind für Zielgruppen des Typs lambda standardmäßig deaktiviert. Sie können Zustandsprüfungen aktivieren, um ein DNS Failover mit Amazon Route 53 zu implementieren. Die Lambda-Funktion kann den Zustand eines Downstream-Service prüfen, bevor sie auf die Anfrage einer Zustandsprüfung antwortet. Wenn die Antwort von der Lambda-Funktion auf eine nicht bestandene Zustandsprüfung hinweist, wird die nicht bestandene Zustandsprüfung an Amazon Route 53 übergeben. Sie können Amazon Route 53 für das Failover auf einen Sicherungsanwendungs-Stack konfigurieren.

Ihnen werden für Zustandsprüfungen genauso wie für jeden anderen Lambda-Funktionsaufruf Gebühren erhoben.

Im Folgenden finden Sie das Format des an Ihre Lambda-Funktion gesendeten Zustandsprüfungsereignisses. Um zu prüfen, ob ein Ereignis eine Zustandsprüfungsereignis ist, überprüfen Sie den Wert des Feldes "user-agent". Der Benutzeragent für Zustandsprüfungen ist 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
Um Gesundheitschecks für eine lambda Zielgruppe zu aktivieren
  1. Öffnen Sie die EC2 Amazon-Konsole unter https://console.aws.amazon.com/ec2/.

  2. Wählen Sie im Navigationsbereich unter Load Balancing die Option Target Groups (Zielgruppen) aus.

  3. Wählen Sie den Namen der Zielgruppe aus, um deren Detailseite zu öffnen.

  4. Wählen Sie in der Registerkarte Health checks (Zustandsprüfungen) die Option Edit (Bearbeiten) aus.

  5. Wählen Sie unter Zustandsprüfungen die Option Aktivieren aus.

  6. (Optional) Aktualisieren Sie die Einstellungen für die Gesundheitsprüfung nach Bedarf.

  7. Wählen Sie Änderungen speichern aus.

AWS CLI
Um Gesundheitschecks für eine lambda Zielgruppe zu aktivieren

Verwenden Sie den modify-target-group-Befehl.

aws elbv2 modify-target-group \ --target-group-arn target-group-arn \ --health-check-enabled
CloudFormation
Um Gesundheitschecks für eine lambda Zielgruppe zu aktivieren

Aktualisieren Sie die AWS::ElasticLoadBalancingV2::TargetGroupRessource.

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

Registrieren Sie die Lambda-Funktion

Sie können für jede Zielgruppe eine einzelne Lambda-Funktion registrieren. Um eine Lambda-Funktion zu ersetzen, empfehlen wir, dass Sie eine neue Zielgruppe erstellen, die neue Funktion bei der neuen Zielgruppe registrieren und die Listener-Regeln aktualisieren, um die neue Zielgruppe zu verwenden.

Console
So registrieren Sie eine Lambda-Funktion
  1. Öffnen Sie die EC2 Amazon-Konsole unter https://console.aws.amazon.com/ec2/.

  2. Wählen Sie im Navigationsbereich unter Load Balancing die Option Target Groups (Zielgruppen) aus.

  3. Wählen Sie den Namen der Zielgruppe aus, um deren Detailseite zu öffnen.

  4. Wenn auf der Registerkarte Ziele keine Lambda-Funktion registriert ist, wählen Sie Ziel registrieren aus.

  5. Wählen Sie die Lambda-Funktion aus oder geben Sie ihren ARN ein.

  6. Wählen Sie Register aus.

AWS CLI
So registrieren Sie eine Lambda-Funktion

Verwenden Sie den Befehl register-targets.

aws elbv2 register-targets \ --target-group-arn target-group-arn \ --targets Id=lambda-function-arn
CloudFormation
So registrieren Sie eine Lambda-Funktion

Aktualisieren Sie die Ressource 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

Aufheben der Registrierung der Lambda-Funktion

Wenn Sie zu Ihrer Lambda-Funktion keinen Datenverkehr mehr senden müssen, können Sie ihre Registrierung aufheben. Nachdem Sie die Registrierung einer Lambda-Funktion aufgehoben haben, schlagen laufende Anfragen mit HTTP-5XX-Fehlermeldungen fehl.

Um eine Lambda-Funktion zu ersetzen, empfehlen wir, dass Sie eine neue Zielgruppe erstellen, die neue Funktion bei der neuen Zielgruppe registrieren und die Listener-Regeln aktualisieren, um die neue Zielgruppe zu verwenden.

Console
Um eine Lambda-Funktion zu deregistrieren
  1. Öffnen Sie die EC2 Amazon-Konsole unter https://console.aws.amazon.com/ec2/.

  2. Wählen Sie im Navigationsbereich unter Load Balancing die Option Target Groups (Zielgruppen) aus.

  3. Wählen Sie den Namen der Zielgruppe aus, um deren Detailseite zu öffnen.

  4. Wählen Sie auf der Registerkarte Ziele das Ziel aus und klicken Sie auf Abmelden.

  5. Wenn Sie zur Bestätigung aufgefordert werden, wählen Sie Deregister aus.

AWS CLI
Um eine Lambda-Funktion zu deregistrieren

Verwenden Sie den Befehl deregister-targets.

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