Arbeiten mit Anforderungen und Antworten - Amazon CloudFront

Arbeiten mit Anforderungen und Antworten

Informationen zur Verwendung von Lambda@Edge-Anforderungen und -Antworten finden Sie in den folgenden Themen:

Verwenden von Lambda@Edge-Funktionen mit Origin Failover

Sie können Lambda@Edge-Funktionen mit CloudFront-Verteilungen verwenden, die Sie mit Ursprungsgruppen eingerichtet haben, beispielsweise für Origin Failover, das Sie konfigurieren, um eine hohe Verfügbarkeit sicherzustellen. Um eine Lambda-Funktion mit einer Ursprungsgruppe zu verwenden, geben Sie die Funktion in einem Ursprungsanfragen- oder Ursprungsantwort-Auslöser für eine Ursprungsgruppe an, wenn Sie das Zwischenspeicher-Verhalten erstellen.

Weitere Informationen finden Sie hier:

Generieren 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 Viewer 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 Viewer.

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

  • Rückgabe einer kleinen Website an den Viewer.

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

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

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

Viewer-Anforderungsereignisse

Wenn eine Funktion durch ein Viewer-Anfrage-Ereignis ausgelöst wird, gibt CloudFront die Antwort an den Viewer 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 Viewer zurück.

  • Wenn sich die Antwort nicht im Zwischenspeicher befindet, wird die Funktion ausgeführt, CloudFront gibt die Antwort an den Viewer 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 (string)', 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-Statuscodes. Geben Sie den Statuscode als Zeichenfolge an. CloudFront verwendet den angegebenen Statuscode für Folgendes:

  • Rückgabe in der Antwort

  • Im CloudFront-Edge-Zwischenspeicher zwischenspeichern, wenn die Antwort von einer Funktion generiert wurde, die durch ein Ursprungsanforderungsereignis ausgelöst wurde.

  • Anmelden bei CloudFront Standardprotokollierung (Zugriffsprotokolle)

Wenn der status-Wert nicht zwischen 200 und 599 liegt, gibt CloudFront einen Fehler an den Viewer 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).

Fehler

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 Viewer-Anfrage ausgelöst wird, gibt CloudFront einen HTTP 502-Statuscode (Bad Gateway) an den Viewer 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:

  • Viewer-Anfrage-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 Viewer zurück.

Pflichtfelder

Das Feld status ist ein Pflichtfeld.

Alle anderen Felder sind optional.

Aktualisieren von HTTP-Antworten in Ursprungsantwortauslösern

Wenn CloudFront eine HTTP-Antwort vom Ursprungs-Server empfängt, können Sie die HTTP-Antwort modifizieren, um die Rückgabe vom Ursprung zu überschreiben, wenn es einen Auslöser für die Ursprungsantwort gibt, der mit dem Zwischenspeicher-Verhalten verknüpft ist.

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

Anmerkung

Die Funktion muss einen Statuswert zwischen 200 und 599 (jeweils einschließlich) zurückgeben, andernfalls gibt CloudFront einen Fehler an den Viewer zurück.

Sie können auch die HTTP-Antworten in Viewer- und Ursprungsanfrageereignissen ersetzen. Weitere Informationen finden Sie unter Generieren von HTTP-Antworten in Anforderungsauslösern.

Wenn Sie mit der HTTP-Antwort arbeiten, stellt Lambda@Edge den Textkörper, der vom Ursprungsserver zurückgegeben wird, nicht für den Ursprungsantwortauslöser bereit. Sie können einen statischen Inhaltstext erzeugen, indem Sie ihn auf den gewünschten Wert setzen, oder den Text innerhalb der Funktion entfernen, indem Sie den Wert auf leer setzen. Wenn Sie das Textkörperfeld in Ihrer Funktion nicht aktualisieren, wird der ursprüngliche Textkörper, der vom Ursprungsserver zurückgegeben wird, an den Viewer zurückgegeben.

Zugriff auf den Anforderungstext über die Option „Text einschließen“

Sie können jetzt auswählen, ob Lambda@Edge den Textkörper in einer Anforderung für eine nicht schreibgeschützte HTTP-Methode (POST, PUT, DELETE etc.) weitergeben soll, sodass Sie in Ihrer Lambda-Funktion darauf zugreifen können. Sie können den Lesezugriff wählen oder angeben, dass Sie den Textkörper ersetzen möchten.

Um diese Option zu aktivieren, wählen Sie Include Body (Textkörpereinbeziehen) aus, wenn Sie einen CloudFront-Auslöser für Ihre für ein Viewer- oder Ursprungsanforderungsereignis vorgesehene Funktion erstellen. Weitere Informationen finden Sie unter Hinzufügen von Auslösern für eine Lambda@Edge-Funktion. Mehr zur Nutzung von Include Body (Textkörper einbeziehen) mit Ihrer Funktion finden Sie unter Lambda@Edge-Ereignisstruktur.

Sie können dieses Feature in den folgenden Szenarien nutzen:

  • Verarbeitung von Webformularen (z. B. "Kontakt"-Formulare) ohne Rückgabe von Kundeneingabedaten an den Ursprungs-Server

  • Erfassen von Web-Beacon-Daten, die von Viewer-Browsern gesendet werden, und Verarbeiten am Edge

Einen Beispiel-Code finden Sie unter Beispielfunktionen für Lambda@Edge.

Anmerkung

Wenn der Anforderungs-Body groß ist, wird er von Lambda@Edge abgeschnitten. Ausführliche Informationen zur maximalen Größe und Kürzung finden Sie unter Einschränkungen für Anforderungstext mit der Option „Text einschließen“.