• Akademia
  • Blog
  • O Serverless
  • O stronie

Serverless hosting serwisu WWW


Czyli w jaki spos贸b postawi膰 stron臋 WWW bez serwera?

Serverless hosting serwisu WWW

W Internecie istniej膮 setki milion贸w blog贸w. Z czego wi臋kszo艣膰 dzia艂a na WordPress 鈥 aplikacji serwerowej napisanej w PHP. Wed艂ug statystyk, kt贸re podaje organizacja rozwijaj膮c t膮 platform臋, jest to a偶 75 milion贸w stron, czyli 27% ca艂ego Internetu (藕r贸d艂o).

Jakby nie patrze膰 jest to imponuj膮ce osi膮gni臋cie tego oprogramowania open source. W praktyce prawie ka偶dy na has艂o blog my艣li Wordpress. Istniej膮 jednak inne rozwi膮zania pozwalaj膮ce na zaistnienie w Internecie bez konieczno艣ci posiadania w艂asnych serwer贸w.

Uwaga: Severless Polska korzysta z rozwi膮zania opisanego poni偶ej!

Hosting serverless

Hosting serverless w AWS opiera si臋 na po艂膮czeniu trzech popularnych us艂ug. 殴r贸d艂em jest wiaderko AWS S3, z kt贸rego us艂uga AWS S3 serwuje pliki do AWS CloudFront. Zawarto艣膰 strony WWW jest dost臋pna pod url domeny zdefiniowanym w Route53, je艣li nie chcemy to domena nie musi by膰 skonfigurowana w AWS.

Hosting serverless

Bezserwerowy hosting strony WWW na AWS

Na diagramie widzimy og贸lny proces dzia艂ania rozwi膮zania.

  1. Nast臋puje 偶膮danie po艂膮czenia z przegl膮darki do strony WWW przez Internet
  2. Strona WWW znajduje si臋 pod adresem URL skonfigurowanym w Hosted Zone w Route53
  3. URL wskazuje na dystrybucj臋 AWS CloudFront
  4. Dystrybucja CloudFront jako 藕r贸d艂o ma ustawione wiaderko S3.

Wiaderko S3 jest niepubliczne i tylko dystrybucja CloudFront ma do niego dost臋p, co zwi臋ksza bezpiecze艅stwo rozwi膮zania (szczeg贸lnie w przypadku SPA o czym poni偶ej wspominam).

CloudFront to oferowana przez AWS us艂uga typu content delivery network (CDN), czyli *鈥漴ozproszony system dostarczania tre艣ci do wielu centr贸w danych i punkt贸w wymiany ruchu w Internecie鈥. CloudFront to taki globalny cache dla stron WWW, wideo, API i aplikacji webowych. Posiada 166 punkt贸w dost臋powych (*edge location) na ca艂ym 艣wiecie, to znaczy, 偶e gdy kto艣 wchodzi na stron臋 WWW dostarczan膮 przez CloudFront to zostanie on skierowany do najbli偶szego geograficznie punktu, w kt贸rym znajduje si臋 kopia strony. Je艣li w najbli偶szym punkcie nie ma jeszcze kopii (lub si臋 zdezaktualizowa艂a) to CDN pobierze aktualn膮 wersj臋 ze 藕r贸d艂a i przeka偶e klientowi.

Aktualnie najbli偶szy punkt dost臋powy dla nas znajduje si臋 w Warszawie.

Punkty dost臋powe

Regiony AWS oraz punkty dost臋powe CloudFront na 艣wiecie

U偶ywanie CDN to dosy膰 stara praktyka optymalizacji ruchu w Internecie, osobi艣cie s艂ysza艂em o niej jeszcze w latach 90-tych ubieg艂ego wieku. Na pewno wiele si臋 zmieni艂o od tamtych czas贸w, natomiast nie by艂oby w CloudFront nic interesuj膮cego gdyby nie Lambda@Edge.

Co to jest Lambda@Edge ?

Jest to specjalny rodzaj funkcji Lambda, kt贸ra jest uruchamiana bli偶ej klienta, st膮d te偶 angielska nazwa Edge (kraw臋d藕, brzeg, skraj). Taka architektura pozwala zaoszcz臋dzi膰 na czasie (dla nas kod wykona si臋 w Warszawie, a nie w Stanach) oraz wykona膰 funkcj臋 w kontek艣cie geograficznym na przyk艂ad przekierowa膰 u偶ytkownika spoza Polski na angielskoj臋zyczn膮 wersj臋 strony. Innym zastosowaniem mo偶e by膰 zablokowanie okre艣lonych cz臋艣ci naszej strony (np. sklepu internetowego) dla os贸b z kraju gdzie nie mo偶emy prowadzi膰 dzia艂alno艣ci - wszystko to bez ingerencji w kod 藕r贸d艂owy aplikacji - na marginesie m贸wi膮c jest to pot臋偶na funkcjonalno艣膰 tego rozwi膮zania.

Zdarzenia na skraju funkcji 馃槈

Jak wspomnia艂em, Lambda@Edge jest osadzona w dystrybucji CloudFront i jest w stanie reagowa膰 tylko i wy艂膮cznie na zdarzenie wygenerowane przez t臋 us艂ug臋. Zosta艂y one przedstawione na rysunku poni偶ej. Istniej膮 tylko cztery, a do tego s膮 symetrycznie, wi臋c 艂atwo je zrozumie膰. Mamy zatem 偶膮danie i odpowied藕 pomi臋dzy klientem a CloudFrontem i analogiczn膮 par臋 pomi臋dzy CloudFrontem a 藕r贸d艂em (w naszym wypadku wiaderkiem S3, gdzie umieszczone s膮 pliki HTML, JS, obrazki itp.).

Zdarzenia Lambda@edge

殴r贸d艂o: [CloudFront Events That Can Trigger a Lambda Function](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-cloudfront-trigger-events.html)

W moim rozwi膮zaniu dzia艂a jedna funkcja Lambda, kt贸ra jest odpowiedzialna za obs艂ug臋 艂adnych URLi i reaguje na zdarzenie typu Viewer request. To znaczy, 偶e gdy kto艣 pr贸buje odwiedzi膰 https://serverlesspolska.pl/2018/12/01/Wiarygodnosc/ to Lambda zmodyfikuje jego 偶膮danie tak aby CloudFront wys艂a艂 mu w odpowiedzi plik https://serverlesspolska.pl/2018/12/01/Wiarygodnosc/index.html. Niestety, ale na chwil臋 obecn膮 CloudFront nie jest w stanie samemu si臋 domy艣le膰, 偶e klientowi chodzi o plik index.html i zwr贸ci b艂膮d 404 je艣li nie b臋dzie mia艂 skonfigurowanej takiej funkcji lambda. Takie 偶ycie.

Schemat dzia艂ania Serverless Polska

Strona https://serverlesspolska.pl dzia艂a w modelu serverless jak na diagramie poni偶ej.
Hosting serverless

Bezserwerowy hosting strony WWW na AWS wraz z Lambda@Edge dla osoby 艂膮cz膮cej si臋 z Polski.

Gdzie si臋 podzia艂 m贸j WordPress?

Poniewa偶 AWS S3 nie pozwala na uruchamianie kodu *鈥漰o stronie serwera鈥* (taki 偶arcik 馃ぃ) nie mo偶emy mie膰 strony napisanej w PHP, Ruby czy innej serwerowej technologi. Nie ma mowy o WordPress! Ale to dobrze, aby zapewni膰 sobie maksymaln膮 wydajno艣膰 i skalowalno艣膰 przy niskich kosztach generujemy statyczne pliki HTML wraz z JavaScirpt, kt贸ry zapewnia dynamik臋 strony WWW. Sam par臋 dni temu si臋 dowiedzia艂em, 偶e takie podej艣cie ma ju偶 swoj膮 nazw臋 JAMstack od JavaScript, API i Markup.

Na rynku istnieje kilka open sourcowych rozwi膮za艅 s艂u偶膮cych generowaniu ca艂y serwis贸w WWW, g艂贸wnie typu blog. Mi臋dzy innymi mamy do wyboru Jekyll, kt贸ry nap臋dza GitHub Pages, co jest ju偶 rekomendacj膮 sam膮 w sobie. Alternatyw膮 jest hexo.io, z kt贸rego osobi艣cie sam korzystam na Serverless Polska. Artyku艂y s膮 pisane w markupie (jak wikipedia) dzi臋ki czemu pisz膮c nie trzeba si臋 pa艂owa膰 z wygl膮dem. Nast臋pnie za pomoc膮 polecenia hexo generate generowany jest statyczny kod HTML+JavaScript. Ostatnim etapem jest wys艂anie nowowygenerowanych plik贸w do wiaderka S3 i poproszenie CloudFront o inwalidacj臋 cache鈥檜, aby w swoich kopiach zast膮pi艂 star膮 wersje strony now膮.

Warto podkre艣li膰, 偶e tego typu rozwi膮zania (Jekyll, hexo) dzia艂aj膮 bez bazy danych! Czyli o jedn膮 absorbuj膮c膮 i kosztown膮 rzecz mniej! Oczywi艣膰ie brak bazy danych znakomicie u艂atwia skalowanie i zasadniczno sprawia, 偶e zn贸w chce si臋 偶y膰 馃構 To jest ogromna zaleta!

殴r贸d艂a serwisu Serverless Polska s膮 normalnie trzymane w gicie (AWS CodeCommit), dlatego nie ma najmniejszego problemu aby proces aktualizacji strony zautomatyzowa膰 przy pomocy AWS CodeBuild lub innego, dowolnego narz臋dzia CI. Ca艂y proces publikacji nowej wersji to wywo艂anie trzech komend po commicie do repozytorium.

1
2
3
hexo generate
aws s3 sync public s3://wiaderko-s3/ --delete
aws cloudfront create-invalidation --distribution-id id-dystrybucji --paths "/*"

 
I to wszystko, dzia艂a jak marzenie 馃槑

SPA (Singe Page Application) hosting

Je艣li masz lub chcesz uruchomi膰 aplikacj臋 typu SPA to hosting serverless b臋dzie dla Ciebie idealny. Sam posiadam serverlessowy startup, gdzie frontend napisany w React.js jest hostowany w takim samym modelu (z pomini臋ciem funkcji Lambda@Edge bo dla SPA nie jest potrzebna).

Szyfrowane po艂膮czenia

Aby mie膰 certyfikat TLS musimy skorzysta膰 z us艂ugi AWS Certificate Manager, kt贸ra pozwala na wygenerowanie darmowego certyfikatu w regionie N.Virginia (us-east-1). Taki certyfikat bezproblemowo integruje si臋 z dystrybucj膮 AWS CloudFront.

Tradycyjny hosting a serverless

Rozwa偶my dwa tradycyjne modele stawiania stron WWW pod Wordpress. M贸wi臋 tutaj o komercyjnych zastosowaniach, gdzie chcemy mie膰 w艂asn膮 domen臋, po艂膮czenie szyfrowane TLS (https) oraz jako tak膮 pewno艣膰, 偶e strona b臋dzie dzia艂a膰. Hosting u szwagra w szafie odpada 馃構

Dedykowany serwer Wykupiony hosting
Trwa艂o艣膰 (czy nie stracisz danych) Tylko je艣li robisz backupy. Ale gdzie skoro masz jeden serwer? 艢rednia do wysoka. Zazwyczaj robione s膮 codzienne backupy i s膮 wbudowane mechanizmy przywracania backup贸w.
Skalowalno艣膰 (czy obs艂u偶y nieprzewidziany du偶y ruch) Brak. Musisz mie膰 maszyn臋 tak mocn膮 jak najwi臋kszy peak twojego ruchu. Innymi s艂owy jak nagle Tw贸j post zyska popularno艣膰 i 100 000 os贸b b臋dzie chcia艂o go przeczyta膰 to Tw贸j serwer mo偶e pa艣膰. Niska. Rozszerzalna za op艂at膮. P艂acimy wi臋cej nawet gdy jest ma艂y ruch.
Dost臋pno艣膰 (czy jest odporny na awarie) Niska, 鈥減ojedynczy punkt awarii鈥. Du偶a. (tak dobra jak dostawcy, kt贸rego wybierzemy)
Globalny CDN Brak. Tak lub w opcji.
Koszt Wysoki. 艢redni lub wysoki.
Zaanga偶owanie w obs艂ug臋 Bardzo wysokie. W pe艂ni manualna konfiguracja. Trzeba ustawi膰 maszyn臋 samemu i si臋 ni膮 opiekowa膰 (pacze, updejty, bezpiecze艅stwo). Bardzo niskie. Kupujemy us艂ug臋 i dzia艂a.
J臋zyki wykonywalne po stronie serwera Tak. Tak.
 

Jak wida膰 powy偶sze opcje maj膮 dwa podstawowe problemy:

  1. nie s膮 skalowalne,
  2. generuj膮 koszty nawet gdy stoj膮 bezczynnie - op艂aty nie odzwierciedlaj膮 realnego u偶ycia.

Hosting serverless oferuje

Serverless hosting
Trwa艂o艣膰 (czy nie stracisz danych) Bardzo wysoka.
Skalowalno艣膰 (czy obs艂u偶y nieprzewidziany du偶y ruch) Praktycznie nieograniczona, dynamiczna.
Dost臋pno艣膰 (czy jest odporny na awarie) Bardzo du偶a.
Globalny CDN Tak [wbudowany CloudFront].
Koszt Bardzo niski, bezpo艣rednio zale偶ny od ruchu.
Zaanga偶owanie w obs艂ug臋 艢rednie. Trzeba na pocz膮tku skonfigurowa膰 ale potem si臋 ju偶 nic nie robi.
J臋zyki wykonywalne po stronie serwera Nie. Tylko JavaScript po stronie klienta.
 

Jak wida膰 hosting serverless ma zdecydowan膮 przewag臋 nad tradycyjnymi rozwi膮zaniami. Technicznie jest to 艣wietna opcja, kt贸r膮 gor膮co polecam ka偶demu, przynajmniej pod rozwag臋.

R贸wnocze艣nie, mam 艣wiadomo艣膰, 偶e dla wi臋kszo艣ci firm i ludzi odej艣cie od WordPress mo偶e wydawa膰 si臋 niemo偶liwe bior膮c pod uwag臋 jego ogromny ekosystem - tysi膮ce plugin贸w, sk贸rek, kurs贸w itd.

Koszty

S膮 uzale偶nione od ruchu na stronie. Zatem je艣li ten artyku艂 zostanie ods艂oni臋ty 200 miliard贸w razy to p贸jd臋 z torbami鈥 馃槅

Serverless Polska 艂apie si臋 w Free Tier. Na chwil臋 obecn膮 g艂贸wnym kosztem jest 50 cent贸w, co miesi膮c rycza艂towej op艂aty za konfiguracj臋 domeny w Route53. Dodatkowo 18 cent贸w za S3, 10 cent贸w za CloudFront i 3 centy za Lambd臋 (to obejmuje te偶 koszy u偶ycia spoza Serverless Polska, moje inne projekty, dane itp.). Razem hosting Serverless Polska wyni贸s艂 81 cent贸w w lutym 2019. Wszystkie us艂ugi poza Route53 s膮 rozliczne w modelu pay-as-you-go, czyli zale偶膮 od realnego u偶ycia i nie generuj膮 koszt贸w w przypadku bezczynno艣ci.

Jeszcze raz podkre艣lam, 偶e z racji u偶ycia hexo.io nie potrzebuje bazy danych, co zmniejsza koszty, oszcz臋dza m贸j czas na obs艂udze i nie tworzy problem贸w przy skalowaniu.

AWS Free Tier

AWS Free Tier posiada nast臋puj膮ce limity

  • CloudFront: 50GB data transfer out, 2,000,000 HTTP and HTTPS Requests.
  • S3: 5GB na dane, 20,000 request贸w, 2,000 put鈥檕w (prez rok)

Lambda@Edge nie ma darmowej opcji. Kosztuje:

  • $0.0000006 per request, czyli 60 cent贸w za milion request贸w, plus
  • $0.00000625125 za ka偶d膮 sekund臋 dzia艂ania z pami臋ci膮 128MB (przy wi臋kszych zasobach odpowiednio dro偶ej)

Mi艂ego dnia i powodzenia przy tworzeniu rozwi膮za艅 serverless!
Pawe艂