Hugo-Website auf AWS S3 bereitstellen
Hugo ist ein statischer Site-Generator.
Wenn die Website mit Hugo generiert wurde, ist es Zeit, sie auf einer Hosting-Plattform zu deployen. Hier ist eine Anleitung, wie man sie zu AWS S3 pusht und mit AWS CloudFront CDN bereitstellt.

Diese Anleitung ist Teil des Web-Infrastruktur — statische Veröffentlichung, CDN, Indexierung und Domain-Dienste-Clusters.
Für einen vollständigen, auf der CLI basierenden Deployment-Workflow siehe Hugo-Website zu AWS S3 mit AWS CLI deployen.
Website vorbereiten
Ich werde hier nicht beschreiben, wie man ein Hugo Website-Projekt erstellt oder Artikel bzw. Blogbeiträge hinzufügt. Es wird davon ausgegangen, dass Sie dies bereits getan haben.
Falls nicht, finden Sie hier einen Hugo-Quickstart.
Deployment-Optionen
Es gibt mehrere Optionen, um eine mit Hugo generierte Website zu deployen und zu hosten (https://gohugo.io/hosting-and-deployment/). Ich persönlich mag:
- Wie eine Hugo-Website auf GitHub gehostet werden kann
- AWS Amplify für Build und Deployment.
- und Deployment zu S3 mit dem hugo deploy Befehl und Bereitstellung über AWS CloudFront CDN sowie AWS Route53 und AWS Lambda.
Für Alternativen wie Netlify, siehe Netlify für Hugo & statische Websites: Preisgestaltung, Free-Tier und Alternativen.
Im Folgenden beschreibe ich genau diese – letzte – Methode.
1. S3-Bucket mit lockeren Berechtigungen erstellen
gehe zu: https://console.aws.amazon.com/s3
-
erstelle einen Bucket mit einem Namen wie dem Domainnamen, zum Beispiel: “microsoft.com”
-
klicke auf den Bucket => Eigenschaften, ganz unten => statische Website-Bereitstellung (static website hosting)

-
klicke auf Bearbeiten, dann auf aktivieren und “Statische Website bereitstellen”

- gib dort auch ein: index: index.html und in error: 404.html
- klicke auf Speichern, merke dir die “Website-Endpunkt des Buckets”, sie sieht so aus: http://microsoft.com.s3-website-ap-southeast-2.amazonaws.com
- gehe zu den Bucket-Berechtigungen, siehe die Bilder unten. Der öffentliche Zugriff darf nicht blockiert sein.


- Bucket-Richtlinie (ersetze microsoft.com durch deinen Domainnamen):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::microsoft.com/*"
}
]
}
2. Zertifikat erstellen
gehe zu AWS Certificate Manager https://console.aws.amazon.com/acm wähle die richtige Region.
- klicke auf Anforderung (Request)
- öffentliches Zertifikat
- Domainnamen: nimm zwei wie: “microsoft.com” und “www.microsoft.com”
- du kannst nach weiteren Subdomains fragen wie “blog.microsoft.com”, “xmpp.microsoft.com” etc.
- führe die DNS-Validierung durch. Es ist viel einfacher, dies über die Route53-Konsole zu tun, wenn dein Registrar AWS ist.
3. Lambda-Funktion zu Lambda@Edge deployen
Die Lambda@Edge-Funktion schreibt die Hugo-Quickstart-Projekt-URLs für Verzeichnisse auf ein Standardobjekt, index.html, um. So dient CloudFront der URI ‘/posts/my-post/’ mit dem Inhalt ‘/posts/my-post/index.html’ und gibt 200 statt 404 zurück.
Flavor Cafe (Scotch) Lambda@Edge Code
// Hugo auf Cloudfront, Lambda@Edge Funktion
// Flavor Cafe (Scotch)
// @starpebble auf github
//
// Zwei Umbenennungsregeln für Hugo-Subverzeichnis-URIs.
// Beispiel:
// 1. schreibe URI /posts/ um zu /posts/index.html
// 2. schreibe URI /posts um zu /posts/index.html
//
// Füge so viele Dateierweiterungen hinzu, wie du möchtest für Regel 2.
// URIs, die mit einer bekannten Dateierweiterung enden, werden durch Regel 2 nicht umgeschrieben.
'use strict';
// @starpebble auf github
// hugo flavor cafe (scotch)
const DEFAULT_OBJECT = 'index.html';
exports.handler = (event, context, callback) => {
const cfrequest = event.Records[0].cf.request;
if (cfrequest.uri.length > 0 && cfrequest.uri.charAt(cfrequest.uri.length - 1) === '/') {
// z.B. /posts/ zu /posts/index.html
cfrequest.uri += DEFAULT_OBJECT;
}
else if (!cfrequest.uri.match(/.(css|md|gif|ico|jpg|jpeg|js|png|txt|svg|woff|ttf|map|json|html)$/)) {
// z.B. /posts zu /posts/index.html
cfrequest.uri += `/${DEFAULT_OBJECT}`;
}
callback(null, cfrequest);
return true;
};
4. AWS CloudFront CDN erstellen
Dies wird mit der neuen AWS-Konsolen-Benutzeroberfläche nicht funktionieren; Sie müssen den AWS CLI-Befehlszeilenbefehl verwenden – bitte siehe Erstelle AWS CloudFront auf Pay-as-You-Go (nicht der Free-Plan)
gehe zu https://console.aws.amazon.com/cloudfront
- Verteilung erstellen (Create Distribution)
- Ursprung (Origin) erstellen, der auf deinen S3-Bucket zeigt

- Zertifikat für deine Website
- wenn es angeboten wird, in eine statische Website umzuwandeln – stimme zu
- verhalte (Behaviour) erstellen, das auf deinen Ursprung zeigt, und Redirect HTTP zu HTTPS

- unten in Verhalten/Funktionszuordnungen - in Ursprungsanfrage (Origin Request) - wähle deine Lambda-Funktion

- Speichern
- Gehe zum Reiter Allgemein deiner Verteilung und kopiere deinen Verteilungs-Domainnamen. Sollte so aussehen: asdfasdfasdf.cloudfront.net

5. AWS Route53 DNS auf deine CloudFront zeigen
gehe zu https://console.aws.amazon.com/route53/v2/hostedzones
- erstelle oder klicke auf deine gehostete Zone der Website. Sollte wie deine Website heißen: zum Beispiel: “microsoft.com”
- erstelle eine leere “A”-Eintragung, die auf deine CloudFront-Verteilung zeigt (Verteilungs-Domainnamen)
- erstelle eine “A”-Eintragung für “www”, die als Alias auf deine erste “A”-Eintragung zeigt
6. AWS CLI installieren
- Installiere AWS Client-Befehlszeilentools https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
- konfiguriere die AWS CLI-Verbindung
- prüfe die Datei ~/.aws/credentials, sie sollte etwas wie Folgendes enthalten
[default]
aws_access_key_id = .......
aws_secret_access_key = .......
- teste die Verbindung, gib etwas wie unten ein, um deinen S3-Bucket zu sehen
aws s3 ls
7. config.toml aktualisieren
- öffne deine hugo.toml oder config.toml in deinem Hugo-Projekt
- füge am Ende hinzu (ersetze wieder microsoft.com durch deine Domain):
[[deployment.targets]]
# Ein willkürlicher Name für dieses Ziel.
name = "lfs3"
# S3; siehe https://gocloud.dev/howto/blob/#s3
# Für S3-kompatible Endpunkte, siehe https://gocloud.dev/howto/blob/#s3-compatible
URL = "s3://microsoft.com?region=ap-southeast-2"
# Wenn du ein CloudFront CDN verwendest, wird deploy den Cache bei Bedarf invalidieren.
cloudFrontDistributionID = ""
Wenn du deine Konfigurationen in config.yml hältst, sollte es so aussehen:
deployment:
targets:
name: "lfs3"
URL: "s3://microsoft.com?region=ap-southeast-2"
cloudFrontDistributionID: "E123123123"
- speichere diese Datei
- kompiliere deine Website
hugo
- deploye sie mit dem hugo deploy Befehl
hugo deploy
- öffne deine Website-URL im Browser, um zu sehen, ob alles funktioniert hat
Für weitere Themen zur Web-Infrastruktur, siehe den Web-Infrastruktur-Pfeiler.
Nützliche Links
- Google Formular in Hugo-Website einreichen
- Strukturierte Datenmarkierung zur Hugo-Website hinzufügen
- Hugo Cheatsheet
- Hugo-Website zu AWS S3 mit AWS CLI deployen
- Verwenden von Gitea Actions, um Hugo-Website zu AWS S3 zu deployen
- Hugo Quickstart: https://gohugo.io/getting-started/quick-start/
- Große Liste von Hugo-Thema-Beispielen: https://themes.gohugo.io/
- Hugo Hosting und Deployment: https://gohugo.io/hosting-and-deployment/
- Bilderhandhabung im Mainroad Hugo-Thema: Mainroad-Thema-Bilderhandhabung
- AWS Command Line Interface (AWS CLI) installieren: https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
- Beliebteste Themen für Hugo
- Wie man Thumbnail-Bilder im Page-Bundle-Ordner für Hugo-Websites mit Mainroad-Thema speichert
Ich hoffe, dieses kleine Howto-Dokument wird dir helfen. Hab einen schönen Tag!