Tutorial: Schreiben einer einfachen Lambda@Edge-Funktion - Amazon CloudFront

Tutorial: Schreiben einer einfachen Lambda@Edge-Funktion

Dieses Tutorial zeigt Ihnen, wie Sie mit Ihrer Arbeit mit Lambda@Edge beginnen können. Dazu erstellen Sie eine Node.js-Beispielfunktion, die in CloudFront läuft, und fügen sie hinzu. Das hier gezeigte Beispiel fügt HTTP-Sicherheitsheader zu einer Antwort hinzu, die die Sicherheit und den Datenschutz für eine Website verbessern können. Sie benötigen keine Website für diese Walkthrough. Darin fügen wir einer Antwort einfach Sicherheits-Header hinzu, wenn CloudFront eine Datei abruft.

In diesem Beispiel werden die Schritte zum Erstellen und Konfigurieren einer Lambda@Edge-Funktion beschrieben. Wenn Sie Ihre eigene Lambda@Edge-Lösung erstellen, führen Sie ähnliche Schritte aus und wählen aus derselben Optionen aus.

Schritt 1: Registrieren eines AWS-Kontos

Registrieren Sie sich unter http://aws.amazon.com für Amazon Web Services, falls noch nicht geschehen. Wählen Sie Sign Up Now (Jetzt registrieren) und geben Sie die erforderlichen Informationen ein.

Schritt 2: Eine CloudFront-Verteilung erstellen

Bevor Sie die Lambda@Edge-Beispielfunktion erstellen, benötigen Sie eine CloudFront-Umgebung, in der Sie arbeiten können, mit einem Ursprung für die Bereitstellung von Inhalten.

Sie sind noch neu bei CloudFront? Mit CloudFront können Sie Ihre Inhalte über ein globales Netzwerk von Edge-Standorten bereitstellen. Wenn Sie eine Lambda-Funktion mit CloudFront einrichten, kann die Funktion Inhalte besser an Viewer anpassen, was die Leistung verbessert. Wenn Sie noch keine Erfahrung mit CloudFront haben, nehmen Sie sich einige Minuten Zeit, bevor Sie die Tutorials ausführen, um eine kurze Übersicht zu lesen und mehr darüber zu erfahren, wie CloudFront Inhalte zwischenspeichert und bereitstellt.

In diesem Beispiel erstellen Sie eine CloudFront-Verteilung, die einen Amazon S3-Bucket als Ursprung für die Verteilung verwendet. Wenn Sie bereits über eine Umgebung verfügen, die Sie benutzen können, können Sie diesen Schritt überspringen.

So erstellen Sie eine CloudFront-Verteilung mit einem Amazon S3-Ursprung

  1. Erstellen Sie einen Amazon S3-Bucket mit einer oder zwei Dateien, z. B. Image-Dateien, als Beispielinhalt. Für Hilfe folgen Sie den Schritten unter Hochladen Ihrer Inhalte zu Amazon S3. Stellen Sie sicher, dass Sie Berechtigungen erteilen, um öffentliche Lesezugriff auf die Objekte in Ihrem Bucket zu gewähren.

  2. Erstellen Sie eine CloudFront-Verteilung und fügen Sie Ihren S3-Bucket als Ursprung hinzu, indem Sie die Schritte unter Erstellen einer CloudFront-Web-Verteilung befolgen. Wenn Sie bereits eine Verteilung haben, können Sie stattdessen den Bucket als Ursprung für diese Verteilung hinzufügen.

    Tipp

    Notieren Sie sich die ID Ihrer Verteilung. Später in diesem Tutorial, wenn Sie einen CloudFront-Auslöser für Ihre Funktion hinzufügen, müssen Sie die ID für Ihre Verteilung in einer Dropdown-Liste auswählen, z. B. E653W22221KDDL.

Schritt 3: Erstellen Ihrer Funktion

In diesem Schritt erstellen Sie eine Lambda-Funktion, beginnend mit einer Vorlage, die in der Lambda-Konsole bereitgestellt ist. Die Funktion fügt Code hinzu, um Sicherheitsheader in Ihrer CloudFront-Verteilung zu aktualisieren.

Sie sind noch neu bei Lambda oder Lambda@Edge? Mit Lambda @Edge können Sie CloudFront-Auslöser verwenden, um eine Lambda-Funktion aufzurufen. Wenn Sie eine CloudFront-Verteilung mit einer Lambda-Funktion verknüpfen, fängt CloudFront Anforderungen und Antworten an CloudFront-Edge-Standorten ab und führt die Funktion aus. Lambda-Funktionen können die Sicherheit erhöhen oder Informationen besser an Ihre Viewer anpassen, um die Leistung zu verbessern. In diesem Tutorial aktualisiert die Funktion, die wir erstellen, die Sicherheits-Header in einer CloudFront-Antwort.

Es müssen mehrere Schritte befolgt werden, wenn Sie eine Lambda-Funktion erstellen. In diesem Tutorial verwenden Sie eine Vorlage als Grundlage für Ihre Funktion, und aktualisieren dann die Funktion mit Code, der die Sicherheitsheader festlegt. Abschließend fügen Sie einen CloudFront-Auslöser hinzu und stellen ihn zum Ausführen der Funktion bereit.

So erstellen Sie eine Lambda-Funktion:

  1. Melden Sie sich bei der AWS Management Console an und öffnen Sie die AWS Lambda-Konsole unter https://console.aws.amazon.com/lambda/.

    Wichtig

    Stellen Sie sicher, dass Sie sich in der Region US-East-1 (Nord-Virginia) (us-east-1) befinden. Sie müssen sich in dieser Region befinden, um Lambda@Edge-Funktionen erstellen zu können.

  2. Wählen Sie Create function (Funktion erstellen).

  3. Wählen Sie auf der Seite Create function (Funktion erstellen) die Option Use a blueprint (Eine Vorlage verwenden) aus und filtern Sie dann nach den CloudFront-Vorlagen, indem Sie „cloudfront“ in das Suchfeld eingeben. Das Schlüsselwort : cloudfront wird angezeigt und alle Vorlagen, die für CloudFront markiert sind, werden angezeigt.

    Anmerkung

    CloudFront-Vorlagen sind nur in der Region US-Ost 1 (Nord-Virginia) (us-east-1) verfügbar.

  4. Wählen Sie die Vorlage cloudfront-modify-response-header als Vorlage für Ihre Funktion.

  5. Geben Sie folgende Informationen zu Ihrer Funktion ein:

    Name

    Geben Sie einen Namen für die Funktion ein.

    Ausführungsrolle

    Wählen Sie, wie Sie die Berechtigungen für Ihre Funktion festlegen. Um die empfohlene grundlegende Lambda@Edge-Berechtigungsrichtlinienvorlage zu verwenden, wählen Sie Create a new role from AWS policy templates aus.

    Rollenname

    Geben Sie einen Namen für die Rolle ein, die von der Richtlinienvorlage erstellt wird.

    Richtlinienvorlagen

    Lambda fügt die Richtlinienvorlage Basic Edge Lambda permissions (Grundlegende Edge Lambda-Berechtigungen) automatisch für Sie hinzu, da Sie eine CloudFront-Vorlage als Grundlage für Ihre Funktion ausgewählt haben. Diese Richtlinienvorlage fügt Ausführungsrollenberechtigungen hinzu, mit denen CloudFront Ihre Lambda-Funktion für Sie an CloudFront-Standorten weltweit ausführen kann. Weitere Informationen finden Sie unter Festlegen von IAM-Berechtigungen und -Rollen für Lambda@Edge.

  6. Wählen Sie Create function (Funktion erstellen). Lambda erstellt die Funktion und auf der nächsten Seite sehen Sie Ihre Funktionskonfiguration.

  7. Wählen Sie im Abschnitt Designer der Seite Ihren Funktionsnamen aus, wie im folgenden Image dargestellt. In diesem Beispiel lautet der Funktionsname ExampleFunction.

    
								Lambda-Funktionsseite in der Lambda-Konsole, in der der Designer-Abschnitt mit dem ausgewählten Funktionsnamen angezeigt wird.
  8. Scrollen Sie nach unten zum Abschnitt Funktionscode der Seite, wie im folgenden Image gezeigt.

    
								Lambda-Funktionsseite in der Lambda-Konsole mit dem Funktionscode-Abschnitt.

    Ersetzen Sie den Vorlagencode durch eine Funktion, die die Sicherheits-Header ändert, die Ihren Ursprung zurückgibt. Beispielsweise könnten Sie Code wie den folgenden verwenden:

    'use strict'; exports.handler = (event, context, callback) => { //Get contents of response const response = event.Records[0].cf.response; const headers = response.headers; //Set new headers headers['strict-transport-security'] = [{key: 'Strict-Transport-Security', value: 'max-age= 63072000; includeSubdomains; preload'}]; headers['content-security-policy'] = [{key: 'Content-Security-Policy', value: "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'"}]; headers['x-content-type-options'] = [{key: 'X-Content-Type-Options', value: 'nosniff'}]; headers['x-frame-options'] = [{key: 'X-Frame-Options', value: 'DENY'}]; headers['x-xss-protection'] = [{key: 'X-XSS-Protection', value: '1; mode=block'}]; headers['referrer-policy'] = [{key: 'Referrer-Policy', value: 'same-origin'}]; //Return modified response callback(null, response); };
  9. Wählen Sie Save (Speichern) aus, um Ihren aktualisierten Code zu speichern.

Fahren Sie mit dem nächsten Abschnitt fort, um einen CloudFront-Auslöser für das Ausführen der Funktion hinzuzufügen.

Schritt 4: Hinzufügen eines CloudFront-Auslösers zum Ausführen der Funktion

Da Sie nun über eine Lambda-Funktion zum Aktualisieren von Sicherheitsheadern verfügen, konfigurieren Sie den CloudFront-Auslöser so, dass er die Funktion ausführt, damit in jede Antwort, die CloudFront vom Ursprung für Ihre Verteilung erhält, Header eingefügt werden.

So konfigurieren Sie den CloudFront-Auslöser für Ihre Funktion:

  1. Wählen Sie im Abschnitt Designer der Seite CloudFront aus, wie im folgenden Image gezeigt.

    
								Lambda-Funktionsseite in der Lambda-Konsole, in der der Designerbereich mit ausgewähltem CloudFront angezeigt wird.
  2. Scrollen Sie nach unten zum Abschnitt Configure triggers (Auslöser konfigurieren) auf der Seite und wählen Sie Deploy to Lambda@Edge (Zu Lambda@Edge bereitstellen) aus.

  3. Machen Sie auf der Seite Deploy to Lambda@Edge (Bereitstellen für Lambda@Edge) unter Configure CloudFront trigger (CloudFront-Auslöser konfigurieren) die folgenden Angaben:

    Verteilung

    Der ID der CloudFront-Verteilung, die Ihrer Funktion zugeordnet ist. Wählen Sie in der Dropdown-Liste die Verteilungs-ID aus.

    Cache-Verhalten

    Das Cache-Verhalten, das für den Auslöser verwendet werden soll. Behalten Sie in diesem Beispiel den Wert * bei, der das Standard-Cache-Verhalten Ihrer Verteilung bedeutet. Weitere Informationen finden Sie unter Einstellungen für das Cache-Verhalten im Thema Werte, die Sie beim Erstellen oder Aktualisieren einer Verteilung angeben.

    CloudFront-Ereignis

    Der Auslöser, der angibt, wann Ihre Funktion ausgeführt wird. Wir möchten, dass die Sicherheitsheader-Funktion ausgeführt wird, wenn CloudFront eine Antwort vom Ursprung zurückgibt. Wählen Sie deshalb in der Dropdown-Liste Origin respons (Antwort vom Ursprung). Weitere Informationen finden Sie unter Hinzufügen von Auslösern für eine Lambda@Edge-Funktion.

  4. Aktivieren Sie unter Confirm deploy to Lambda@Edge (Bestätigen der Bereitstellung für Lambda@Edge) das Kontrollkästchen, um zu bestätigen, dass der Auslöser bereitgestellt wird und Ihre Funktion an allen AWS-Standorten ausführt.

  5. Wählen Sie Deploy (Bereitstellen) aus, um den Auslöser hinzuzufügen und die Funktion an AWS-Standorten weltweit zu replizieren. Schließen Sie dann, falls erforderlich, die Seite Deploy to Lambda @Edge (Lambda @Edge bereitstellen) .

  6. Warten Sie, bis die Funktion repliziert wurde. Dies dauert in der Regel mehrere Minuten.

    Sie können überprüfen, ob die Replikation abgeschlossen ist, indem Sie die CloudFront-Konsole öffnen und sich Ihre Verteilung ansehen. Warten Sie, bis sich der Status der Verteilung von In Progress (Läuft) zurück auf Deployed (Bereitgestellt) geändert hat, d. h. Ihre Funktion wurde repliziert. Zur Überprüfung der Funktionstätigkeit befolgen Sie die Schritte im nächsten Abschnitt.

Schritt 5: Überprüfen, ob die Funktion funktioniert

Nachdem Sie nun Ihre Lambda-Funktion erstellt und einen Auslöser konfiguriert haben, um sie für eine CloudFront-Verteilung auszuführen, prüfen Sie, ob die Funktion das tut, was Sie von ihr erwarten. In diesem Beispiel überprüfen wir die von CloudFront zurückgegebenen HTTP-Header, um sicherzustellen, dass die Sicherheitsheader hinzugefügt werden.

Überprüfen, ob Ihre Lambda@Edge-Funktion Sicherheitsheader hinzufügt

  1. Geben Sie in einem Browser die URL für eine Datei in Ihrem S3-Bucket ein. Sie können beispielsweise eine URL wie die folgende Verwenden: http://d111111abcdef8.cloudfront.net/image.jpg.

    Weitere Informationen über den in der Datei-URL zu verwendenden CloudFront-Domänennamen finden Sie unter Anpassen des URL-Formats für Dateien in CloudFront.

  2. Öffnen Sie die Web Developer-Symbolleiste Ihres Browsers. Öffnen Sie beispielsweise in Ihrem Browserfenster in Chrome das Kontextmenü (Rechtsklick) und wählen Sie Inspect (Untersuchen) aus.

  3. Wählen Sie die Registerkarte Network (Netzwerk) aus.

  4. Laden Sie die Seite, um Ihr Image anzuzeigen, und wählen Sie dann auf der linken Seite eine HTTP-Anforderung. Sie sehen die HTTP-Header in einem separaten Fenster.

  5. Sehen Sie sich die Liste der HTTP-Header an, um zu überprüfen, ob die erwarteten Sicherheitsheader in der Liste enthalten sind. Beispielsweise könnten Sie Header wie im folgenden Screenshot gezeigt sehen.

    
								HTTP-Header-Liste, in der die erwarteten Sicherheitsheader gekennzeichnet sind.

Wenn die Sicherheitsheader in Ihrem Header-Liste enthalten sind, dann ist das hervorragend! Sie haben erfolgreich Ihre erste Lambda@Edge-Funktion erstellt. Gibt CloudFront Fehler zurück oder es gibt andere Probleme, fahren Sie mit dem nächsten Schritt fort, um die Probleme zu beheben.

Schritt 6: Beheben von Problemen

Wenn CloudFront Fehler zurückgibt oder die Sicherheitsheader nicht wie erwartet hinzufügt, können Sie die Ausführung Ihrer Funktion untersuchen, indem Sie sich die CloudWatch Logs ansehen. Stellen Sie sicher, dass die Protokolle an dem AWS-Standort gespeichert werden, der dem Standort, an dem die Funktion ausgeführt wird, am nächsten liegt.

Wenn Sie beispielsweise die Datei von London aus anzeigen, versuchen Sie, die Region in der CloudWatch-Konsole auf EU (London) zu setzen.

So prüfen Sie CloudWatch Logs für Ihre Lambda@Edge-Funktion:

  1. Melden Sie sich bei der AWS Management Console an und öffnen Sie die CloudWatch-Konsole unter https://console.aws.amazon.com/cloudwatch/.

  2. Ändern Sie Region auf den Speicherort, der angezeigt wird, wenn Sie die Datei in Ihrem Browser anzeigen. Hier wird die Funktion ausgeführt.

  3. Klicken Sie im linken Bereich auf Logs (Protokolle), um die Protokolle für Ihre Verteilung anzuzeigen.

Weitere Informationen finden Sie unter Überwachen von CloudFront mit Amazon CloudWatch.

Schritt 7: Bereinigen der Ressourcen für Ihr Beispiel

Wenn Sie nur für dieses Tutorial einen Amazon-S3-Bucket und eine CloudFront-Verteilung erstellt haben, löschen Sie die AWS-Ressourcen, die Sie zugewiesen haben, damit keine Gebühren mehr anfallen. Nachdem Sie Ihre AWS-Ressourcen gelöscht haben, ist der Inhalt, den Sie hinzugefügt haben, nicht mehr verfügbar.

Aufgaben

Löschen des S3-Buckets

Bevor Sie Ihren Amazon S3-Bucket löschen, stellen Sie sicher, dass die Protokollierung für den Bucket deaktiviert ist. Andernfalls schreibt AWS weiter Protokolle in Ihren Bucket, während Sie ihn löschen.

Deaktivieren Sie die Protokollierung für einen Bucket wie folgt:

  1. Öffnen Sie die Amazon S3-Konsole unter https://console.aws.amazon.com/s3/.

  2. Wählen Sie den Bucket aus, und wählen Sie dann Properties (Eigenschaften).

  3. Wählen Sie unter Properties (Eigenschaften) Logging (Protokollierung) aus.

  4. Deaktivieren Sie das Kontrollkästchen Enabled (Aktiviert).

  5. Wählen Sie Save (Speichern) aus.

Jetzt können Sie Ihren Bucket löschen. Weitere Informationen erhalten Sie unter Wie lösche ich einen S3-Bucket? im Amazon Simple Storage Service-Konsole-Benutzerhandbuch.

Löschen der CloudFront-Verteilung

Bevor Sie eine CloudFront-Verteilung löschen, müssen Sie sie deaktivieren. Eine deaktivierte Verteilung funktioniert nicht mehr und es fallen keine weiteren Kosten für sie an. Sie können eine deaktivierte Verteilung jederzeit wieder aktivieren. Nachdem Sie eine deaktivierte Verteilung gelöscht haben, ist sie nicht länger verfügbar.

So deaktivieren und löschen Sie eine CloudFront-Verteilung:

  1. Öffnen Sie die CloudFront-Konsole unter https://console.aws.amazon.com/cloudfront/v3/home.

  2. Klicken Sie mit der rechten Maustaste auf die Verteilung, die Sie deaktivieren möchten, und anschließend auf Disable (Deaktivieren).

  3. Wenn Sie zur Bestätigung aufgefordert werden, wählen Sie Yes, Disable (Ja, deaktivieren).

  4. Wählen Sie die deaktivierte Verteilung aus, und klicken Sie dann auf Delete (Löschen).

  5. Wenn Sie zur Bestätigung aufgefordert werden, wählen Sie Yes, Delete.

Ressourcen für weitere Informationen

Nun, da Sie eine grundlegende Vorstellung davon haben, wie Lambda@Edge-Funktionen funktionieren, können Sie hier weitere Informationen erhalten: