Amazon S3 und Amazon CloudFront Auslieferung statischer Webseiten mittels AWS

Autor / Redakteur: Sascha Möllering * / Stephan Augsten

„Wir würden gerne Amazon S3 und Amazon CloudFront nutzen, um statische Webseiten weltweit ohne Server mit niedriger Latenz verteilen zu lassen. Welche Empfehlungen und Entwurfsmuster existieren für die Auslieferung von statischen Webseiten durch Amazon S3 und Amazon CloudFront?“

Anbieter zum Thema

Per Hosted Zones lässt sich Amazon Route 53 so konfigurieren, dass die Namensanfragen auf ein S3-Bucket auflösen.
Per Hosted Zones lässt sich Amazon Route 53 so konfigurieren, dass die Namensanfragen auf ein S3-Bucket auflösen.
(Bild: Amazon Web Services)

Amazon S3 speichert Daten als Objekte in Ressourcen, die als Buckets bezeichnet werden. In einem Bucket können so viele Objekte wie gewünscht gespeichert werden. Die Objekte innerhalb eines Buckets können eine Größe von bis zu 5 Terabyte haben. Amazon S3 ist einfach über die S3 Console, SDKs oder ISV-Integration zugänglich. S3 wird von den AWS SDKs for Java, PHP, .NET, Python, Node.js, Ruby und vom AWS Mobile SDK unterstützt.

Amazon S3 erlaubt es, den Zugriff auf den Bucket zu kontrollieren (wer darf Objekte im Bucket erstellen, löschen und abrufen), Zugriffsprotokolle für den Bucket und seine Objekte anzuzeigen und die AWS-Region zu wählen, in der ein Bucket gespeichert wird. All dies ermöglicht es, die Latenz zu optimieren, die Kosten zu minimieren oder Vorschriften einzuhalten.

Amazon CloudFront ist ein globaler Netzwerkservice zur Bereitstellung von Inhalten (CDN), durch den die Bereitstellung von Websites, APIs, Videoinhalte und anderer Web-Assets durch CDN-Zwischenspeicherung beschleunigt wird. Der Service kann in andere Amazon Web Services-Produkte wie beispielsweise Amazon S3 integriert werden.

In Amazon CloudFront sind Inhalte in Verteilungen („Distributions“) angeordnet. Eine Verteilung gibt die Speicherorte der Originalversion Ihrer Dateien an. Sie besitzt einen eindeutigen Domain-Namen vom Typ „CloudFront.net“ (z. B. abc123.cloudfront.net), der verwendet werden kann, um im globalen Netzwerk aus Edge-Standorten auf eine Objekte zu verweisen. Einer Verteilung können auf Wunsch auch ein eigener Domain-Namen wie beispielsweise www.example.com zugeordnet werden.

Verwendung von CloudFront

Wie bereits angedeutet, lässt sich Amazon CloudFront dazu nutzen, statische Webseiten, die in einem Amazon S3 Bucket abgelegt sind, auszuliefern. Die Nutzung von CloudFront kann deutlich kosteneffizienter sein, da bei hoher Nutzung die Kosten des Datentransfers für CloudFront geringer sind als die von S3. Darüber hinaus sind die Downloads schneller, da die Dateien physikalisch näher an den Endnutzern abgelegt werden.

Bei der Kombination von Amazon S3 und Amazon CloudFront zur Auslieferung von statischen Dateien wird der S3-Bucket nicht modifiziert. Damit die Auslieferung möglich ist, müssen aber die DNS-Namenkonventionen für einen Bucket eingehalten werden. Typischerweise werden im Falle, dass Amazon CloudFront einen S3-Bucket als Quelle nutzt, die Leseberechtigungen so gesetzt, dass jeder einen lesenden Zugriff auf die Objekte im S3-Bucket besitzt.

Das bedeutet, dass Objekte sowohl über die CloudFront-Verteilungs-URL als auch über die S3-URL direkt ausgeliefert werden können, wenn die S3-URL bekannt ist. Um dies zu verhindern, kann eine sogenannte Origin Access Identity angelegt werden, was ein spezieller CloudFront-Benutzer ist. Dieser spezielle Benutzer wird der CloudFront-Verteilung hinzugefügt und die Leseberechtigungen auf die Objekte in dem S3-Bucket auf diesen Benutzer beschränkt. Wenn nun ein Endnutzer eine entsprechende CloudFront-URL aufruft, wird das S3-Objekt mit den Berechtigungen der Origin Access Identity gelesen.

S3-Bucket ohne Amazon CloudFront konfigurieren.
S3-Bucket ohne Amazon CloudFront konfigurieren.
(Bild: Amazon Web Services)

Eine andere Möglichkeit der Auslieferung von statischen Dateien besteht in der Nutzung von einem Amazon S3-Bucket ohne Amazon CloudFront. Dazu wird der S3-Bucket für das Hosting von Websites konfiguriert, wie im vorangestellten Bild zu sehen ist.

Falls der Content unter einer Custom Domain abrufbar sein soll, muss natürlich diese Domain registriert sein. Um Request sowohl auf die Root-Domäne und auf einer www-Subdomäne beantworten zu können, müssen zwei unterschiedliche S3-Buckets angelegt werden: example.com und www.example.com.

In den Bucket example.com müssen nun die statischen Dateien hochgeladen werden. Wichtig ist, dass die Zugriffsrechte für den example.com so konfiguriert sind, dass die Objekte innerhalb des Buckets öffentlich verfügbar sind, eine beispielshafte Bucket-Policy kann folgendermaßen aussehen:

{
  "Version":"2012-10-17",
  "Statement":[{
    "Sid":"PublicReadGetObject",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::example.com/*"]
  }]
}

Redirect auf den richtigen S3-Bucket.
Redirect auf den richtigen S3-Bucket.
(Bild: Amazon Web Services)

Im nächsten Schritt müssen wir die Anfragen von www.example.com nach example.com umleiten, da nur im example.com-Bucket die auszuliefernden Dateien vorliegen.

Abschließend muss noch Amazon Route 53 (ein hochverfügbarer und skalierbarer DNS-Web-Service) mit Hilfe von Hosted Zones so konfiguriert werden, dass die Namensanfragen nach example.com und www.example.com auf das entsprechende S3-Bucket auflösen. Dafür müssen sogenannte Alias-Records angelegt werden.

Sascha Möllering
Sascha Möllering
(Bild: AWS Germany GmbH)

Alias-Record sind eine DNS-Erweiterung von AWS, die neben anderen Besonderheiten auch Apex-Domänen unterstützt.

* Sascha Möllering arbeitet als Solutions Architect bei der Amazon Web Services Germany GmbH. Seine Interessen liegen in den Bereichen Automation, Infrastructure as Code, Distributed Computing, Container und JVM.

(ID:44726279)