AWS Lambda Funkce

AWS Hackathon — foto: Rockaway Capital

AWS Hackathon by Rockaway

20.11.2015 byl v Brně AWS Hackathon, pořádaný firmou Rockaway ve spolupráci s Amazonem, Českou spořitelnou, Impact Hubem, Biletem a dalšími. Základní ideou hackathonu je využití služeb Amazoního cloudu pro vyřešení některého z konkrétních zadání. I když je možné implementovat taky vlastní nápad.

Přestože jsem zjistil, že jsou témata hackathonu pro mě těžko uchopitelná, v průběhu jsem to chtěl dokonce zabalit a k týmovému projektu jsem prakticky nepřispěl (kluci udělali super analýzu transparentních účtů), jsem moc rád, že jsem to nakonec neudělal. A důvodem, proč jsem rád, že jsem to neudělal, jsou právě Lambda funkce.

AWS Lambda

AWS Lambda jsou uzavřené balíky kódu, které se spouštějí v cloudu aniž by bylo potřeba řešit na jakém běží stroji. Lambda funkce může nastartovat jako odpověď na dotaz na nějakou adresu, přidání záznamu do databáze nebo může mít nastavené periodické spouštění.

Co Lambda je a co ne/umí:

Je to uzavřený balík kódu napsaný v javě, Node.js nebo nejnověji v python 2.7. Python je v nabídce zatím krátce a proto je jeho použití nejhůře dokumentované.

Není závislá na stroji, na kterém běží. Ve skutečnosti ani nesmí být závislá na žádných lokálních datech. Pokud máte Lambdu v pythonu a ta používá knihovny, které nejsou v základním pythonu, je potřeba je přibalit. Pokud jsou to kompilované knihovny, pak musí jít o balíky kompilované na AWS Linuxu.

Lambdu jde spustit asi sedmi různými událostmi. Událost předá potřebná data a Lambda pak už zbytek řeší sama, včetně vrácení nějaké hodnoty.

Možné zdroje událostí, které spouští Lambdu

Jakmile dojde k navázané události, někde v cloudu se spustí nová instance lambdy. Jakmile vykoná to na co je určena, skončí. A v tom je ta krása. Platíte jen za instance Lambdy, které něco dělají (pokud nic nedělají, jsou ukončené). Neplatíte za virtuální stroj, který běží pořád. Neřešíte, jaká je propustnost toho stroje. Vždy když přijde nový požadavek, spustí se nová instance Lambdy. Ale pozor! Jak mě upozornil Orwen, platíte taky za přenesená data, takže například za scrapování nějaké webové stránky si možná trochu připlatíte.

Můžete Lambdu použít třeba pro vaše REST API. Zdrojovou událostí pro Lambdu bude například GET požadavek s parametrem na navázanou adresu a Lambda pak přistoupí do databáze a vrátí požadované informace ve formě JSONu.

To je způsob, jakým jsme použili Lambdy i my. V Amazon Relational Database Service jsme spustili instanci PostgreSQL, otevřeli na ni přístup a Lambda funkce pak zprostředkovávala dotazy z javascriptu v prohlížeči. A tady doporučím dávat pozor. Pokud se rozhodnete, jako já, pracovat s python 2.7 a s knihovnou psycopg2 pro postgres, tak to nebudete mít tak jednoduché. Tahle knihovna není v základu pythonu a vy pokud ji chcete lokálně používat, tak si ji musíte přitáhnout. Ideálně do vašeho virtualenv. Jenže co běží na vašem stroji, nemusí běžet na aws linux. A to je právě příklad psycopg2. Pokud byste jej chtěli používat, doporučuji vám použít předkompilovanou neoficiální knihovnu: psycopg2.

Jak vypadá kód Lambdy v pythonu

Kód každé Lambdy musí mít tzv. “handler”- vstupní funkci, které systém předá událost (event) a kontext, ze kterého se dá číst, jak dlouho má lambda ještě čas na to aby se vykonala apod. Jméno tohoto handleru se zadává při definici Lambda funkce v aws konzoli. Z handleru se pak může volat jakákoliv další funkce uvnitř. Kód je možné zadat přímo v konzoli, případně, pokud používá další knihovny, je potřeba jej nahrát spolu se zdrojovými kódy knihoven jako .zip. Příklad jednoduché Lambdy bez dalších závislostí poskytuje už aws konzole v předpřipravených eventech:

Hello world template

Pod zdrojovým kódem je pak cesta k souboru obsahujícímu handler a jméno funkce která je handlerem téhle Lambda funkce. V našem případě se soubor jmenuje lambda_function.py a zvolená funkce je lambda_handler(event, context). Název téhle funkce může být jakýkoliv, ale musí příjmat event a kontext a v definici Lambdy je pak potřeba napsat správné jméno. Pokud bychom měli soubor index.py a v něm funkci myLambda(event, context), uděláme z ní handler nastavením cesty na: index.MyLambda.

Každá Lambda musí mít přidělenou roli. Role je nositelem práv v AWS ekosystému a Pokud ji nevytvoříte, nebudete moci vytvořit novou Lambdu. Roli vytvoříte v Identity & Access Management v konzoli.

V parametru event se handleru předávají dictionary data, která dostal, například payload z POST requestu. V tomhle případě očekáváme že dostal alespoň “key1”, “key2” a “key3”. Hodnotu parametru “key1” pak vrací jako výstupní hodnotu. Na stejném místě by mohl vracet třeba JSON data získaná dotazem do databáze.

Spuštění lambda funkce POST requestem

Naši Lambdu budeme spouštět POST requestem na adresu, kterou vytvoříme v API endpoint s pomocí API Gateway (další z AWS služeb, která je tady přímo integrovaná).

Tvorba API endpoint pro POSt request bez zabezpečení

Po potvrzení nastavení systém vygeneruje API endpoint, kde při POSTu na dannou URL dojde ke spuštění právě jedné Lambdy.

A to je vše přítelé. Ukázku jednoduché Lambdy v pythonu, která přistupuje k PostgreSQL databázi najdete tady.

Tedy vše ještě ne. Abych nezapomněl: celé je to strašlivě levné!

Jo a pokud byste chtěli předávat data dovnitř handleru i jinak než requestem s payloadem, je možné v API Gateway nastavit, že se části volané URL budou předávat dovnitř jako součást dat eventu. Ale o tom třeba přístě, bude-li mít někdo zájem.

A co z toho?

Důvod proč jsem chtěl tohle napsat je jednoduchý. Před AWS Hackathonem jsem o AWS Lambda vůbec nevěděl a přitom si dovedu představit využití téhle technologie na spoustě míst (REST API, schedulované ukládání dat, většina týmů na hackatonu na tom postavila weby, zpracování požadavků ve frontě Kinesis, atd.). A přijde mi, že o tom neví spousta lidí, co by po tom hned skočili. No a pokud si tohle nedej bože někdo někdy přečte, třeba to využije nebo předá dál. :) Rozhodně se nejedná o detailní návod, spíš jednoduchou ukázku, ale principielně ukazuje jak na to.

Díky moc Rockaway a spol. za organizaci téhle události a hlavně gratuluju všem týmům, které zvládly v neuvěřitelně krátkém čase 30 hodin vytvořit funkční technologické a často i grafické demo! Smekám před vámi čepici neboť klobouk nemám.

HOWG

Dovětek o konkurenci

Jakub Vikki Straka dodává:

Google Cloud má ekvivalent Lambdy původně už od roku 2008 https://en.wikipedia.org/wiki/Google_App_Engine a použitelné to je tak posledních 5 let.

To snad jen, kdyby se čtenář zajímal, zda je Amazon napřed, nebo dohání konkurenci :).

A rozsah podporovaných technologií:

Currently, the supported programming languages are Python, Java (and, by extension, other JVM languages such as Groovy, JRuby, Scala, Clojure), Go, and PHP.)

(Díky za doplnění, Vikki!)