Generierung von HTTP-Antworten in Anforderungsauslösern - Amazon CloudFront

Generierung von HTTP-Antworten in Anforderungsauslösern

Wenn CloudFront eine Anforderung erhält, können Sie eine Lambda-Funktion verwenden, um eine HTTP-Antwort zu generieren, die CloudFront direkt an den Betrachter zurückgibt, ohne die Antwort an den Ursprung weiterzuleiten. Die Generierung von HTTP-Antworten reduziert die Auslastung des Ursprungs und reduziert in der Regel auch die Latenzzeit für den Betrachter.

Einige häufige Szenarien für die Generierung von HTTP-Antworten sind die folgenden:

  • Rückgabe einer kleinen Website an den Betrachter.

  • Rückgabe eines HTTP 301- oder 302-Statuscodes, um den Benutzer auf eine andere Webseite umzuleiten.

  • Rückgabe eines HTTP 401-Statuscodes an den Betrachter, wenn sich der Benutzer nicht authentifiziert hat.

Eine Lambda@Edge-Funktion kann eine HTTP-Antwort generieren, wenn die folgenden CloudFront-Ereignisse auftreten:

Betrachteranforderungsereignisse

Wenn eine Funktion durch ein Betrachteranfrage-Ereignis ausgelöst wird, gibt CloudFront die Antwort an den Betrachter zurück und speichert sie nicht im Cache.

Ursprungsanforderungsereignisse

Wenn eine Funktion durch ein Ursprungsanforderungsereignis ausgelöst wird, prüft CloudFront den Edge-Zwischenspeicher auf eine Antwort, die zuvor von der Funktion generiert wurde.

  • Wenn sich die Antwort im Zwischenspeicher befindet, wird die Funktion nicht ausgeführt und CloudFront gibt die zwischengespeicherte Antwort an den Betrachter zurück.

  • Wenn sich die Antwort nicht im Zwischenspeicher befindet, wird die Funktion ausgeführt, CloudFront gibt die Antwort an den Betrachter zurück und speichert sie ebenfalls im Cache.

Beispiel-Code zum Generieren von HTTP-Antworten finden Sie unter Beispielfunktionen für Lambda@Edge. Sie können auch die HTTP-Antworten in Antwortauslösern ersetzen. Weitere Informationen finden Sie unter Aktualisieren von HTTP-Antworten in Ursprungsantwortauslösern.

Programmiermodell

Dieser Abschnitt enthält Informationen über das Programmiermodell für die Nutzung von Lambda@Edge zum Generieren von HTTP-Antworten.

Antwortobjekt

Die Antwort, die Sie als result-Parameter der callback-Methode zurückgeben, sollte folgenden Aufbau haben (beachten Sie, dass nur das status-Feld erforderlich ist).

const response = { body: 'content', bodyEncoding: 'text' | 'base64', headers: { 'header name in lowercase': [{ key: 'header name in standard case', value: 'header value' }], ... }, status: 'HTTP status code', statusDescription: 'status description' };

Das Antwortobjekt kann die folgenden Werte enthalten:

body

Der Body, falls vorhanden, den CloudFront in der generierten Antwort zurückgeben soll.

bodyEncoding

Die Kodierung für den Wert, den Sie in festgelegt habe body. Die einzigen gültigen Codierungen sind text und base64. Wenn Sie body in das response-Objekt einbinden, aber bodyEncoding auslassen, behandelt CloudFront den Textkörper als Text.

Wenn Sie bodyEncoding als base64 festlegen, der Textkörper jedoch kein gültiges base64 ist, gibt CloudFront einen Fehler zurück.

headers

Header, die CloudFront in der generierten Antwort zurückgegeben soll. Beachten Sie Folgendes:

  • Die Schlüssel im headers-Objekt sind kleingeschriebene Versionen von Standard-HTTP-Header-Namen. Über diese Kleinbuchstaben-Schlüssel haben Sie Zugriff auf die Headerwerte (ohne Berücksichtigung von Groß-/Kleinschreibung).

  • Jeder Header (z. B. headers["accept"] oder headers["host"]) ist ein Array mit Schlüssel-Wert-Paaren. Für einen bestimmten Header enthält das Array ein Schlüssel-Wert-Paar für jeden Wert in der generierten Antwort.

  • key (optional) ist der von Groß- und Kleinschreibung unabhängige Name des Headers, wie er in einer HTTP-Anforderung erscheint (z. B. accept oder host).

  • Geben Sie value als Header-Wert an.

  • Wenn Sie den Header-Schlüsselteil des Schlüssel-Wert-Paares nicht aufnehmen, fügt Lambda@Edge automatisch einen Header-Schlüssel mit dem von Ihnen angegebenen Header-Namen ein. Unabhängig davon, wie Sie den Header-Namen formatiert haben, wird der automatisch eingefügte Header-Schlüssel mit einem großen Anfangsbuchstaben für jeden Teil formatiert, wobei die einzelnen Teile durch Bindestriche (-) getrennt werden.

    Beispielsweise können Sie einen Header wie den folgenden ohne Header-Schlüssel hinzufügen: 'content-type': [{ value: 'text/html;charset=UTF-8' }]

    In diesem Beispiel erstellt Lambda@Edge den folgenden Header-Schlüssel: Content-Type.

Weitere Informationen zu Einschränkungen zur Verwendung von Headern finden Sie unter Einschränkungen für Edge-Funktionen.

status

Der HTTP-Statuscode, den CloudFront für die folgenden Aufgaben verwenden soll:

Wenn der status-Wert nicht zwischen 200 und 599 liegt, gibt CloudFront einen Fehler an den Betrachter zurück.

statusDescription

Die Beschreibung, die CloudFront in der Antwort zurückgeben soll, um den HTTP-Statuscode zu ergänzen. Sie müssen keine Standardbeschreibungen verwenden (z. B. OK für einen HTTP-Statuscode 200).

Errors

Es folgen mögliche Fehler für generierte HTTP-Antworten.

Antwort enthält einen Body und legt 204 (No Content) als Status fest

Wenn eine Funktion durch eine Betrachteranfrage ausgelöst wird, gibt CloudFront einen HTTP 502-Statuscode (Bad Gateway) an den Betrachter zurück, wenn beide der folgenden Bedingungen erfüllt sind:

  • Der Wert von status ist 204 (No Content)

  • Die Antwort enthält einen Wert für body

Der Grund hierfür ist, dass Lambda@Edge eine optionale Einschränkung aus RFC 2616 umsetzt, die besagt, dass eine HTTP 204-Antwort keinen Nachrichtentext zu enthalten braucht.

Beschränkungen für die Größe der generierten Antwort

Die maximale Größe einer durch eine Lambda-Funktion generierten Antwort hängt von dem Ereignis ab, das die Funktion ausgelöst hat:

  • Betrachteranfrage-Ereignisse – 40 KB

  • Ursprungsanfrageereignisse – 1 MB

Wenn die Antwort die zulässige Größe überschreitet, gibt CloudFront einen Statuscode HTTP 502 (Bad Gateway) an den Betrachter zurück.

Pflichtfelder

Das Feld status ist ein Pflichtfeld.

Alle anderen Felder sind optional.