Hostování statického webu na S3 a Cloudfront

Motivace

Dlouhá léta jsem na Digital Ocean držel minimální VPS s Ubuntu pro experimenty, testování a hostování vlastních projektů. Postupem času na serveru zůstal pouze nginx a několik statických html s mojí vizitkou a tímto blogem. Už mě nebavilo platit za hostování statického obsahu s minimální návštěvností a hlavně jsem se chtěl zbavit povinností se správou serveru.

Hledal jsem tedy řešení, které splní:

  1. Nízká cena;
  2. Podpora vlastní domény;
  3. Podpora TLS.

Ideálním kandidátem by byly Github Pages, bohužel nepodporují (leden 2018) TLS na vlastní doméně.

S3

S3 z rodiny AWS netřeba sáhodlouze představovat. Jedná se o cloudové úložiště pro data (objects), která jsou organizovaná v bucketech. Uložit a hostovat pár souborů na S3 nás vyjde měsíčně na zlomky korun — např. v regionu eu-west-1 stojí uložení jednoho GB $0,023 (https://aws.amazon.com/s3/pricing/).

Mějme soubor index.html, který chceme zpřístupnit na naší doméně. Postup je následující:

  1. Vytvoříme nový bucket ve zvoleném regionu (já např. vše umisťuji do eu-west-1). Jméno můžete zvolit libovolné (nikdo jej stejně neuvidí), ideální je např. název webu, který chcete takto hostovat. Žádná jiná nastavení neupravujte. Ještě jednou: v průvodci nastavíme pouze název bucketu a region, zbytek odklikejte.
  2. Nahrajte do nového bucketu index.html s nějakou Hello world hláškou.

Pokud bychom nyní souboru index.html nastavili Permissions na public-read, bude obsah dostupný na adrese ve tvaru https://s3-eu-west-1.amazonaws.com/{BUCKET_NAME}/index.html. Víceméně jsme právě vytvořili vlastní obdobu Github Pages. S3 v nastavení (Bucket > Properties) obsahuje volbu Static website hosting. Tím bychom sice dostali adresu ve tvaru http://{BUCKET_NAME}.s3-website-eu-west-1.amazonaws.com, na kterou už je možné vytvořit DNS CNAME záznam, avšak bez TLS.

Cloudfront

Dalším produktem, který z AWS využijeme, je Cloudfront (https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html) — globální CDN pro distibuci obsahu. Cloudfront se umí postavit před naši S3, hostovat z ní data a hlavně vše zabezpečit vlatním certifikátem. Jako bonus bude váš web skvěle dostupný ze všech koutů světa.

Výsledek tedy bude vypadat zhruba takto:

  O
 /|\   <--- index.html ---< [Cloudfront] <--- index.html ---< [S3]
 / \

Vytvoření nové distribuce na Cloudfront

Nová distribuce na Cloudfront
Vytvoříme novou distribuci
Hostujeme statický web na S3/Cloudfront
Máme web, chceme web.
Hostujeme statický web na S3/Cloudfront
Po kliknutí do pole Origin Domain Name nám nabídne formulář S3 buckety. Vybereme ten, který jsme v předešlém kroku vytvořili.
Hostujeme statický web na S3/Cloudfront
Necháme Cloudfront, aby upravil Bucket Policy za nás. Bucket tak zůstane privátní, ale naše nová distribuce k němu získá přístup.
Hostujeme statický web na S3/Cloudfront
(volitelné) Povolíme kompresi objektů.
Hostujeme statický web na S3/Cloudfront
Do Alternate Domain Names zadáme název domény, přes kterou budou návštěvníci přicházet. Dále vybereme TLS certifikát z AWS Certificate Manager. Pokud žádný nemáme, požádáme o jeho vydání. Více o tom v následující sekci.
Hostujeme statický web na S3/Cloudfront
(volitelné) Jako výchozí objekt zvolíme index.html. Díky tomu bude výchozí stránka webu dostupná na https://example.com. IPv6 necháme povolené.

SSL/TLS Certifikát

V předchozím kroku jsme použili certifikát z ACM (AWS Certificate Manager, https://aws.amazon.com/certificate-manager/). Ty vystavuje Amazon podobným způsobem jako Let’s Encrypt. Jejich ohromnou výhodou je, že se o celý proces validace, vystavení a prodlužování certifikátu stará Amazon automaticky. Vy sice nemáte přístup k privátnímu klíči, ale používáte tyto certifikáty zdarma.

Pozor, abyste mohli zabezpečit Cloudfront na vlastní doméně, je nutné požádat o certifikát z regionu N. Virginia (US East). Region Cloudfrontu, S3 a dalších služeb nehraje roli.

Please visit the AWS Global Infrastructure pages to see the current Region availability for AWS services. To use an ACM certificate with Amazon CloudFront, you must request or import the certificate in the US East (N. Virginia) region. ACM certificates in this region that are associated with a CloudFront distribution are distributed to all the geographic locations configured for that distribution. https://aws.amazon.com/certificate-manager/faqs/

Nastavení domény v Route53

Rekapitulace:

  • V S3 máme obsah našeho statického webu (index.html).
  • Na S3 je nasměrovaná Cloudfront distribuce s certifikátem z ACM.

Posledním krokem je tedy nasměrování domény example.com v Route53 (DNS manager v AWS) na vytvořenou Cloudfront distirbuci.

Hostujeme statický web na S3/Cloudfront
Zvolíme Hosted Zone naší domény
Hostujeme statický web na S3/Cloudfront
Vytoříme nový záznam — alias na Cloudfront distribuci

A to je vše. Gratuluji. Na example.com by měl být dostupný obsah z S3.

Závěr

Navržené řešení se skvěle hodí i pro hostování SPA. Nevýhodou je chybějící podpora pokročilejší konfigurace: mně při přesunu blogu na S3/Cloudfront chyběla možnost nastavit rewrite pravidla, přesměrování a některé hlavičky. Na druhou stranu vše funguje jednoduše a téměř nic se při provozu nemůže pokazit.

Některé drobnosti se mi nepodařilo vyřešit. Například Default Root Object na Cloudfrontu správně zobrazí obsah index.html při požadavku na /, ale už nedovede přesměrovat example.com/index.html zpět na /. Pokud se na index.html dostane Google, zaindexuje duplicitní obsah. Jediné, co mě napadlo, je nastavit canonical URL:

<link rel="canonical" href="https://www.example.com/">

A cena? Nejdražší na celém řešení je Route53 ($0,5 za jednu Hosted Zone), zbytek je téměř zdarma.

Hostujeme statický web na S3/Cloudfront
Celková měsíční cena za hostování blogu a webové vizitky.

V některém dalším článku rozepíšu přesměrování z non-www na www a hostování stránek bez .html v URL.


Komentáře