AWS w ramach Free Tier udostępnia nam wiele swoich usług za darmo. Niektóre usługi są dostępne w ramach darmowego pakietu przez rok, niektóre są darmowe na zawsze. Oczywiście obowiązują przy tym limity, jednak są one na tyle duże, że spokojnie możemy wykorzystać taką infrastrukturę na start projektu. Czyli dostajemy za darmo, bardzo dobrej jakości usługi, na których możemy oprzeć nasz biznes. W poście postaram się pokazać, jak dużo możemy zmieścić w darmowych limitach, jakie usługi możemy wykorzystać (w tym przypadku do hostowania projektu) i ile to będzie kosztować po roku.
Architektura
Do hostowania frontendu używamy S3, AWS daje możliwość utrzymywania strony w buckecie. Dzięki temu nie potrzebujemy dodatkowego serwera, który będzie nam serwował statyczne zasoby. CloudFront jest opcjonalny, jest to CDN, który przyśpieszy nam dostęp do plików. Route53 jest użyty jako serwer DNS, dzięki któremu wiemy gdzie przekierować domenę. Do obsługi backendu możemy użyć rozwiązania serverless opartego na lambdzie i API Gateway lub postawić jakąś aplikację na instancji EC2. Do przechowywania danych możemy użyć DynamoDB – baza danych serverless i NoSQL lub skonfigurować sobie RDS z MySQL czy PostgreSQL.
Poszczególne serwisy
W rozbiciu zawarłem informację, ile możemy obsłużyć użytkowników za darmo w każdym z serwisów oraz ile będzie to kosztować poza darmowym pakietem. Do kalkulacji użyłem cen z datacenter we Frankfurcie. Dla innych regionów mogą być troszkę inne.
Jeśli chcesz poczytać więcej o poszczególnych usługach, to zapraszam do postu, gdzie opisywałem je szerzej: https://blog.mloza.pl/aws-amazon-web-services-co-to-jest-i-w-jaki-sposob-moge-to-wykorzystac/.
S3 – Simple Storage Service
AWS S3 może być użyty do przechowywania statycznych zasobów, takich jak pliki HTML, CSS, JS oraz obrazki. Dzięki temu możemy tam umieścić całą naszą stronę lub aplikację frontendową bez potrzeby uruchamiania dodatkowego serwera. Płacimy za zużytą powierzchnię dyskową oraz za transfer. W darmowej opcji mamy 5GB przestrzeni dyskowej, 20 000 pobrań zasobów, 2 000 wysyłania na serwer i 15 GB transferu na zewnątrz. Jest to dostępne przez pierwsze 12 miesięcy od zarejestrowania. A jeśli używasz CloudFlare, jako CDN to transfer do CloudFlare jest darmowy, więc nie kosztuje nic.
Mała aplikacja frontendowa to około 20 requestów o zasoby, zajmujące w sumie około 1 MB. Przy takich założeniach możemy obsłużyć około 1 000 wejść miesięcznie na stronę (jeśli za każdym razem będą pobierane wszystkie zasoby).
Poza darmowym planem koszt przechowywania 1 GB danych to $0.0245, a koszt 1 000 pobrań zasobu to $0.00043. Za transfer zapłacimy $0.09/GB. Czyli kolejny 1 000 wejść będzie nas kosztowało niecałe 10 centów. Chyba że używamy CloudFronta, wtedy nie płacimy za transfer (a przynajmniej nie w ramach usługi S3).
Pełny cennik jest dostępny tutaj: https://aws.amazon.com/s3/pricing/
CloudFront – opcjnalnie
CloudFront jest to Content Delivery Network (CDN). W skrócie usługa ta umieszcza statyczne zasoby w centrach danych znajdujących się w różnych częściach świata. Dzięki temu użytkownik, który chce je pobrać, dostanie je z miejsca, które jest najbliżej jego lokalizacji. Oznaczyłem to jako opcjonalny element, ponieważ bez niego mała aplikacja może z powodzeniem działać. Jednak jeśli mamy do dyspozycji darmowo taką usługę to możemy z niej skorzystać.
W darmowym pakiecie AWS oferuje 50GB transferu na zewnątrz i 2 000 000 (dwa miliony!) zapytań HTTP(S) na miesiąc. Darmowy pakiet wygasa po roku. Jeśli używamy kalkulacji z poprzedniego postu, to pozwala nam obsłużyć około 50 000 użytkowników w miesiącu (1 666/dzień).
Poza darmowym pakietem cena jest uzależniona od regionu, z którego pochodzi użytkownik. W Europie zapłacimy $0.009 za 10 000 żądań HTTP i $0.012 za HTTPS. Jeśli chcielibyśmy obsłużyć 1000 użytkowników, to kosztowałoby to nas $0.109 ($0.024 20 000 pobrań zasobów + $0.085 1 GB transferu, z założeniem użycia HTTPS).
Fajną opcją jest to, że przy użyciu CloudFronta możemy mieć za darmo certyfikat SSL.
Cennik znajduje się tutaj: https://aws.amazon.com/cloudfront/pricing/
API Gateway
API Gateway pozwala nam przyjmować żądania i kierować je do różnych usług w AWS. W naszym przypadku takie żądanie byłoby obsługiwane przez Lambdę. Dodatkowo API Gateway daje nam możliwość automatycznej autoryzacji przy użyciu Cognito, jednak to już jest poza zakresem tego artykułu.
Na koszty serwisu składa się ilość wykonanych zapytań HTTP lub czasu połączenia dla WebSocket i transfer. W ramach darmowego pakiety możesz wykonać 1 milion zapytań oraz 750 000 minut połączenia. Darmowy pakiet dostępny jest przez rok. Jeśli nasza aplikacja będzie wykonywać około 50 zapytań do backendu na sesję użytkownika, to możemy obsłużyć około 20 000 sesji użytkowników miesięcznie.
Po zakończeniu darmowego pakietu płacimy $1.20 za milion zapytań HTTP lub $3.70 za milion zapytań REST i $0.09 za GB transferu. Czyli dla 1 000 sesji użytkowników, którzy robią po 50 zapytań i każde zawiera około 20kB odpowiedzi, zapłacimy $0.0937 ($0.09 za transfer + 0.0037 za zapytania REST).
Cennik usługi tutaj: https://aws.amazon.com/cloudfront/pricing/
Lambda
Jak już wspomniałem wcześniej zapytania, które przychodzą do API Gateway, mogą trafiać do Lambdy, aby ta je obsłużyła i wygenerowała odpowiedź. Możemy napisać kawałek kodu w Pythonie, Node.js lub Javie, który będzie obsługiwał zapytania. Lambda dla przykładu może zapisać/odczytać jakieś dane z bazy danych takich jak DynamoDB lub RDS.
W tej usłudze płacimy za ilość wywołań i czas wykonania wyrażony w gigabajtosekundach – musimy pomnożyć ilość zadeklarowanej pamięci razy czas wykonania lambdy. Najmniejsza ilość pamięci to 128 MB.
Darmowy pakiet zawiera milion zapytań i 400 000 GB-sekund. Podczas testów, moja lambda, która zapisuje do Dynamo i wysyła maila przez SES, napisana w Pythonie wykonuje się około 700ms i zabiera 80 MB pamięci. Zakładając takie limity, możemy wykonać 4.5 miliona zapytań, czyli jakieś 90 tysięcy sesji użytkownika.
Darmowy pakiet obejmuje jednak pierwsze 12 miesięcy. Potem zapłacimy $0.20 za milion zapytań i $0.0000166667 za GB-sekundę. Dla naszych przykładowych 1000 sesji użytkownika koszt wyniesie $0.083 ($0.01 za wywołania plus ~$0.073 za czas wykonania).
Cennik: https://aws.amazon.com/lambda/pricing/
DynamoDB – Baza danych NoSQL
Jak już wspomniałem wcześniej, większość aplikacji potrzebuje miejsca, gdzie może przechować dane. W AWS mamy dostępne DynamoDB. Jest to baza NoSQL i do tego serverless. Musimy zadeklarować tylko, jak dużo danych będziemy zapisywać i odczytywać. Definiujemy to podając jednostki zapisu i odczytu. Jedna jednostka zapisu oznacza 1 zapis na sekundę w 1 KB danych. Jedna jednostka odczytu to 1 odczyt, który jest konsystentny lub 2 odczyty z ewentualną konsystencją 4 KB danych. Jednak 3 odczyty po 1 KB zużywają 3 jednostki odczytu, a jeden odczyt 3 KB zużyje 1 jednostkę. Nie płacimy za transfer wewnątrz AWS.
Patrząc na te wymagania, może być trudno oszacować zużycie danych przez naszą aplikację. Najlepiej chyba to zrobić doświadczalnie. Darmowy pakiet obejmuje 25 GB przestrzeni na dane oraz 25 jednostek zapisu i 25 jednostek odczytu. Z doświadczenia powiem, że jest to całkiem sporo i raczej trudno nam to będzie przekroczyć z niewielką aplikacją. Jeżeli założymy, że użytkownik przechowuje 32 KB danych, to możemy zmieścić około 800 000 użytkowników. Odczyt wszystkich danych użytkownika to 8 jednostek odczytu. W takim wypadku 4 użytkowników będzie mogło odczytać swoje dane w tej samej sekundzie, aby zmieściło się to w darmowym pakiecie. Pełny zapis danych to 32 jednostki, co się już nie mieści w darmowym planie. Jeśli jednak nie zapisujemy pełnych danych na raz, to nie będzie problemu.
Warto też zaznaczyć, że darmowy plan nie wygasa, więc po roku nadal możemy korzystać z DynamoDB za darmo.
Cennik znajduje się tutaj: https://aws.amazon.com/dynamodb/pricing
EC2 – Instancja maszyny wirtualnej
EC2 – Elastic Computing Cloud czyli maszyny wirtualne. Jeśli nie chcemy korzystać z możliwości odpalania aplikacji serverless jaką nam daje lambda, możemy sobie uruchomić instancję maszyny wirtualnej i tam postawić naszą aplikację.
Tutaj płacimy za godzinę używania instancji. Cena jest zależna od ilości ramu i procesorów dostępnych dla instancji. Możemy też wybrać instancje posiadające burst – czyli przez krótki czas mogą zużywać więcej mocy procesora niż zadeklarowano.
W ramach Free Tier mamy 750 godzin/miesiąc instancji t2.micro. Maszyna ta posiada 1vCPU oraz 1GB pamięci. 750 godzin to 31 dni i 6h. Dostępne jest to przez rok. Po zakończeniu darmowego okresu instancja ta kosztuje $0.0134/h ($9.648/m-ce). Jednak jest to starsza generacja maszyn. Najnowsza – t3.micro posiada już 2vCPU i 1GB pamięci oraz kosztuje mniej bo $0.012/h ($8.64/m-ce).
Cennik znajduje się na stronie: https://aws.amazon.com/ec2/pricing/
RDS – Baza danych SQL
Jeśli nie chcemy korzystać z bazy danych NoSQL, możemy uruchomić sobie instancję bazy SQL. Amazon oferuje nam bazy MySQL, PostgreSQL, MariaDB, Oracle oraz SQL Server. W darmowym pakiecie otrzymujemy 750h instancji db.t2.micro z jedną z wymienionych wcześniej baz oraz 20 GB przestrzeni dyskowej i 20 GB przestrzeni na kopie zapasowe.
Po wykorzystaniu darmowego okresu musimy zapłacić za instancję oraz za przestrzeń dyskową. Najtańsza instancja kosztuje $0.021/h ($15.21/m-ce). A 1 GB przestrzeni to $0.137/GB-miesiąc.
Cennik: https://aws.amazon.com/rds/pricing/
Route53 – serwer DNS
Route53 zapewnia nam serwer DNSów. Niestety nie posiada on darmowego pakietu jak reszta usług. Dlaczego więc znalazł się w tym zestawieniu? Ponieważ jeśli chcemy skonfigurować CloudFront lub S3 hosting pod główną domeną to musi znajdować się w Route53. Próbowałem to zrobić u innych dostawców, ale nie było takiej możliwości. Główna domena musi mieć wpis A wskazujący IP serwera. W przypadku CloudFronta to IP jest inne w zależności od tego skąd użytkownik wysyła zapytanie. W takim przypadku można użyć też rekordu ALIAS, jednak żaden z dostawców DNS z którego korzystałem nie pozwalał dodać rekordu tego typu.
Route53 kosztuje $0.5 za domenę oraz $0.4 za milion odpytań serwera DNS.
Cennik znajduje się na stronie: https://aws.amazon.com/route53/pricing/
Sumarycznie
Podsumowując, jeśli potrzebujemy hostingu dla małej aplikacji, to przez pierwszy rok możemy płacić jedynie za hosting serwera DNS – $0.5/miesiąc. Po roku koszt może wzrosnąć:
- S3 – płacimy tylko za przechowywane dane, transfer do CloudFronta jest darmowy. Zakładając, że nasza aplikacja cała zajmuje ~5MB, to zapłacimy około $0.002,
- CloudFront – za 1000 sesji użytkowników pobierających po 20 zasobów na sesję zapłacimy około $0.11,
- API Gateway – 1000 sesji po 50 zapytań to znów niecałe $0.10,
- Lambda – znów 1000 sesji po 50 zapytań to koszt $0.083, jednak ten serwis ma dożywotni free tier więc $0,
- DynamoDB – tutaj free tier również się nie kończy, więc możemy pominąć ten koszt,
- Route53 – zawsze kosztuje $0.5 za domenę,
- Koszt EC2 i RDS pomijam, jako że nie potrzebujemy tego jeśli użyjemy lambdy, a koszt jest dość wysoki,
Czyli zgodnie z wyliczeniami, jeżeli nasza aplikacja obsługuje około 1 tysiąc sesji użytkowników w miesiącu, czyli około 30 użytkowników dziennie, to możemy ją utrzymać za $0.5 przez pierwsze 12 miesięcy. Potem zapłacimy za to około $0.22 + $0.5
Wszystkie te ceny nie uwzględniają podatków. Aktualnie podatek pokazuje mi 24%, więc jest to nie mało. Prawie wszystkie usługi w cenniku tanieją po przekroczeniu odpowiednich progów użycia. Dodatkowo Amazon oferuje kolejne zniżki jeśli zadeklarujemy używanie przez kolejne lata. Jeśli chodzi o EC2, ceny możemy również obniżyć, rezerwując instancję na kilka lat w przód. Jednak aby załapać się na takie zniżki, musimy wykręcić rachunek na kilka lub nawet kilkadziesiąt tysięcy dolarów. Przy omawianym mini przypadku jest to niemożliwe.
Podsumowanie
Możemy bardzo tanio utrzymać sobie aplikację z użyciem wysokiej jakości usług. W tym momencie już nie tylko Amazon oferuje darmowe usługi, ale możecie je również znaleźć u dużych dostawców jak Google czy Microsoft. W przyszłych postach postaram się pokazać jak dokładnie można skonfigurować poszczególne usługi tak aby postawić sobie kompletną aplikację.
Dobry artykuł ?
Spoczko opcja :)) trzeba będzie przetestować
To chyba pójdzie ten wpis do devopsów, niech popatrzą co w konfiguracji można zmienić, żeby było taniej ;D