Symfony v oblacích – aneb nebojte se AWS

by on 4.4.2016

Při výběru platformy pro běh webu běžícího na Symfony existuje mnoho cest. Můžeme zvolit klasický webhosting, který postačí pro aplikace nenáročné na výkon. Co když ale chceme využít technologie jako jsou message queues, cachování zdrojů do in-memory úložišť nebo paralelizaci zpracování? V takovém případě už klasický webhosting nebude stačit a musíme se poohlédnout po robustnějším řešení. A jedním z těch nejuniverzálnějších řešení jsou Amazon Web Services (AWS).

První kontakt s AWS může na vývojáře působit až skličujícím dojmem. Najednou má k dispozici tolik možností, tolik různých služeb a tolik cest, jak provětrat svoji peněženku, že ho postihne až posvátná hrůza. Zpočátku si ale vystačíme s pár službami, které pokryjí základní potřeby naší aplikace.

Amazon Services

Služby dostupné v AWS

V nejkrajnějším případě je možné pro všechno použít jednu instanci EC2 (obdoba VPS). To je sice nejlevnější možnost, ale je zároveň nejvíc náchylná na výpadky kvůli single-point-of-failure – pro nedostupnost aplikace stačí, aby vypadla jedna instance EC2. Mnohem lepší je naplnit potřeby aplikace dílčími službami, které beží nezávisle na sobě.

Nyní si ukážeme nejsnadnější cestu, jak toho dosáhnout.

Výpočetní prostředí

Aplikace v AWS mohou běžet v různých prostředích, ale pro naše účely nám bude stačit instance EC2. Tu si můžeme otestovat zdarma v rámci AWS Free Tier, který nám umožní nepřetržitý běh jedné micro instance s 1 jedním jádrem a 1 GB operační paměti po dobu jednoho měsíce (750 hodin).

Vzhledem k tomu, že chceme využít další služby v rámci AWS a nechceme se příliš věnovat nastavování systémových služeb, použijeme při vytváření instance image Linuxu dodávaný přímo Amazonem.

Amazon Linux AMI

Linux Image při základání instance

 

Ten má v sobě již vyřešeny všechny požadavky na napojení dalších AWS služeb, jako je databáze, message queues, atp. Při řešení potíží už lze najít na internetu hodně návodů, příspěvků na StackOverflow a některé služby už nabízí přímo návody pro tento typ Linuxu. Pokud tedy oželíme nejnovější verze některých balíčků (např. PHP 7 – stav duben 2016), je to jasná volba.

Při zakládání instance máme možnost využít i předpřipravené image např. s LAMP nebo LEMP stackem. Tuto možnost ale nedoporučuji. Může se zdát, že tak ušetříme čas, ale dle mých zkušeností je to spíš naopak. Musíme se zorientovat na serveru, který konfiguroval někdo jiný a který nemusí vyhovovat našim potřebám. Lepší je investovat trochu vlastní píle a prostředí si nakonfigurovat sami.

Všechny potřebné balíčky (PHP, Apache/nginx, PHP-FPM, …) se v rámci Amazon Linuxu instalují systémovou utilitou „yum“. Instalace všeho potřebného pro běh aplikace pak může vypadat takto:

sudo yum install nginx php56-fpm php56

Pro vyhledávání dalších balíčků nebo jejich verzí se hodí příkaz „yum search“. Pokud například chceme zjistit, jaké verze PHP máme k dispozici, použijeme příkaz:

sudo yum search php

Dalším krokem je konfigurace systémových služeb.

Díky rozšíření Symfony po světě už máme k dispozici předpřipravenou konfiguraci pro náš LEMP stack přímo na webu nginx. Nastavení PHP už je na samotném vývojáři. V těchto požadavcích je každá aplikace jiná.

Důležitou součástí životního procesu aplikace je i nasazování nových verzí, kterému se věnuji v samostatném článku.

Databáze

Spravovat vlastní databázový stroj je spousta starostí, kterých nás Amazon ušetřil. Stačí využít jeho službu RDS a vybrat si jeden z nabízených enginů.

Amazon RDS

Databázové stroje dostupné v AWS RDS

Čemu je dobré věnovat pozornost při nastavování služby je security group, která určí, jak se půjde ke službě připojit, tzn. z jakých IP adres a na jaké porty bude povolený přístup. Důkladným rozmyšlením na začátku si ušetříte spousty komplikací v budoucnu, kdy na sebe služby nebudou vidět a vy nebudete vědět proč.

V rámci Free Tier máme možnost využít jeden stroj s 20 GB paměti a 10 miliony operacemi na měsíc, což pro začátek bohatě stačí. V samotné aplikaci se pak k databázi připojíme snadno zkopírováním adresy endpointu do konfiguračního souboru parameters.yml.

Uložení stavu aplikace

Většina aplikací potřebuje udržovat nějaký svůj stav vůči svým uživatelům. Pod „stav“ spadá např. odlišení přihlášených a nepřihlášených uživatelů. Tento stav nechceme držet přímo na výpočetním stroji, kvůli jeho nejisté životnosti. V AWS se primárně nepočítá s tím, že instance EC2 poběží věčně a není dobré se na to spoléhat. Na žádném stroji by tedy neměla být uložena žádná uživatelská data. Tento přístup oceníme v budoucnosti, když se rozhodneme stroje naškálovat a už tak nebude zaručeno, že uživatel pokaždé skončí na stejném stroji, kde se přihlašoval.

Pro uložení stavu aplikace (v případě přihlašování uživatelů ukládání sessions) máme v AWS k dispozici službu ElastiCache (neplést s ElasticSearch), která umožňuje běh buď Memcache nebo Redis instancí. Je to jedna z těch dražších služeb (micro instance s 555 MB paměti vyjde na 14 dolarů měsíčně), ale nemusíme se tak starat o její udržování, škálovaní nebo zálohování. Nic nám ale nebrání v tom vytvořit si vlastní instanci EC2 s Redisem/Memcachem a starat se o vše sami.

Pokud se rozhodnete využít ElastiCache, tak si stačí založit micro instanci s Memcache, na výpočetní stroj nainstalovat balíčky pro podporu Memcache a do nastavení PHP (/etc/php-5.6.ini) přidat tuto direktivu:

session.save_path = "adresa-endpointu:11211"

Pokud používáte Amazon Linux a PHP-FPM je nutné direktivu přidat ještě do souboru:

/etc/php-fpm-5.6.d/www.conf

Shrnutí

Provozovat aplikaci v AWS je snadné a není se čeho bát. Po úvodních strastech při orientaci v nabídce služeb už následují jenom benefity a křivka učení stoupá strmě vzhůru.

AWS má nelichotivou pověst z dřívějších dob, kdy se tam dali prodělat příslovečné kalhoty. V dnešní době už má každý průběžně k dispozici detailní přehled o nákladech s rozpisem dílčích služeb a neměl by tak být na konci měsíce překvapený výší částky na faktuře.

Zprovoznit naši první cloudovou aplikaci, která je škálovatelná, odolná vůči výpadkům a která nás zpočátku nemusí stát ani dolar, je otázka jednoho pracovního dne. Díky tomu, že se nemusíme tolik věnovat devOps, máme pak čas na samotný vývoj aplikace.

Zdroje

A Comprehensive Guide to Building a Scalable Web App on Amazon Web Services – sice rok starý, ale stále aktuální a vyčerpávající návod, jak vybudovat škálovatelnou aplikaci v AWS.

AWS Cloud Services Pricing – ceník služeb v rámci AWS

Amazon Linux – základní informace o Linuxovém imagi, který je nejsnadnější pro vstup do ekosystému AWS

AWS SDK for PHP – dokumentace software development kitu pro PHP

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *