Statische Inhalte in einem Amazon S3 S3-Bucket über eine VPC mithilfe von Amazon bereitstellen CloudFront - AWS Prescriptive Guidance

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.

Statische Inhalte in einem Amazon S3 S3-Bucket über eine VPC mithilfe von Amazon bereitstellen CloudFront

Erstellt von Angel Emmanuel Hernandez Cebrian

Umgebung: PoC oder Pilotprojekt

Technologien: Bereitstellung von Inhalten; Netzwerke; Sicherheit, Identität, Compliance; Serverlos; Web- und mobile Apps

AWS-Services: Amazon CloudFront; Elastic Load Balancing (ELB); AWS Lambda

Übersicht

Wenn Sie statische Inhalte bereitstellen, die auf Amazon Web Services (AWS) gehostet werden, wird empfohlen, einen Amazon Simple Storage Service (S3) -Bucket als Quelle zu verwenden und Amazon für die Verteilung der Inhalte CloudFront zu verwenden. Diese Lösung bietet zwei Hauptvorteile: die Bequemlichkeit, statische Inhalte an Edge-Standorten zwischenzuspeichern, und die Möglichkeit, Web-Zugriffskontrolllisten (Web-ACLs) für die CloudFront Verteilung zu definieren, wodurch Sie Anfragen zu den Inhalten mit minimalem Konfigurations- und Verwaltungsaufwand sichern können.

Der empfohlene Standardansatz weist jedoch häufig eine architektonische Einschränkung auf. In einigen Umgebungen möchten Sie, dass virtuelle Firewall-Appliances, die in einer Virtual Private Cloud (VPC) bereitgestellt werden, den gesamten Inhalt überprüfen, einschließlich statischer Inhalte. Der Standardansatz leitet den Datenverkehr nicht zur Inspektion durch die VPC. Dieses Muster bietet eine alternative architektonische Lösung. Sie verwenden immer noch eine CloudFront Distribution, um statische Inhalte in einem S3-Bucket bereitzustellen, aber der Datenverkehr wird mithilfe eines Application Load Balancer über die VPC geleitet. Eine AWS-Lambda-Funktion ruft dann den Inhalt aus dem S3-Bucket ab und gibt ihn zurück.

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Ein aktives AWS-Konto.

  • Statischer Website-Inhalt, der in einem S3-Bucket gehostet wird.

Einschränkungen

  • Die Ressourcen in diesem Muster müssen sich in einer einzigen AWS-Region befinden, sie können jedoch in verschiedenen AWS-Konten bereitgestellt werden.

  • Es gelten Grenzwerte für die maximale Anfrage- und Antwortgröße, die die Lambda-Funktion empfangen bzw. senden kann. Weitere Informationen finden Sie unter Grenzwerte in Lambda-Funktionen als Ziele (Elastic Load Balancing Balancing-Dokumentation).

  • Bei der Verwendung dieses Ansatzes ist es wichtig, ein ausgewogenes Verhältnis zwischen Leistung, Skalierbarkeit, Sicherheit und Kosteneffektivität zu finden. Trotz der hohen Skalierbarkeit von Lambda werden einige Anfragen gedrosselt, wenn die Anzahl gleichzeitiger Lambda-Aufrufe das maximale Kontingent überschreitet. Weitere Informationen finden Sie unter Lambda-Kontingente (Lambda-Dokumentation). Bei der Verwendung von Lambda müssen Sie auch die Preisgestaltung berücksichtigen. Um Lambda-Aufrufe zu minimieren, stellen Sie sicher, dass Sie den Cache für die Distribution richtig definieren. CloudFront Weitere Informationen finden Sie unter Optimierung von Caching und Verfügbarkeit (Dokumentation). CloudFront

Architektur

Zieltechnologie-Stack

  • CloudFront

  • Amazon Virtual Private Cloud (Amazon VPC)

  • Application Load Balancer

  • Lambda

  • Amazon S3

Zielarchitektur

Die folgende Abbildung zeigt die vorgeschlagene Architektur, wenn Sie statische Inhalte aus einem S3-Bucket über eine VPC bereitstellen müssen. CloudFront

Der Datenverkehr fließt über Application Load Balancer in der VPC zur Lambda-Funktion.
  1. Der Client fordert die URL der CloudFront Verteilung an, um eine bestimmte Website-Datei im S3-Bucket abzurufen.

  2. CloudFront sendet die Anfrage an AWS WAF. AWS WAF filtert die Anfrage mithilfe der Web-ACLs, die auf die CloudFront Verteilung angewendet wurden. Wenn sich herausstellt, dass die Anfrage gültig ist, wird der Ablauf fortgesetzt. Wenn sich herausstellt, dass die Anfrage ungültig ist, erhält der Client einen 403-Fehler.

  3. CloudFront überprüft seinen internen Cache. Wenn es einen gültigen Schlüssel gibt, der der eingehenden Anfrage entspricht, wird der zugehörige Wert als Antwort an den Client zurückgesendet. Ist dies nicht der Fall, wird der Datenfluss fortgesetzt.

  4. CloudFront leitet die Anfrage an die URL des angegebenen Application Load Balancer weiter.

  5. Der Application Load Balancer hat einen Listener, der auf einer Lambda-Funktion einer Zielgruppe zugeordnet ist. Der Application Load Balancer ruft die Lambda-Funktion auf.

  6. Die Lambda-Funktion stellt eine Verbindung zum S3-Bucket her, führt eine GetObject Operation darauf aus und gibt den Inhalt als Antwort zurück.

Automatisierung und Skalierung

Um die Bereitstellung statischer Inhalte mit diesem Ansatz zu automatisieren, erstellen Sie CI/CD-Pipelines zur Aktualisierung der Amazon S3 S3-Buckets, die Websites hosten.

Die Lambda-Funktion skaliert automatisch, um die gleichzeitigen Anfragen innerhalb der Kontingente und Einschränkungen des Dienstes zu verarbeiten. Weitere Informationen finden Sie unter Lambda-Funktionsskalierung und Lambda-Kontingente (Lambda-Dokumentation). Für die anderen AWS-Services und -Funktionen wie CloudFront den Application Load Balancer skaliert AWS diese automatisch.

Tools

  • Amazon CloudFront beschleunigt die Verteilung Ihrer Webinhalte, indem es sie über ein weltweites Netzwerk von Rechenzentren bereitstellt, was die Latenz senkt und die Leistung verbessert.

  • Elastic Load Balancing (ELB) verteilt eingehenden Anwendungs- oder Netzwerkverkehr auf mehrere Ziele. In diesem Muster verwenden Sie einen Application Load Balancer, der über Elastic Load Balancing bereitgestellt wird, um den Datenverkehr an die Lambda-Funktion weiterzuleiten.

  • AWS Lambda ist ein Rechenservice, mit dem Sie Code ausführen können, ohne Server bereitstellen oder verwalten zu müssen. Er führt Ihren Code nur bei Bedarf aus und skaliert automatisch, sodass Sie nur für die tatsächlich genutzte Rechenzeit zahlen.

  • Amazon Simple Storage Service (Amazon S3) ist ein cloudbasierter Objektspeicherservice, der Sie beim Speichern, Schützen und Abrufen beliebiger Datenmengen unterstützt.

  • Amazon Virtual Private Cloud (Amazon VPC) hilft Ihnen dabei, AWS-Ressourcen in einem von Ihnen definierten virtuellen Netzwerk zu starten. Dieses virtuelle Netzwerk ähnelt einem herkömmlichen Netzwerk, das Sie in Ihrem eigenen Rechenzentrum betreiben würden, mit den Vorteilen der skalierbaren Infrastruktur von AWS.

Epen

AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie eine VPC.

Erstellen Sie eine VPC zum Hosten der in diesem Muster bereitgestellten Ressourcen, z. B. des Application Load Balancer und der Lambda-Funktion.  Anweisungen finden Sie unter Erstellen einer VPC (Amazon VPC-Dokumentation).

Cloud-Architekt

Erstellen Sie eine AWS WAF WAF-Web-ACL.

Erstellen Sie eine AWS WAF WAF-Web-ACL. Später in diesem Muster wenden Sie diese Web-ACL auf die CloudFront Distribution an. Anweisungen finden Sie unter Erstellen einer Web-ACL (AWS-WAF-Dokumentation).

Cloud-Architekt

So erstellen Sie die Lambda-Funktion:

Erstellen Sie die Lambda-Funktion, die den im S3-Bucket gehosteten statischen Inhalt als Website bereitstellt. Verwenden Sie den Code, der im Abschnitt Zusätzliche Informationen dieses Musters bereitgestellt wird. Passen Sie den Code an, um Ihren Ziel-S3-Bucket zu identifizieren.

Allgemeines AWS

Laden Sie die Lambda-Funktion hoch.

Geben Sie den folgenden Befehl ein, um den Lambda-Funktionscode in ein ZIP-Dateiarchiv in Lambda hochzuladen.

aws lambda update-function-code \ --function-name \ --zip-file fileb://lambda-alb-s3-website.zip
Allgemeines AWS

Erstellen Sie einen Application Load Balancer.

Erstellen Sie einen mit dem Internet verbundenen Application Load Balancer, der auf die Lambda-Funktion verweist. Anweisungen finden Sie unter Eine Zielgruppe für die Lambda-Funktion erstellen (Elastic Load Balancing Balancing-Dokumentation). Für eine Hochverfügbarkeitskonfiguration erstellen Sie den Application Load Balancer und fügen ihn privaten Subnetzen in verschiedenen Availability Zones hinzu.

Cloud-Architekt

Erstellen Sie eine CloudFront Distribution.

Erstellen Sie eine CloudFront Verteilung, die auf den von Ihnen erstellten Application Load Balancer verweist.

  1. Melden Sie sich bei der AWS-Managementkonsole an und öffnen Sie die CloudFront Konsole unter https://console.aws.amazon.com/cloudfront/v3/home.

  2. Wählen Sie Create Distribution.

  3. Wählen Sie auf der ersten Seite des Assistenten Create Distribution Wizard im Abschnitt Web die Option Get Started.

  4. Geben Sie die Einstellungen für Ihre Distribution an. Weitere Informationen finden Sie unter Werte, die Sie beim Erstellen oder Aktualisieren einer Verteilung angeben. Beachten Sie Folgendes:

    1. Legen Sie den Application Load Balancer als Ursprung fest.

    2. Wählen Sie in den Verteilungseinstellungen vorhandene Web-ACLs aus, die Sie über AWS WAF anwenden möchten. Weitere Informationen finden Sie unter AWS WAF Web ACL.

  5. Speichern Sie Ihre Änderungen.

  6. Nachdem Sie Ihre Distribution CloudFront erstellt haben, ändert sich der Wert der Status-Spalte für Ihre Distribution von InProgresszu Deployed. Wenn Sie die Verteilung aktivieren, kann sie sofort Anfragen verarbeiten, nachdem der Status auf Deployed (Bereitgestellt) gewechselt hat.

Cloud-Architekt

Zugehörige Ressourcen

AWS-Dokumentation

AWS-Servicewebsites

Zusätzliche Informationen

Code

Die folgende Lambda-Beispielfunktion ist in Node.js geschrieben. Diese Lambda-Funktion fungiert als Webserver, der eine GetObject Operation für einen S3-Bucket ausführt, der die Website-Ressourcen enthält.

/** * This is an AWS Lambda function created for demonstration purposes. * It retrieves static assets from a defined Amazon S3 bucket. * To make the content available through a URL, use an Application Load Balancer with a Lambda integration. * * Set the S3_BUCKET environment variable in the Lambda function definition. */ var AWS = require('aws-sdk'); exports.handler = function(event, context, callback) { var bucket = process.env.S3_BUCKET; var key = event.path.replace('/', ''); if (key == '') { key = 'index.html'; } // Fetch from S3 var s3 = new AWS.S3(); return s3.getObject({Bucket: bucket, Key: key}, function(err, data) { if (err) { return err; } var isBase64Encoded = false; var encoding = 'utf8'; if (data.ContentType.indexOf('image/') > -1) { isBase64Encoded = true; encoding = 'base64' } var resp = { statusCode: 200, headers: { 'Content-Type': data.ContentType, }, body: new Buffer(data.Body).toString(encoding), isBase64Encoded: isBase64Encoded }; callback(null, resp); } ); };