{"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\/cs\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","title":{"rendered":"Budujeme vlastn\u00ed serverless na z\u00e1klad\u011b Fn","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Budujeme vlastn\u00ed serverless na z\u00e1klad\u011b 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 computing<\/a><\/noindex> \u2014 one of the most notable trends in cloud computing. The main principle of operation is that the infrastructure is the responsibility of the service provider, not the DevOps. Resource scaling automatically adjusts to the load and has a high speed of change.<\/p>\n<p><\/p>\n<p>Dal\u0161\u00ed spole\u010dnou charakteristikou je tendence k minimalizaci a zam\u011b\u0159en\u00ed k\u00f3du, tak\u017ee bezserverov\u00e9 v\u00fdpo\u010dty se n\u011bkdy naz\u00fdvaj\u00ed \u201efunkce jako slu\u017eba\u201c (FaaS).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Historically, the first cloud service provider to offer FaaS with AWS Lambda was Amazon, which is where this name originated. Other cloud service providers also offer similar solutions:<\/p>\n<p><\/p>\n<ul>\n<li>Cloud Functions from Google<\/li>\n<li>Azure Functions from Microsoft<\/li>\n<\/ul>\n<p><\/p>\n<p>All these companies provide serverless computing, automatic scaling, and payment only for resources actually used, but they tie clients to their proprietary product. However, there are free open-source alternatives for organizing serverless computing. It is worth noting:<\/p>\n<p><\/p>\n<ul>\n<li>The platform <noindex><a rel=\"nofollow\" href=\"https:\/\/openwhisk.apache.org\/\">Apache OpenWhisk<\/a><\/noindex>, developed in the incubator by IBM,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.spring.io\/spring-cloud-function\/\">Spring Cloud Functions<\/a><\/noindex>, as part of a fairly rich ecosystem of Spring Framework, which can also be used as a facade for AWS Lambda, Azure Functions, and OpenWhisk,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/fnproject\">The Fn project<\/a><\/noindex>, supported by Oracle.<\/li>\n<\/ul>\n<p><\/p>\n<p>All of them are completely cloud-independent, meaning they can be installed in any cloud, including your own, public, or private, and of course in Exoscale.<\/p>\n<p><\/p>\n<h2 id=\"kak-proekt-fn-ustroen\">How the Fn project is structured<\/h2>\n<p><\/p>\n<p>Fn is entirely based on Docker and consists of two main components:<\/p>\n<p><\/p>\n<ul>\n<li>A CLI tool designed to manage all aspects of the Fn infrastructure, and interacting with the Fn server,<\/li>\n<li>The actual Fn server, a regular application packed in a Docker container.<\/li>\n<\/ul>\n<p><\/p>\n<p>Functions deployed in Fn also run in separate containers, allowing support for many programming languages, such as\u2026 Clojure!<\/p>\n<p><\/p>\n<p>Function arguments are passed to standard input (STDIN), and results are written to standard output (STDOUT). If the arguments or returned values are not simple values (such as a JSON object) \u2014 they can be converted using the abstraction layer provided by Fn in the form of a Function Development Kit (FDK).<\/p>\n<p><\/p>\n<p>Pro pohodl\u00ed jsou nab\u00edzeny vestav\u011bn\u00e9 \u0161ablony, kter\u00e9 usnad\u0148uj\u00ed nasazen\u00ed FaaS na \u0161irok\u00e9 \u0159ad\u011b r\u016fzn\u00fdch jazyk\u016f a jejich verz\u00ed (Go, r\u016fzn\u00e9 verze Java, Python atd.).<\/p>\n<p><\/p>\n<p>Vytvo\u0159en\u00ed FaaS je snadn\u00e9 podle t\u00e9to sch\u00e9my:<\/p>\n<p><\/p>\n<ul>\n<li>Nasazen\u00ed funkce pomoc\u00ed CLI Fn: je vytvo\u0159en konfigura\u010dn\u00ed soubor aplikace pro Fn na z\u00e1klad\u011b zvolen\u00e9 \u0161ablony.<\/li>\n<li>Nasazen\u00ed vlastn\u00ed funkce op\u011bt pomoc\u00ed CLI Fn: obraz kontejneru je um\u00edst\u011bn do n\u011bjak\u00e9ho depozit\u00e1\u0159e, pot\u00e9 je server informov\u00e1n o existenci a um\u00edst\u011bn\u00ed tohoto obrazu.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Budujeme vlastn\u00ed serverless na z\u00e1klad\u011b Fn\" src=\"\/wp-content\/uploads\/2019\/11\/5add8b58c80e976cd61a156fdd0fba11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Princip dod\u00e1v\u00e1n\u00ed funkc\u00ed do Fn<\/em><\/p>\n<p><\/p>\n<h2 id=\"lokalnaya-ustanovka-i-testirovanie-besservernyh-funkciy\">Lok\u00e1ln\u00ed instalace a testov\u00e1n\u00ed serverless funkc\u00ed<\/h2>\n<p><\/p>\n<p>P\u0159ejdeme k instalaci Fn na m\u00edstn\u00edm stroji. Nejprve se nainstaluje Docker, jak vy\u017eaduje Fn. P\u0159edpokl\u00e1d\u00e1me, \u017ee pracujeme na Debianu\/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>Nebo pou\u017eijte spr\u00e1vce bal\u00ed\u010dk\u016f\/instrumentaci Docker podle va\u0161eho syst\u00e9mu. Pot\u00e9 m\u016f\u017eeme p\u0159\u00edmo p\u0159ej\u00edt k instalaci Fn CLI. Nap\u0159\u00edklad pomoc\u00ed curl:<\/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>Pokud pracujete na OSX s nainstalovan\u00fdm Homebrew, m\u016f\u017eete j\u00edt jinou cestou:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ brew install fn\n\n==&gt; Stahov\u00e1n\u00ed https:\/\/homebrew.bintray.com\/bottles\/fn-0.5.8.high_sierra.bottle.tar.gz\n==&gt; Stahov\u00e1n\u00ed z https:\/\/akamai.bintray.com\/b1\/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb\n######################################################################## 100.0%\n==&gt; P\u0159\u00edprava fn-0.5.8.high_sierra.bottle.tar.gz\n  \/usr\/local\/Cellar\/fn\/0.5.8: 5 soubor\u016f, 16.7MB<\/code><\/pre>\n<p><\/p>\n<p>Nyn\u00ed je v\u0161e p\u0159ipraveno pro prvn\u00ed nasazen\u00ed na\u0161\u00ed funkce pomoc\u00ed CLI. Pro jednoduchost budeme pou\u017e\u00edvat vestav\u011bn\u00e9 prost\u0159ed\u00ed pro spu\u0161t\u011bn\u00ed, nap\u0159\u00edklad Node:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn init --runtime node --trigger http hellonode\n\nVytv\u00e1\u0159en\u00ed funkce v: \/hellonode\nFunk\u010dn\u00ed z\u00e1kladn\u00ed \u0161ablona vygenerov\u00e1na.\nfunc.yaml vytvo\u0159en.<\/code><\/pre>\n<p><\/p>\n<p>Bude vytvo\u0159en nov\u00fd adres\u00e1\u0159 <code>hellonode<\/code> pro dal\u0161\u00ed v\u00fdvoj na\u0161\u00ed funkce Fn s n\u011bkter\u00fdmi z\u00e1kladn\u00edmi konfigura\u010dn\u00edmi soubory. Uvnit\u0159 nov\u011b vytvo\u0159en\u00e9ho adres\u00e1\u0159e m\u016f\u017eete vytvo\u0159it va\u0161i aplikaci, kter\u00e1 odpov\u00edd\u00e1 standard\u016fm zvolen\u00e9ho jazyka nebo prost\u0159ed\u00ed:<\/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 vytv\u00e1\u0159\u00ed po\u010d\u00e1te\u010dn\u00ed strukturu projektu, vytv\u00e1\u0159\u00ed soubor <code>func.yaml<\/code>, kter\u00fd obsahuje nezbytn\u00e1 nastaven\u00ed pro Fn, a nastavuje \u0161ablonu pro k\u00f3d v jazyce, kter\u00fd jste zvolili.<\/p>\n<p><\/p>\n<p>V p\u0159\u00edpad\u011b prost\u0159ed\u00ed Node to znamen\u00e1:<\/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>Nyn\u00ed rychle zkontrolujeme na\u0161i funkci lok\u00e1ln\u011b, abychom vid\u011bli, jak v\u0161e funguje.<\/p>\n<p><\/p>\n<p>Nejprve spust\u00edme server Fn. Jak ji\u017e bylo \u0159e\u010deno, server Fn je Docker kontejner, tak\u017ee po spu\u0161t\u011bn\u00ed vezme obraz z Docker registry.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn start -d                    # spust\u00edme lok\u00e1ln\u00ed server na pozad\u00ed\n\nUnable to find image 'fnproject\/fnserver:latest' locally\nlatest: Pulling from fnproject\/fnserver\nff3a5c916c92: Pull complete\n1a649ea86bca: Pull complete\nce35f4d5f86a: Pull complete\n\n...\n\nStatus: Downloaded newer image for fnproject\/fnserver:latest\n668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5<\/code><\/pre>\n<p><\/p>\n<p>Abychom spustili na\u0161i funkci, mus\u00edme ji \u201evydat\u201c. K tomu je t\u0159eba <code>n\u00e1zev aplikace<\/code>: ve Fn mus\u00ed b\u00fdt v\u0161echny aplikace definov\u00e1ny jako n\u00e1zvov\u00e9 prostory pro souvisej\u00edc\u00ed funkce.<\/p>\n<p><\/p>\n<p>Fn CLI hled\u00e1 soubor <code>func.yaml<\/code> v aktu\u00e1ln\u00edm adres\u00e1\u0159i, kter\u00fd se pou\u017eije pro konfiguraci funkce. Tak\u017ee se nejprve mus\u00edme p\u0159esunout do na\u0161eho adres\u00e1\u0159e <code>hellonode<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ cd hellonode\n$ fn deploy --app fnexo --local  # vyd\u00e1v\u00e1me funkci lok\u00e1ln\u011b, n\u00e1zev aplikace - fnexo.\n                                 # parametr local nevytla\u010duje obraz do vzd\u00e1len\u00e9ho registru,\n                                 # spou\u0161t\u00ed ho p\u0159\u00edmo\n\nDeploying hellonode to app: fnexo\nBumped to version 0.0.2\nBuilding image nfrankel\/hellonode:0.0.3 .\nUpdating function hellonode using image nfrankel\/hellonode:0.0.3...\nSuccessfully created app: fnexo\nSuccessfully created function: hellonode with nfrankel\/hellonode:0.0.3\nSuccessfully created trigger: hellonode-trigger<\/code><\/pre>\n<p><\/p>\n<p>Jak vid\u00edte z v\u00fdstupu p\u0159\u00edkazu, vytv\u00e1\u0159\u00ed se nov\u00fd obraz kontejneru pro Docker, kter\u00fd obsahuje na\u0161i funkci. Funkce je p\u0159ipravena k vol\u00e1n\u00ed, a m\u00e1me dva zp\u016fsoby, jak to ud\u011blat:<\/p>\n<p><\/p>\n<ul>\n<li>pomoc\u00ed p\u0159\u00edkazu Fn <code>invoke<\/code><\/li>\n<li>vol\u00e1n\u00edm p\u0159\u00edmo p\u0159es <code>http<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Zavol\u00e1n\u00ed <code>invoke<\/code> p\u0159es Fn emuluje pr\u00e1ci p\u0159es HTTP pro testov\u00e1n\u00ed, co\u017e je vhodn\u00e9 pro rychl\u00e9 ov\u011b\u0159en\u00ed:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn invoke fnexo hellonode      # vol\u00e1me funkci hellonode aplikace fnexo\n\n{\"message\":\"Hello World\"}<\/code><\/pre>\n<p><\/p>\n<p>Abychom mohli funkci volat p\u0159\u00edmo, mus\u00edme zn\u00e1t kompletn\u00ed URL:<\/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>Server Fn poskytuje sv\u00e9 funkce p\u0159es port 8080, a jak se zd\u00e1, URL funkce odpov\u00edd\u00e1 sch\u00e9matu <code>t\/app\/function<\/code>, ale ne zcela. Funkce se vyvol\u00e1v\u00e1 p\u0159es HTTP nikoli p\u0159\u00edmo, ale prost\u0159ednictv\u00edm takzvan\u00e9ho triggeru, kter\u00fd podle sv\u00e9ho n\u00e1zvu \u201espou\u0161t\u00ed\u201c vyvol\u00e1n\u00ed funkce. Triggery jsou definov\u00e1ny v <code>`func.yml<\/code> projektu:<\/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 triggeru<\/code><\/pre>\n<p><\/p>\n<p>M\u016f\u017eeme zm\u011bnit jm\u00e9no triggeru, aby odpov\u00eddalo n\u00e1zvu funkce, co\u017e v\u0161e zjednodu\u0161\u00ed:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">triggers:\n- name: hellonode-trigger\n  type: http\n  source: \/hellonode    # odpov\u00edd\u00e1 n\u00e1zvu funkce<\/code><\/pre>\n<p><\/p>\n<p>Pak znovu spust\u00edme dod\u00e1n\u00ed funkce a zavol\u00e1me ji z nov\u00e9ho triggeru:<\/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\":\"Ahoj sv\u011bte\"}<\/code><\/pre>\n<p><\/p>\n<p>V\u0161echno funguje! Je \u010das p\u0159ej\u00edt k re\u00e1ln\u00fdm experiment\u016fm a publikovat n\u00e1\u0161 FaaS na serveru!<\/p>\n<p><\/p>\n<h2 id=\"ustanovka-servisov-besservernyh-funkciy-na-sobstvennoy-infrastrukture\">Instalace serverless funkc\u00ed na vlastn\u00ed infrastruktu\u0159e<\/h2>\n<p><\/p>\n<p>Rychle nainstalujme virtu\u00e1ln\u00ed stroj pomoc\u00ed CLI Exoscale. Pokud jej je\u0161t\u011b nem\u00e1te nastaven\u00fd \u2014 m\u016f\u017eete pou\u017e\u00edt <noindex><a rel=\"nofollow\" href=\"https:\/\/community.exoscale.com\/documentation\/tools\/exoscale-command-line-interface\/\">na\u0161eho pr\u016fvodce pro rychl\u00e9 spu\u0161t\u011bn\u00ed<\/a><\/noindex>. To je skv\u011bl\u00fd n\u00e1stroj, kter\u00fd je\u0161t\u011b v\u00edce zv\u00fd\u0161\u00ed va\u0161i produktivitu. <strong>Nezapome\u0148te nastavit pravidlo pro otev\u0159en\u00ed portu 8080 ve skupin\u011b zabezpe\u010den\u00ed!<\/strong> N\u00e1sleduj\u00edc\u00ed p\u0159\u00edkazy spust\u00ed \u010dist\u00fd virtu\u00e1ln\u00ed stroj, p\u0159ipraven\u00fd pro nasazen\u00ed na\u0161ich funkc\u00ed:<\/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>Pak se m\u016f\u017eete p\u0159ihl\u00e1sit na virtu\u00e1ln\u00ed stroj p\u0159es ssh a nainstalovat vzd\u00e1len\u00fd server Fn:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ exo ssh fn-server\n\nAutenticita hostitele '185.19.30.175 (185.19.30.175)' nem\u016f\u017ee b\u00fdt ov\u011b\u0159ena.\nECDSA kl\u00ed\u010dov\u00fd otisk je SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.\nOpravdu chcete pokra\u010dovat v p\u0159ipojen\u00ed (ano\/ne)? ano\nVarov\u00e1n\u00ed: Trvale p\u0159id\u00e1no '185.19.30.175' (ECDSA) do seznamu zn\u00e1m\u00fdch hostitel\u016f.\nV\u00edtejte na Ubuntu 18.04 LTS (GNU\/Linux 4.15.0-20-generic x86_64)<\/code><\/pre>\n<p><\/p>\n<p>Nyn\u00ed nainstalujeme Docker a server Fn stejn\u011b, jak to ji\u017e bylo provedeno na lok\u00e1ln\u00edm stroji, a spust\u00edme 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 p\u0159ipraven k p\u0159ij\u00edm\u00e1n\u00ed funkc\u00ed! Pro c\u00edlov\u00e9 nasazen\u00ed funkc\u00ed na vzd\u00e1len\u00fd server pou\u017eijeme p\u0159\u00edkaz <code>deploy<\/code> z lok\u00e1ln\u00edho po\u010d\u00edta\u010de s vynech\u00e1n\u00edm p\u0159ep\u00edna\u010de <code>--local<\/code>.<\/p>\n<p><\/p>\n<p>Krom\u011b toho Fn vy\u017eaduje nastavit adresu serveru Fn a registru Docker. Tyto parametry mohou b\u00fdt nastaveny prost\u0159ednictv\u00edm prom\u011bnn\u00fdch prost\u0159ed\u00ed <code>FN_API_URL<\/code> a <code>FN_REGISTRY<\/code> p\u0159\u00edslu\u0161n\u011b, ale je zde i pohodln\u011bj\u0161\u00ed zp\u016fsob pro snadnou spr\u00e1vu vytv\u00e1\u0159en\u00ed a spr\u00e1vy konfigurac\u00ed pro nasazen\u00ed.<\/p>\n<p><\/p>\n<p>V term\u00ednech Fn se konfigurace pro nasazen\u00ed naz\u00fdv\u00e1 <code>context<\/code>. N\u00e1sleduj\u00edc\u00ed p\u0159\u00edkaz vytvo\u0159\u00ed kontext:<\/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>M\u016f\u017eete si prohl\u00e9dnout dostupn\u00e9 kontexty takto:<\/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 p\u0159epnout na kontext, kter\u00fd byl pr\u00e1v\u011b vytvo\u0159en, takto:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"> $ fn use context exoscale\n\n Nyn\u00ed pou\u017e\u00edv\u00e1te kontext: exoscale<\/code><\/pre>\n<p><\/p>\n<p>Od tohoto m\u00edsta bude dod\u00e1n\u00ed funkc\u00ed Fn na\u010d\u00edtat obrazy Docker pomoc\u00ed vybran\u00e9ho \u00fa\u010dtu na DockerHub (v m\u00e9m p\u0159\u00edpad\u011b \u2014 <code>nfrankel<\/code>), po kter\u00e9m informuje vzd\u00e1len\u00fd server (v tomto p\u0159\u00edkladu \u2014 <code>http:\/\/185.19.30.175:8080<\/code>) o um\u00edst\u011bn\u00ed a verzi posledn\u00edho obrazu, kter\u00fd obsahuje va\u0161i funkci.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn deploy --app fnexo .   # prov\u00e1d\u00ed se na lok\u00e1ln\u00edm stroji z adres\u00e1\u0159e hellonode\n\nNasazen\u00ed funkce na: \nNasazen\u00ed hellonode do aplikace: fnexo\nZv\u00fd\u0161eno na verzi 0.0.5\nVytv\u00e1\u0159en\u00ed obrazu nfrankel\/hellonode:0.0.5 .<\/code><\/pre>\n<p><\/p>\n<p>Nakonec:<\/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=\"Budujeme vlastn\u00ed serverless na z\u00e1klad\u011b Fn\" src=\"\/wp-content\/uploads\/2019\/11\/51a7b88cd6bf4953740cfac937b0acc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>\u017divotn\u00ed cyklus funkce v bezserverov\u00fdch v\u00fdpo\u010dtech zalo\u017een\u00fdch na Fn<\/em><\/p>\n<p><\/p>\n<h2 id=\"preimuschestva-besservernyh-vychisleniy-na-svoih-moschnostyah\">V\u00fdhody bezserverov\u00fdch v\u00fdpo\u010dt\u016f na vlastn\u00edch prost\u0159edc\u00edch<\/h2>\n<p><\/p>\n<p>Bezserverov\u00e9 v\u00fdpo\u010dty jsou pohodln\u00fdm \u0159e\u0161en\u00edm pro rychl\u00e9 nasazen\u00ed nez\u00e1visl\u00fdch \u010d\u00e1st\u00ed aplikace, kter\u00e9 interaguj\u00ed s komplexn\u011bj\u0161\u00edmi aplikacemi nebo microservices.<\/p>\n<p><\/p>\n<p>\u010casto to souvis\u00ed se skrytou cenou v\u00e1z\u00e1n\u00ed na vybran\u00e9ho poskytovatele, co\u017e m\u016f\u017ee v z\u00e1vislosti na konkr\u00e9tn\u00edm sc\u00e9n\u00e1\u0159i pou\u017eit\u00ed a objemu v\u00e9st k vy\u0161\u0161\u00edm n\u00e1klad\u016fm a sn\u00ed\u017een\u00ed flexibility do budoucna.<\/p>\n<p><\/p>\n<p>V\u00edcecloudov\u00e9 a hybridn\u00ed cloudov\u00e9 architektury tak\u00e9 trp\u00ed v takov\u00e9m p\u0159\u00edpad\u011b, proto\u017ee se m\u016f\u017eete snadno ocitnout v situaci, kdy byste cht\u011bli pou\u017e\u00edvat bezserverov\u00e9 v\u00fdpo\u010dty, ale kv\u016fli firemn\u00ed politice to m\u016f\u017ee b\u00fdt nemo\u017en\u00e9.<\/p>\n<p><\/p>\n<p>Fn je dostate\u010dn\u011b jednoduch\u00fd na pou\u017e\u00edv\u00e1n\u00ed, m\u016f\u017ee poskytnout t\u00e9m\u011b\u0159 stejn\u00fd FaaS rozhran\u00ed s minim\u00e1ln\u00edmi n\u00e1klady. Odstran\u00ed jak\u00e9koli vazby na poskytovatele, m\u016f\u017ee b\u00fdt nainstalov\u00e1n lok\u00e1ln\u011b nebo u jak\u00e9hokoliv vhodn\u00e9ho poskytovatele cloudov\u00fdch \u0159e\u0161en\u00ed podle va\u0161eho v\u00fdb\u011bru. Tak\u00e9 m\u00e1te volnost ve v\u00fdb\u011bru programovac\u00edho jazyka.<\/p>\n<p><\/p>\n<p>V \u010dl\u00e1nku jsou uvedeny pouze z\u00e1klady Fn, ale vytvo\u0159en\u00ed vlastn\u00edho prost\u0159ed\u00ed pro prov\u00e1d\u011bn\u00ed je dost jednoduch\u00e9 a celkovou architekturu lze roz\u0161\u00ed\u0159it pou\u017eit\u00edm vyva\u017eova\u010de zat\u00ed\u017een\u00ed Fn, nebo um\u00edst\u011bn\u00edm Fn za proxy pro ochranu.<\/p>\n<p>Zdroj: <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.3 - 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\/cs\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\udd47Budujeme vlastn\u00ed bezserverov\u00e9 \u0159e\u0161en\u00ed na b\u00e1zi Fn | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/52562","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=52562"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/52562\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=52562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=52562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=52562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}