• CloudPouch NEW!
  • Akademia
  • Blog
  • O stronie
  • Home

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 *”rozproszony 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 *”po 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’u, 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, “pojedynczy 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’ow (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ł




Cześć

Nazywam się Paweł Zubkiewicz i cieszę się, że tu jesteś!
Od ponad 18 lat profesjonalnie tworzę oprogramowanie, a od 2016 roku pasjonuje się Serverless.
Tą stronę stworzyłem z myślą o Tobie i o nas wszystkich, którzy uważają, że trend serverless trwale zmieni sposób tworzenia oprogramowania.
Więcej o tej stronie...

Kategorie

Pobierz bezpłatny PDF

Poradnik 12 Rzeczy o Serverless

Wybrane artykuły