Node.js na Google Cloud Platform

U příležitosti vydání Node.js 4.0.0 si ukážeme, jak vaši Node.js aplikaci zahnízdit v oblačných virtuálech strýčka Googla. Nejlépe tak, abychom nemuseli moc platit, ale když by náhodou přišly davy lidí, aby nám to nelehlo. A budou nám na to stačit tři řádky konfigurace.

O čem to bude

Google Cloud Platform (GCP) je sada nástrojů a služeb pro cloudový hosting vašich webových aplikací. Do GCP rodiny patří jednak Compute Engine, který slouží ke spouštění virtuálních mašin v googlí infrastruktuře, a jednak můj oblíbený App Engine.

App Engine vám umožňuje napsat vaši webovou aplikaci a deploynout ji “kamsi do cloudu”, bez toho, že byste se museli zajímat o konkrétní virtuální stroje, škálování, load balancing apod. Všechno zařídí App Engine sám – při vyšší návštěvnosti spustí nějaký ten virtuál navíc, při nižší návštěvnosti je zase poshazuje.

AppEngine nativně podporuje jen 4 jazyky – Java, Python, Go a PHP. Poměrně nově přibyla do GCP služba “Managed VMs”, která vám umožňuje (aktuálně pomocí Docker) spustit si v podobně automagicky řízeném provozu v podstatě cokoliv. Takže třeba Node.js aplikaci. Zatím je to sice v betě, ale nepředpokládám, že se bude nějak dramaticky měnit.

Co z toho

To hlavní, co vaše node.js aplikace získá, je stabilní cloudový hosting, který se bude pružně přizpůsobovat aktuální zátěži a přijde vás na nějakých 100-150 Kč měsíčně – tedy… podle té zátěže, pochopitelně. My obvykle píšeme spíš větší weby v Javě, ale občas se přihodí i nějaký mikroprojekt. Webík, 2-3 formuláře, možná nějaká miniaturní administrace… to asi není materiál pro Javu. A Node.js se jeví optimální nástroj, zvlášť, když můžu hotový web “někam deploynout” a už se o něj v životě nebudu muset starat. Ale to už jsme u výhod cloudu obecně.

Co budeme potřebovat

Nějaký ten textový editor se užije, příkazová řádka taky, node a npm pochopitelně a ještě bude potřeba nainstalovat si sadu CLI nástrojů “gcloud”, přes které budeme s GCP bavit. Jo a Google účet a kreditku :-)

Začněte instalací “gcloud”, viz https://cloud.google.com/sdk/.

V dalším kroku si připravte GCP projekt (https://console.developers.google.com). Pokud při vytváření projektu zabrousíte do “Advanced options”, nechte tam nastavené US datacentrum, Evropa zatím Managed VMs neumí.

image00

Zvolíte si (nebo si necháte přidělit) project id, které budeme potřebovat později, a zapnete billing.

image02

Protože jsou hodní, resp. nejsou zlí, dají vám do začátku kredit 300 dolarů. Pokud ale už s GCP pracujete, nedají vám nic.

Pokud se vám nechce nic psát, stáhněte si zdrojáky příkladu.

Node.js část

Předpokládám, že Node.js znáte, takže to vezmeme jen tak rychle:

var express = require("express");
var app = express();
var router = express.Router();

router.get("/", function(httpRequest, httpResponse) {
    httpResponse.json({ message: 'Hello '+process.env.HELLO });
});

app.use(router);

app.listen(process.env.PORT || 8080);

 

S tím si asi poradíte. A nebo si nastudujte seriál od Jakuba Nešetřila. Pokud nemáte, přidejte do package.json instrukci pro npm jak aplikaci spustit (“start”), když to neuděláte, bude se na vás GCP při deployi zlobit. Váš package.json by tedy měl vypadat asi takhle:

{
  "name": "zdrojak-nodejs",
  "version": "1.0.0",
  "description": "Ukazkovy projekt node.js na GCP",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Tomas Zverina",
  "license": "WTFL",
  "dependencies": {
    "express": "^4.13.3"
  }
}

Managed VMs část

A teď přijde ta krása. Všechno, co teď musíte udělat pro to, abyste aplikaci poslali do Googlího cloudu, je vytvořit soubor app.yaml, ve kterém bude pouze:

runtime: nodejs
vm: true
api_version: 1

Deploy

Připravte si id projektu, které jste získali při jeho založení, a spusťte:

gcloud auth login
gcloud components update app
gcloud config set project <id projektu>

A můžeme deployovat:

gcloud preview app deploy app.yaml --set-default

S trochou štěstí jsme ani vy ani já na nic nezapomněli a aplikace je venku (po pár minutách chroustání, především sestavování Docker image). Podívat se na ni můžete na adrese:

http://id_projektu.appspot.com/

… nebo dokonce rovnou na https:

https://id_projektu.appspot.com/

S doménou se teď trápit nemusíte, tu pak snadno změníte v nastavení projektu:

image03

Co najdete v konzoli a jak to zhruba funguje

Jak to bude do budoucna nevím, ale teď se to má tak, že svůj Managed VM projekt najdete jak v záložce App Engine, tak v záložce Compute Engine. Hodně důležitá pro vás bude záložka App Engine > Versions. Totiž: S každým deployem se vám vytvoří nová verze aplikace. Přepínačem –set-default říkáme, že se má hned nastavit jako výchozí, ale to neznamená, že předcházející verze někam zmizela, ta běží stále. To se může hodit, například pokud omylem deploynete nějakou chybu, můžete se k předchozí verzi snadno vrátit – nastavit ji jako “default”.

image04

Nebo můžete nastavit “traffic splitting” a část provozu posílat na novou variantu, zatímco zbytek provozu poběží stále na staré verzi (A/B testing).

Má to ovšem nevýhodu. Ke každé vaší verzi bude GCP udržovat v běhu alespoň jednu virtuální mašinu, čili by se hromadění verzí dosti negativně projevilo na vaší kreditce. Nepoužívané staré verze mažte!

Jedna verze ovšem musí zůstat běžet, té se nezbavíte jinak, než že smažete celý projekt.

Skutečné běžící instance si můžete prohlédnout na záložce Compute Engine – VM instances.

image01

Nad těmi ale v Managed VMs nemáte kontrolu, i když stroj shodíte, spustí se znovu sám. Pokud si chcete počty běžících instancí z nějakého důvodu řídit sami, můžete úplně ignorovat celé Managed VMs a prostě si v Compute Engine spustit nějaký Linux přes SSH si tam dělat co chcete – to ale není náš případ.

Hlubiny app.yaml

Náš app.yaml má aktuálně pouze 3 řádky, ale pokud chceme srazit náklady na hosting na minimum, budeme ho muset ještě poladit. Přidáme specifikaci stroje, který chceme používat:

resources:
  cpu: .1
  memory_gb: .1
  disk_size_gb: 10

Pravda, jedna desetina CPU se může zdát málo. Ve skutečnosti nemáte úplnou volnost ve stanovení parametrů virtuálního stroje, ale GCP vybere typizovanou instanci, která vašim požadavkům nejvíc odpovídá. V našem případě je to tedy ta nejmenší – f1-micro.

A ještě poladíme, jakým způsobem má aplikace škálovat:

automatic_scaling:
  min_num_instances: 1
  max_num_instances: 5
  cool_down_period_sec: 60
  cpu_utilization:
    target_utilization: 0.7

Líbilo by se mi mít možnost nastavit min_num_scaling na 0, ale to bohužel není možné. Funguje to u té čtveřice jazyků, které App Engine nativně podporuje, v našem případě je ale minimum jedna instance.

A můžeme doplnit ještě nějaké proměnné prostředí, které můžete využít např. k rozpoznání, jestli běžíte na produkci, nebo na testu:

env_variables:
  NODE_ENV: production
  HELLO: world!

Což také vysvětluje poněkud záhadný řádek z index.js:

   httpResponse.json({ message: 'Hello '+process.env.HELLO });

Statické soubory

Pro weby je pochopitelně dosti důležité obsluhovat spoustu statických souborů (obrázků, stylů, …). Nezapomeňte u nich správně nastavit cachovací hlavičky, mělo by stačit něco jako:

var year = 31557600000;
app.use(express.static(__dirname + '/public', { maxAge: year }));

Je to dosti důležité, protože pokud si pamatujete, náš server leží někde v US datacentru a vozit všechny ty megabyty přes oceán může být dost neefektivní – především co se týče “time to first byte” u jednotlivých requestů.

GCP je ovšem obalená celou hromadou síťové magie a jednou z komponent je Edge Cache. Moc zdokumentovené to není, ale zdá se, že pokud máte nastavené správné cache hlavičky, vaše cachovatelné response se můžou zabydlet právě na Edge Cache (tj. ve vám nejbližším Google datacentru). Další requesty na ně už budou tedy obslouženy z Evropy (resp. z datacentra, které je nejblíž klientovi). V podstatě tedy CDN. Time to first byte pak spadne z cca 150 ms (US) na krásných 25ms (za rohem).

Další čtení

O Google Cloud Platform se obecně dočtete na jejich stránkách (https://cloud.google.com/), o Managed VM’s pak tady (https://cloud.google.com/appengine/docs/managed-vms/) a víc příkladů k node.js mají přímo v dokumentaci (https://cloud.google.com/nodejs/). Tam se mimo jiné dočtete, jak pracovat s jejich NoSQL databází a dalšími API.

Určitě se také podívejte na to, jak do index.js přidat “hooky”, přes které bude GCP poznávat, jestli je vaše aplikace v dobrém stavu, nebo jestli má problém (https://cloud.google.com/appengine/docs/managed-vms/custom-runtimes#lifecycle_events).

Zatím nebyl přidán žádný komentář, buďte první!

Přidat komentář
Zdroj: https://www.zdrojak.cz/?p=16018