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 mithilfe VPC 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 | AWSDienste: Amazon CloudFront; Elastic Load Balancing (ELB); AWS Lambda |
Übersicht
Wenn Sie statische Inhalte bereitstellen, die auf Amazon Web Services (AWS) gehostet werden, empfiehlt es sich, 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 (WebACLs) für die CloudFront Verteilung zu definieren, was Ihnen hilft, Anfragen zu den Inhalten mit minimalem Konfigurations- und Verwaltungsaufwand zu sichern.
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 virtuellen privaten Cloud (VPC) bereitgestellt werden, den gesamten Inhalt, einschließlich statischer Inhalte, überprüfen. Der Standardansatz leitet den Datenverkehr nicht VPC zur Inspektion durch. 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 VPC durch den 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 (AmazonVPC)
Application Load Balancer
Lambda
Amazon S3
Zielarchitektur
Die folgende Abbildung zeigt die vorgeschlagene Architektur, wenn Sie statische Inhalte aus einem S3-Bucket über a bereitstellen müssenVPC. CloudFront
Der Client fordert die CloudFront OF-Distribution URL an, um eine bestimmte Website-Datei im S3-Bucket abzurufen.
CloudFront sendet die Anfrage an AWSWAF. AWSWAFfiltert die Anfrage mithilfe des Webs, das auf die CloudFront Verteilung ACLs angewendet wurde. Wenn sich herausstellt, dass die Anfrage gültig ist, wird der Ablauf fortgesetzt. Wenn festgestellt wird, dass die Anfrage ungültig ist, erhält der Client einen 403-Fehler.
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. Wenn nicht, wird der Fluss fortgesetzt.
CloudFront leitet die Anfrage an den URL des angegebenen Application Load Balancer weiter.
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.
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 Dienste und Funktionen, wie CloudFront z. B. den Application Load Balancer, werden diese automatisch AWS skaliert.
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 den 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.
AWSLambda ist ein Rechendienst, 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 (AmazonVPC) hilft Ihnen dabei, AWS Ressourcen in einem von Ihnen definierten virtuellen Netzwerk bereitzustellen. Dieses virtuelle Netzwerk ähnelt einem herkömmlichen Netzwerk, das Sie in Ihrem eigenen Rechenzentrum betreiben würden, und bietet die Vorteile der Nutzung der skalierbaren Infrastruktur vonAWS.
Epen
Aufgabe | Beschreibung | Erforderliche Fähigkeiten |
---|---|---|
Erstelle eineVPC. | Erstellen Sie eine, VPC um die in diesem Muster bereitgestellten Ressourcen zu hosten, z. B. den Application Load Balancer und die Lambda-Funktion. Anweisungen finden Sie unter Erstellen einer VPC (VPCAmazon-Dokumentation). | Cloud-Architekt |
Erstellen Sie ein AWS WAF WebACL. | Erstellen Sie ein AWS WAF WebACL. Später in diesem Muster wenden Sie dieses Web ACL auf die CloudFront Distribution an. Anweisungen finden Sie unter Erstellen eines Webs ACL (AWSWAFDokumentation). | 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. | Allgemein AWS |
Laden Sie die Lambda-Funktion hoch. | Geben Sie den folgenden Befehl ein, um den Lambda-Funktionscode in ein ZIP-Dateiarchiv in Lambda hochzuladen.
| Allgemein 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.
| Cloud-Architekt |
Zugehörige Ressourcen
AWSDokumentation
Optimierung von Caching und Verfügbarkeit (CloudFront Dokumentation)
Lambda-Funktionen als Ziele (Dokumentation zu Elastic Load Balancing)
Lambda-Kontingente (Lambda-Dokumentation)
AWSWebsites von Diensten
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); } ); };