{"id":52562,"date":"2019-11-11T00:00:00","date_gmt":"2019-11-10T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/stroim-sobstvennyj-serverless-na-osnove-fn"},"modified":"2020-02-18T14:00:19","modified_gmt":"2020-02-18T11:00:19","slug":"stroim-sobstvennyj-serverless-na-osnove-fn","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","title":{"rendered":"Gradimo vlastiti serverless temeljeno na Fn","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Gradimo vlastiti serverless temeljeno na Fn\" src=\"\/wp-content\/uploads\/2019\/11\/e24cdf9b43a3323d617f33b2c1b44e51.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%91%D0%B5%D1%81%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F\">Serverless ra\u010dunarstvo<\/a><\/noindex> \u2014 jedna od najistaknutijih tendencija u oblaku. Osnovni princip rada je da infrastruktura vi\u0161e nije briga DevOps-a, ve\u0107 dobavlja\u010da usluga. Skaliranje resursa automatski se prilago\u0111ava optere\u0107enju i ima visoku brzinu promjene.<\/p>\n<p><\/p>\n<p>Druga zajedni\u010dka karakteristika je tendencija ka minimiziranju i fokusiranju koda, zbog \u010dega se bezserverna ra\u010dunalna rje\u0161enja ponekad nazivaju \u201efunkcija kao usluga\u201c (FaaS).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Istorijski, prvi dobavlja\u010d oblaka koji je ponudio FaaS bio je Amazon sa AWS Lambda, odakle je i potekao taj naziv. Drugi dobavlja\u010di oblaka tako\u0111e nude analoge:<\/p>\n<p><\/p>\n<ul>\n<li>Cloud Functions od Google-a<\/li>\n<li>Azure Functions od Microsoft-a<\/li>\n<\/ul>\n<p><\/p>\n<p>Sve ove kompanije pru\u017eaju serverless ra\u010dunarstvo, automatsko skaliranje i naplatu samo za stvarno kori\u0161tene resurse, ali pritom ve\u017eu klijente za svoj proprietarni proizvod. Ipak, postoje besplatne alternative sa otvorenim kodom za organizaciju serverless ra\u010dunarstva. Treba napomenuti:<\/p>\n<p><\/p>\n<ul>\n<li>Platformu <noindex><a rel=\"nofollow\" href=\"https:\/\/openwhisk.apache.org\/\">Apache OpenWhisk<\/a><\/noindex>, koju razvija IBM u svom inkubatoru,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.spring.io\/spring-cloud-function\/\">Spring Cloud Functions<\/a><\/noindex>, kao deo bogate ekosustava Spring Framework-a, koja se mo\u017ee koristiti i kao fasada za AWS Lambda, Azure Functions i OpenWhisk,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/fnproject\">Projekt Fn<\/a><\/noindex>, koji podr\u017eava Oracle.<\/li>\n<\/ul>\n<p><\/p>\n<p>Svi su nezavisni od oblaka, to jest mogu se instalirati u bilo koji oblak, uklju\u010duju\u0107i va\u0161 vlastiti, javni ili privatni, i naravno u Exoscale.<\/p>\n<p><\/p>\n<h2 id=\"kak-proekt-fn-ustroen\">Kako je projekt Fn organizovan<\/h2>\n<p><\/p>\n<p>Fn se potpuno oslanja na Docker, sastoji se od dva glavna komponenta:<\/p>\n<p><\/p>\n<ul>\n<li>CLI program koji upravlja svim aspektima infrastrukture Fn i komunicira sa serverom Fn,<\/li>\n<li>I sam server Fn, obi\u010dna aplikacija pakovana u kontejner za Docker.<\/li>\n<\/ul>\n<p><\/p>\n<p>Funkcije raspore\u0111ene u Fn tako\u0111e se izvr\u0161avaju u odvojenim kontejnerima, \u0161to omogu\u0107ava podr\u0161ku za veliki broj programskih jezika, na primer\u2026 Clojure!<\/p>\n<p><\/p>\n<p>Argumenti funkcija se prenose na standardni ulaz (STDIN), a rezultati se pi\u0161u na standardni izlaz (STDOUT). Ako argumenti ili vra\u0107ene vrednosti nisu jednostavne vrednosti (naprimjer, JSON objekat) \u2014 mogu se transformisati pomo\u0107u sloja apstrakcije koji pru\u017ea sam Fn u obliku kompleta za razvoj funkcija (FDK).<\/p>\n<p><\/p>\n<p>Radi prakti\u010dnosti dostupni su ugra\u0111eni setovi predlo\u017eaka koji olak\u0161avaju implementaciju FaaS-a na opse\u017enom popisu raznih jezika i njihovih verzija (Go, razli\u010dite verzije Jave, Python itd.).<\/p>\n<p><\/p>\n<p>Jednostavno je stvoriti FaaS slijede\u0107i ovu shemu:<\/p>\n<p><\/p>\n<ul>\n<li>Implementiramo funkciju pomo\u0107u CLI Fn: stvara se konfiguracijska datoteka aplikacije za Fn, koja se temelji na odabranom predlo\u0161ku.<\/li>\n<li>Objavljujemo vlastitu funkciju, ponovno pomo\u0107u CLI Fn: slika spremnika se stavlja u neki repozitorij, nakon \u010dega se poslu\u017eitelj obavje\u0161tava o postojanju i lokaciji te slike.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Gradimo vlastiti serverless temeljeno na Fn\" src=\"\/wp-content\/uploads\/2019\/11\/5add8b58c80e976cd61a156fdd0fba11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Princip isporuke funkcija u Fn<\/em><\/p>\n<p><\/p>\n<h2 id=\"lokalnaya-ustanovka-i-testirovanie-besservernyh-funkciy\">Lokalna instalacija i testiranje bezservernih funkcija<\/h2>\n<p><\/p>\n<p>Zapo\u010dnimo s instalacijom Fn na lokalnom ra\u010dunalu. Prvo instaliramo Docker, kako to zahtijeva Fn. Pretpostavljamo da koristimo Debian\/Ubuntu:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ sudo apt-get update\n$ sudo apt-get install docker.io<\/code><\/pre>\n<p><\/p>\n<p>Ili koristite paketni menad\u017eer\/izgradnju Dockera sukladno va\u0161em sustavu. Zatim mo\u017eemo odmah pre\u0107i na instalaciju Fn CLI. Na primjer, pomo\u0107u cURL-a:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ curl -LSs https:\/\/raw.githubusercontent.com\/fnproject\/cli\/master\/install | sh<\/code><\/pre>\n<p><\/p>\n<p>Ako radite na OSX-u s instaliranim Homebrew-om, mo\u017eete i\u0107i drugim putem:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ brew install fn\n\n==&gt; Preuzimanje https:\/\/homebrew.bintray.com\/bottles\/fn-0.5.8.high_sierra.bottle.tar.gz\n==&gt; Preuzimanje s https:\/\/akamai.bintray.com\/b1\/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb\n######################################################################## 100.0%\n==&gt; Sipanje fn-0.5.8.high_sierra.bottle.tar.gz\n  \/usr\/local\/Cellar\/fn\/0.5.8: 5 datoteka, 16.7MB<\/code><\/pre>\n<p><\/p>\n<p>Sada je sve spremno za inicijalnu implementaciju na\u0161e funkcije koriste\u0107i CLI. Radi jednostavnosti, koristit \u0107emo ugra\u0111eno okru\u017eenje za pokretanje, na primjer Node:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn init --runtime node --trigger http hellonode\n\nStvaranje funkcije na: \/hellonode\nGeneriran predlo\u017eak funkcije.\nfunc.yaml stvoren.<\/code><\/pre>\n<p><\/p>\n<p>Bit \u0107e stvoren novi direktorij <code>hellonode<\/code> za daljnji razvoj na\u0161e Fn funkcije s nekim osnovnim konfiguracijskim datotekama. Unutar novo stvorenog direktorija mo\u017eete stvoriti svoju aplikaciju koja slijedi standarde odabranog jezika ili okru\u017eenja izvr\u0161avanja:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"># \u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441 node \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:\n\n   hellonode\n   \u251c\u2500\u2500 func.js\n   \u251c\u2500\u2500 func.yaml\n   \u2514\u2500\u2500 package.json\n\n# \u0421\u0432\u0435\u0436\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 Java11 \u0442\u0430\u043a\u043e\u0435:\n\n   hellojava11\n   \u251c\u2500\u2500 func.yaml\n   \u251c\u2500\u2500 pom.xml\n   \u2514\u2500\u2500 src\n       \u251c\u2500\u2500 main\n       \u2502   \u2514\u2500\u2500 java\n       \u2502       \u2514\u2500\u2500 com\n       \u2502           \u2514\u2500\u2500 example\n       \u2502               \u2514\u2500\u2500 fn\n       \u2502                   \u2514\u2500\u2500 HelloFunction.java\n       \u2514\u2500\u2500 test\n           \u2514\u2500\u2500 java\n               \u2514\u2500\u2500 com\n                   \u2514\u2500\u2500 example\n                       \u2514\u2500\u2500 fn\n                           \u2514\u2500\u2500 HelloFunctionTest.java<\/code><\/pre>\n<p><\/p>\n<p>Fn stvara po\u010detnu strukturu projekta, stvara datoteku <code>func.yaml<\/code>, koja sadr\u017ei potrebne postavke za Fn, i postavlja predlo\u017eak za kod na jeziku koji ste odabrali.<\/p>\n<p><\/p>\n<p>U slu\u010daju Node okru\u017eenja, to zna\u010di:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ cat hellonode\/func.js\n\nconst fdk=require('@fnproject\/fdk');\n\nfdk.handle(function(input){\n  let name = 'World';\n  if (input.name) {\n    name = input.name;\n  }\n  return {'message': 'Hello ' + name}\n})<\/code><\/pre>\n<p><\/p>\n<p>Sada \u0107emo brzo testirati na\u0161u funkciju lokalno kako bismo vidjeli kako sve funkcionira.<\/p>\n<p><\/p>\n<p>Za po\u010detak pokre\u0107emo Fn server. Kao \u0161to je ve\u0107 re\u010deno, Fn server je Docker kontejner, stoga \u0107e se nakon pokretanja preuzeti slika iz Docker repozitorija.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn start -d                    # pokre\u0107emo lokalni server u pozadini\n\nNema lokalne slike 'fnproject\/fnserver:latest'\nlatest: Preuzimanje iz fnproject\/fnserver\nff3a5c916c92: Preuzimanje zavr\u0161eno\n1a649ea86bca: Preuzimanje zavr\u0161eno\nce35f4d5f86a: Preuzimanje zavr\u0161eno\n\n...\n\nStatus: Preuzeta novija slika za fnproject\/fnserver:latest\n668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5<\/code><\/pre>\n<p><\/p>\n<p>Da bismo pokrenuli na\u0161u funkciju, potrebno ju je \u201eizbaciti\u201c. Za to je potrebno <code>ime aplikacije<\/code>: u Fn-u sve aplikacije moraju biti definirane kao prostori imena za povezane funkcije.<\/p>\n<p><\/p>\n<p>Fn CLI \u0107e pretra\u017eiti datoteku <code>func.yaml<\/code> u trenutnom direktoriju koja \u0107e se koristiti za konfiguraciju funkcije. Dakle, prvo se treba prebaciti u na\u0161 direktorij <code>hellonode<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ cd hellonode\n$ fn deploy --app fnexo --local  # izvr\u0161avamo funkciju lokalno, ime aplikacije - fnexo.\n                                 # parametar local ne u\u010ditava sliku u udaljeni repozitorij,\n                                 # pokre\u0107e je direktno\n\nImplementiranje hellonode u aplikaciju: fnexo\nPove\u0107ana na verziju 0.0.2\nGradnja slike nfrankel\/hellonode:0.0.3 .\nA\u017euriranje funkcije hellonode koriste\u0107i sliku nfrankel\/hellonode:0.0.3...\nUspe\u0161no stvorena aplikacija:  fnexo\nUspe\u0161no stvorena funkcija: hellonode sa nfrankel\/hellonode:0.0.3\nUspe\u0161no stvoren okida\u010d: hellonode-trigger<\/code><\/pre>\n<p><\/p>\n<p>Kao \u0161to se mo\u017ee videti iz izlaza komande, stvara se nova slika kontejnera za Docker koja sadr\u017ei na\u0161u funkciju. Funkcija je spremna za pozivanje, a imamo dva na\u010dina da to u\u010dinimo:<\/p>\n<p><\/p>\n<ul>\n<li>koriste\u0107i komandu Fn <code>invoke<\/code><\/li>\n<li>pozivaju\u0107i direktno kroz <code>http<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Poziv <code>invoke<\/code> putem Fn samo emulira HTTP rad za testiranje, \u0161to je prakti\u010dno za brzu proveru:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn invoke fnexo hellonode      # pozivamo funkciju hellonode aplikacije fnexo\n\n{\"message\":\"Hello World\"}<\/code><\/pre>\n<p><\/p>\n<p>Da bismo pozvali funkciju direktno, potrebno je znati punu URL adresu:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ curl http:\/\/localhost:8080\/t\/fnexo\/hellonode-trigger\n\n{\"message\":\"Hello World\"}<\/code><\/pre>\n<p><\/p>\n<p>Fn server pru\u017ea funkcije preko porta 8080, i, \u010dini se, URL funkcije odgovara \u0161emi <code>t\/app\/function<\/code>, ali ne potpuno. Putem HTTP-a, funkcija se ne poziva direktno, ve\u0107 putem takozvanog triggera, koji prema svom imenu \u201epokre\u0107e\u201c poziv funkcije. Triggeri se definiraju u <code>`func.yml<\/code> projekta:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">schema_version: 20180708\nname: hellonode\nversion: 0.0.3\nruntime: node\nentrypoint: node func.js\nformat: json\ntriggers:\n- name: hellonode-trigger\n  type: http\n  source: \/hellonode-trigger    # URL okida\u010da<\/code><\/pre>\n<p><\/p>\n<p>Mo\u017eemo promeniti ime okida\u010da tako da odgovara imenu funkcije, \u0161to \u0107e sve pojednostaviti:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">triggers:\n- name: hellonode-trigger\n  type: http\n  source: \/hellonode    # odgovara imenu funkcije<\/code><\/pre>\n<p><\/p>\n<p>Zatim ponovno pokre\u0107emo implementaciju funkcije i pozivamo je iz novog okida\u010da:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn deploy --app fnexo hellonode --local\n$ curl http:\/\/localhost:8080\/t\/fnexo\/hellonode\n\n{\"message\":\"Hello World\"}<\/code><\/pre>\n<p><\/p>\n<p>Sve funkcioni\u0161e! Idealno je vreme da pre\u0111emo na stvarne eksperimente i objavimo na\u0161 FaaS na serveru!<\/p>\n<p><\/p>\n<h2 id=\"ustanovka-servisov-besservernyh-funkciy-na-sobstvennoy-infrastrukture\">Instalacija servisa bezservernih funkcija na sopstvenoj infrastrukturi<\/h2>\n<p><\/p>\n<p>Hajde da brzo postavimo virtuelnu ma\u0161inu koriste\u0107i CLI Exoscale. Ako je jo\u0161 niste konfigurisali \u2014 mo\u017eete se poslu\u017eiti <noindex><a rel=\"nofollow\" href=\"https:\/\/community.exoscale.com\/documentation\/tools\/exoscale-command-line-interface\/\">na\u0161im vodi\u010dem za brzi pokret<\/a><\/noindex>. To je sjajan alat koji dodatno pove\u0107ava va\u0161u produktivnost. <strong>Ne zaboravite da postavite pravilo za otvaranje porta 8080 u Security Group!<\/strong> Slede\u0107e komande pokrenu\u0107e \u010distu virtuelnu ma\u0161inu, spremnu za sme\u0161taj na\u0161ih funkcija:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ exo firewall create fn-securitygroup\n$ exo firewall add fn-securitygroup ssh --my-ip\n$ exo firewall add fn-securitygroup -p tcp -P 8080-8080 -c 0.0.0.0\/0\n$ exo vm create fn-server -s fn-securitygroup<\/code><\/pre>\n<p><\/p>\n<p>Zatim se mo\u017eete ulogovati putem ssh na virtuelnu ma\u0161inu i instalirati udaljeni server Fn:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ exo ssh fn-server\n\nAutenti\u010dnost hosta '185.19.30.175 (185.19.30.175)' ne mo\u017ee biti utvr\u0111ena.\nECDSA klju\u010dni otisak je SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.\nDa li ste sigurni da \u017eelite da nastavite povezivanje (da\/ne)? da\nUpozorenje: Trajno je dodat '185.19.30.175' (ECDSA) na listu poznatih hostova.\nDobrodo\u0161li u Ubuntu 18.04 LTS (GNU\/Linux 4.15.0-20-generic x86_64)<\/code><\/pre>\n<p><\/p>\n<p>Zatim instaliramo Docker i server Fn, kao \u0161to je ve\u0107 ura\u0111eno na lokalnoj ma\u0161ini, pokre\u0107emo server:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ sudo apt-get update\n$ sudo apt-get install docker.io\n$ sudo systemctl start docker\n$ curl -LSs https:\/\/raw.githubusercontent.com\/fnproject\/cli\/master\/install | sh\n$ sudo fn start\n\n...\n\n    ______\n   \/ ____\/___\n  \/ \/_  \/ __ \n \/ __\/ \/ \/ \/ \/ \n\/_\/    \/_\/ \/_\/ \n    v0.3.643<\/code><\/pre>\n<p><\/p>\n<p>Fn je spreman za primanje funkcija! Za ciljani prenos funkcija na udaljeni server koristi\u0107emo komandu <code>deploy<\/code> sa lokalnog ra\u010dunara, presko\u010div\u0161i flag <code>--local<\/code>.<\/p>\n<p><\/p>\n<p>Pored toga, Fn zahteva da se navedu adrese servera Fn i Docker registra. Ovi parametri mogu biti postavljeni putem promenljivih okru\u017eenja <code>FN_API_URL<\/code> i <code>FN_REGISTRY<\/code> odgovaraju\u0107e, ali se tako\u0111e predla\u017ee i jednostavniji na\u010din za lako upravljanje kreiranjem i upravljanjem konfiguracijama za razme\u0161tanje.<\/p>\n<p><\/p>\n<p>U terminima Fn, konfiguracija za razme\u0161tanje naziva se <code>kontekst<\/code>. Slede\u0107a komanda \u0107e kreirati kontekst:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn create context exoscale --provider default --api-url http:\/\/185.19.30.175:8080 --registry nfrankel<\/code><\/pre>\n<p><\/p>\n<p>Mo\u017eete pregledati dostupne kontekste ovako:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn list contexts\n\nCURRENT NAME      PROVIDER      API URL                      REGISTRY\n    default       default       http:\/\/localhost:8080\/\n    exoscale      default       http:\/\/185.19.30.175:8080    nfrankel\n<\/code><\/pre>\n<p><\/p>\n<p>A da se prebacite na kontekst koji je upravo kreiran, ovako:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"> $ fn use context exoscale\n\n Sada se koristi kontekst: exoscale<\/code><\/pre>\n<p><\/p>\n<p>Od ovog mjesta, isporuka Fn funkcija \u0107e u\u010ditati Docker slike koriste\u0107i odabrani ra\u010dun na DockerHubu (u mom slu\u010daju \u2014 <code>nfrankel<\/code>), nakon \u010dega \u0107e obavijestiti udaljeni poslu\u017eitelj (u ovom primjeru \u2014 <code>http:\/\/185.19.30.175:8080<\/code>) o lokaciji i verziji najnovije slike koja sadr\u017ei va\u0161u funkciju.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn deploy --app fnexo .   # izvodi se na lokalnoj ma\u0161ini iz direktorija hellonode\n\nImplementacija funkcije na: \/.\nImplementacija hellonode u aplikaciju: fnexo\nPove\u0107ana verzija na 0.0.5\nGradnja slike nfrankel\/hellonode:0.0.5 .<\/code><\/pre>\n<p><\/p>\n<p>Na kraju:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ curl http:\/\/185.19.30.175:8080\/t\/fnexo\/hellonode\n\n{\"message\":\"Hello World\"}<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Gradimo vlastiti serverless temeljeno na Fn\" src=\"\/wp-content\/uploads\/2019\/11\/51a7b88cd6bf4953740cfac937b0acc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>\u017divotni ciklus funkcije u serverless ra\u010dunanju temeljenom na Fn<\/em><\/p>\n<p><\/p>\n<h2 id=\"preimuschestva-besservernyh-vychisleniy-na-svoih-moschnostyah\">Prednosti serverless ra\u010dunalstva na vlastitim resursima<\/h2>\n<p><\/p>\n<p>Serverless ra\u010dunarstvo je prakti\u010dno rje\u0161enje za brzo implementiranje neovisnih dijelova aplikacija koji interagiraju s slo\u017eenijim aplikacijama ili mikroservisima.<\/p>\n<p><\/p>\n<p>\u010cesto je to povezano s skrivenim tro\u0161kovima vezivanja za odabranog pru\u017eatelja, \u0161to, ovisno o specifi\u010dnom slu\u010daju kori\u0161tenja i volumenu, mo\u017ee dovesti do vi\u0161ih tro\u0161kova i smanjene fleksibilnosti u budu\u0107nosti.<\/p>\n<p><\/p>\n<p>Vi\u0161ekratna i hibridna cloud arhitektura tako\u0111er trpe u takvim slu\u010dajevima, jer lako mo\u017ee do\u0107i do situacije kada bi se htjela koristiti serverless ra\u010dunarstva, ali zbog korporativne politike to mo\u017ee biti nemogu\u0107e.<\/p>\n<p><\/p>\n<p>Fn je dovoljno jednostavan za kori\u0161tenje, mo\u017ee pru\u017eiti gotovo isti FaaS su\u010delje, s malim tro\u0161kovima. Osloba\u0111a se svih veza s pru\u017eateljima, mo\u017ee se instalirati lokalno ili kod bilo kojeg povoljno odabranog pru\u017eatelja cloud rje\u0161enja. Tako\u0111er postoji sloboda u odabiru jezika programiranja.<\/p>\n<p><\/p>\n<p>U \u010dlanku su predstavljeni samo temelji Fn, ali izrada vlastitog okru\u017eenja za izvr\u0161avanje je dovoljno jednostavna, a cjelokupnu arhitekturu je mogu\u0107e pro\u0161iriti kori\u0161tenjem Fn ravnote\u017eiva\u010da optere\u0107enja ili smje\u0161tanjem Fn iza proksija radi za\u0161tite.<\/p>\n<p>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/475044\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0411\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u2014 \u043e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0445 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0439 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u2014 \u0437\u0430\u0431\u043e\u0442\u0430 \u043d\u0435 DevOps\u2019\u043e\u0432, \u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 \u0443\u0441\u043b\u0443\u0433. \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0414\u0440\u0443\u0433\u0430\u044f \u043e\u0431\u0449\u0430\u044f \u0447\u0435\u0440\u0442\u0430 \u2014 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044f \u043a \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0444\u043e\u043a\u0443\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 &#171;\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0430&#187; [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-52562","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0421\u0442\u0440\u043e\u0438\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 serverless \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Fn | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-11-10T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:00:19+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Gradimo vlastiti serverless na osnovi Fn | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0421\u0442\u0440\u043e\u0438\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 serverless \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Fn | ProHoster","og:url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-11-10T21:00:00+00:00","article:modified_time":"2020-02-18T11:00:19+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52562","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 04:03:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:41:24","updated":"2026-01-24 04:03:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/52562","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=52562"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/52562\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=52562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=52562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=52562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}