Ako na statické stránky cez AWS

AWSWebhosting

Dá sa povedať, že hosting statických stránok je vyriešená vec. Aj je, akurát nesmiete chcieť HTTPS a vlastnú doménu. Potom sa to komplikuje.

Napadlo mi presunúť niektoré zo statických stránok na AWS S3. Ten storage je veľmi lacný a pri malom počte requestov sa dostanete na cenu, akú vám nie je schopný ponúknuť asi žiadny webhosting. A tiež, chcel som sa pobaviť s AWS.

Celý proces môžno rozdeliť do niekoľko krokov:

  • vytvorenie priestoru na AWS S3 (ďalej len bucket – z angl. Bucket)
  • nastavenie DNS kvôli vlastnej doméne pomocou Route 53 a nasmerovanie na vytvorené buckety
  • pridanie certifikátu a vytvorenie Distribution v službe CloudFront (ďalej len distribution), zrušenie aliasov smerujúcich na S3, nastavenie nových aliasov smerujúcich na CloudFront

Kroky s nasmerovaním na S3 by sme mohli vynechať a ísť rovno na CloudFront. Avšak pre ilustráciu ich tam nechám a nastavíme aliasy aj na ne. Nie každý chce HTTPS.

S3 - Simple Storage Service

Práca s S3 veľmi jednoduchá, vytvoríte si dva buckety - jeden s www, ďalší bez www. Bucket je nejaký priestor (resp. miesto, storage alebo kontajner), kam budete ďalej nahrávať svoje súbory. Schválne nebudem používať výraz kontajner, nech niekoho nemýli, že píšem o Dockeri alebo čo.

Hneď po vytvorení bucketov, budú dostupné na takýchto adresách (vaše sa budú líšiť doménou a lokalitou):

  • www.nieco.sk.s3-website.eu-central-1.amazonaws.com
  • a nieco.sk.s3-website.eu-central-1.amazonaws.com

Zatiaľ budú hlásiť, že pre ne nie je nakonfigurovaná žiadna stránka. Predpokladajme, že chcete ako primárny použiť ten s www, a tak nahráte svoje súbory naň.

Buckety sa dajú používať buď tak ako ich vidíte (v tom prípade vám asi bude stačiť aj jeden), stačilo by zapnúť website hosting. Alebo si k nim nastavíte vlastnú doménu. Pre použitie vlastnej domény však bude treba ďalšiu službu od AWS – konkrétne tú na správu DNS, Route 53.

Iné použitie S3

Použitie Route 53 nie je úplne nevyhnutné, ak sa chystáte S3 použiť len na úložisko (napr. obrázkov), a nie na hostovanie celej stránky.

S3 Static Website Hosting (ďalej len website hosting) HTTPS neposkytuje, no na získavanie konkrétnych súborov z S3 už HTTPS použiť môžete.

Tieto príklady vám to ozrejmia:

  1. http://img.nieco.sk.s3-website.eu-central-1.amazonaws.com/pic.jpg fungovať bude, ak je zapnutý website hosting
  2. https://img.nieco.sk.s3-website.eu-central-1.amazonaws.com/pic.jpg fungovať nebude, jedná sa o prístup k website hosting cez HTTPS (port 443 ani nie je povolený)
  3. https://img.nieco.sk.s3.amazonaws.com/pic.jpg fungovať bude (získanie konkrétneho objektu)

V bode 3. ešte uvidíte chybu, že certifikát a doména nie sú totožné. Je to spôsobené bodkami v názve bucketu. Riešením je premenovať bucket img.nieco.sk na img-nieco-sk. Je to potrebné len vtedy, keby ste plánovali linkovať na objekty priamo z bucketu a chcete HTTPS.

Ja však chcem aby stránka (aj s www aj bez www) smerovala na jeden bucket. A navyše, nech funguje presmerovanie z jednej verzie na druhú.

Route 53

Túto službu treba použiť, ak plánujete hostovať na vlastnej doméne. Obidve varianty stránky nasmerujete na S3. Riešenie je opäť vcelku jednuduché, akurát vyžaduje presun vašich NS na AWS, čo môže niekoho odradiť.

Presun spočíva vo vytvorení novej Hosted zone (doména, ktorej DNS idete nastavovať; ďalej len zóna) v administrácii Route 53. Po tomto kroku uvidíte záznamy k vašej doméne podobné nasledujúcim:

nieco.sk. 172800 IN NS  ns-1.awsdns-5.org.
nieco.sk. 172800 IN NS  ns-2.awsdns-6.co.uk.
nieco.sk. 172800 IN NS  ns-3.awsdns-7.net.
nieco.sk. 172800 IN NS  ns-4.awsdns-8.com.

nieco.sk. 900    IN SOA ns-1.awsdns-5.org. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400

Aby to však malo efekt, potrebujete zmeniť NS záznamy vašej domény na tie štyri, ktoré sú uvedené vyššie (opäť platí, že pre vašu doménu sa budú líšiť) u vášho aktuálneho poskytovateľa. Až keď budú NS u AWS je možné využívať nakonfigurovanú zónu.

Po zmenení NS záznamov na AWS už stačí len pridať dva aliasy. Pri konfigurácii A záznamu zvolíte, že sa jedná o alias a vyberete rovnomenný website hosting, čím nasmerujete doménu na konkrétne buckety v S3.

Posledným krokom je zapnutie website hostingu v nastaveniach jednotlivých bucketov.

  • v prípade www.nieco.sk sa bude jednať o štandardný website hosting, kde môžete uviesť aj index a error stránku
  • a pre nieco.sk to bude presmerovanie na iný hostname - teda na www.nieco.sk

Výsledkom je stránka, ktorú servujete z AWS S3 na vlastnej doméne, s funkčným presmerovaním.

HTTPS a CloudFront CDN

Tu už narazila kosa na kameň. Samotná S3 vám nevie poskytnúť HTTPS na vlastnej doméne. Ak sa o niečo také usilujete, budete potrebovať ďalšiu službu od AWS, tentokrát CloudFront.

Keďže chcete bežať na vlastnej doméne, potrebujete k danej doméne certifikát. Tento certifikát je nutné nahrať do AWS IAM. Bohužiaľ na to neexistuje klikátko, no poradíte si s AWS CLI. Pred prvým použitím treba CLI nakonfigurovať pomocou aws configure. Potom certifikát nahráte príkazom aws iam upload-server-certificate.

aws iam upload-server-certificate
  --server-certificate-name CertifikatPreDomenuNieco
  --certificate-body file://ssl-certifikat.crt
  --private-key file://privatny-kluc.key
  --certificate-chain file://chain-subor.crt
  --path /cloudfront/nieco/

Ďalším krokom je vytvorenie novej distribution. Jedná sa o súbor nastavení, pomocou ktorých bude možné načítavať obsah do CDN.

Škoda je, že v podstate vám ju vôbec netreba a vytvárate ju len kvôli použitiu vlastného HTTPS certifikátu.

Nastaveniami sa nejdem zaoberať do detailu, to by bolo na ďalší blogpost. Medzi dôležité nastavenia patrí:

  • nastavenie zdroja (Origin) - odkiaľ si má CloudFront načítavať súbory do cache - zdrojom je váš S3 bucket
  • nastavenie alternatívnych CNAME záznamov - či má byť vaša distribution dostupná aj na inej doméne (tu nastavíme obidve alternatívy - s www, aj bez)
  • vlastnosti cache - čo a ako cacheovať, či presmerovať HTTP na HTTPS, či pridať hlavičky, aký typ requestov povoliť a podobne

Po vyklikaní nastavení tejto distribution, ju budete mať dostupnú na doméne podobnej tejto 123abc123abcd.cloudfront.net. Táto adresa beží na HTTPS, čiže ak by ste nechceli vlastnú doménu, je to vcelku ok.

Všetko zatiaľ vyzerá bezproblémovo, chýbam už len posledný krok. Nastavenie CNAME záznamov, aby nieco.sk aj www.nieco.sk smerovalo na CloudFront. CNAME záznam sa vám však nepodarí nastaviť pre doménu bez www, pretože už pre ňu existuje SOA záznam, ktorý zmazať nemôžete (a ani to nejde).

Dá sa to však vyriešiť nastavením aliasu cez Route 53, CNAME záznamy teda potrebovať nebudeme. Tak ako sme pri S3 nastavovali alias (smerovanie na konkrétne buckety), tak teraz môžeme nastaviť aliasy na CloudFront (smerovanie na konkrétnu Distribution). Je možné vybrať len tie, ktoré sme uviedli v nastaveniach Distribution.

Pôvodné aliasy, smerujúce na S3 môžeme zmazať. Taktiež môžeme vypnúť website hosting a zmazať bucket, z ktorého nie je načítavaný žiadny obsah.

Ostali sme teda v stave:

  • funguje https://www.nieco.sk aj https://nieco.sk (vďaka aliasom)
  • funguje presmerovanie HTTP na HTTPS (nastavené v CloudFront)

Posledná vec, ktorú by bolo treba vyriešiť je presmerovanie jednej z domén na tú druhú, aby sme nemali duplikovaný obsah (www.nieco.sk je iná stránka ako nieco.sk).

EDIT (júl 2017): Redirect z domény bez www na doménu s www (alebo opačne) sa dá dosiahnúť vytvorením ďalšej Cloudfront distribúcie a nastavením presmerovania v S3. Výsledkom budú dve kombinácie Cloudfront + S3, a jedna z nich bude pomocou S3 presmerovaná na druhú.

Záver

Čo sa SSL týka, CloudFront s použitím vlastného certifikátu mal v teste od Qualys SSL Labs známku A. Vyzerá to tak, že ak máte v pláne použiť HTTPS na vlastnej doméne, tak AWS S3 + Route 53 + CloudFront je vcelku dobrá voľba. Nepáči sa mi však, že CloudFront sa použije len kvôli SSL. Ďalšie problémy môžu nastať, keď budete chciet zautomatizovať deployment. Po každom bude totiž treba invalidovať cache. A otázkou teda ostáva, či sa takýto proces oplatí absolvovať.

Rôzne typy použitia som zhrnul do malej tabuľky.

Použitie Realizovateľné?
website hosting Áno, budete ho mať v základnom tvare bucketu.
(napr. nieco.sk.s3-website.eu-central-1.amazonaws.com)
website hosting + HTTPS Nie
website hosting + vlastná doména Áno, pridaním Route 53 a nastavením aliasu bude fungovať www.nieco.sk aj nieco.sk.
website hosting + HTTPS + vlastná doména Áno, pridaním CloudFront, no nie je možné nastaviť preferovanú verziu stránky.
storage alebo storage + HTTPS Áno, no treba pristupovať k objektom priamo, nie cez website hosting. Možnosti sú dve. Buď pôjdete cez S3 alebo cez CloudFront.
storage alebo storage + HTTPS + vlastná doména Áno, no jedine cez CloudFront.