{"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\/pl\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","title":{"rendered":"Budujemy w\u0142asny serverless oparty na Fn","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Budujemy w\u0142asny serverless oparty 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\">Obliczenia bezserwerowe<\/a><\/noindex> \u2014 jedna z najbardziej zauwa\u017calnych tendencji w chmurze obliczeniowej. G\u0142\u00f3wn\u0105 zasad\u0105 dzia\u0142ania jest to, \u017ce infrastruktura jest trosk\u0105 nie DevOps\u00f3w, a dostawcy us\u0142ug. Skalowanie zasob\u00f3w automatycznie dostosowuje si\u0119 do obci\u0105\u017cenia i charakteryzuje si\u0119 du\u017c\u0105 szybko\u015bci\u0105 zmiany.<\/p>\n<p><\/p>\n<p>Inn\u0105 wsp\u00f3ln\u0105 cech\u0105 jest tendencja do minimalizacji i skupienia kodu, dlatego obliczenia bezserwerowe czasami nazywane s\u0105 \u201efunkcj\u0105 jako us\u0142uga\u201d (FaaS).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Historycznie pierwszym dostawc\u0105 us\u0142ug w chmurze, kt\u00f3ry zaoferowa\u0142 FaaS z AWS Lambda, by\u0142 Amazon, sk\u0105d pochodzi ta nazwa. Inni dostawcy us\u0142ug w chmurze r\u00f3wnie\u017c oferuj\u0105 analogi:<\/p>\n<p><\/p>\n<ul>\n<li>Cloud Functions od Google<\/li>\n<li>Azure Functions od Microsoftu<\/li>\n<\/ul>\n<p><\/p>\n<p>Wszystkie te firmy oferuj\u0105 obliczenia bezserwerowe, automatyczne skalowanie i p\u0142atno\u015b\u0107 tylko za faktycznie wykorzystane zasoby, jednak przywi\u0105zuj\u0105 klient\u00f3w do swojego w\u0142asnego produktu. Niemniej jednak istniej\u0105 darmowe alternatywy z otwartym \u017ar\u00f3d\u0142em do organizowania oblicze\u0144 bezserwerowych. Warto zauwa\u017cy\u0107:<\/p>\n<p><\/p>\n<ul>\n<li>Platform\u0119 <noindex><a rel=\"nofollow\" href=\"https:\/\/openwhisk.apache.org\/\">Apache OpenWhisk<\/a><\/noindex>, opracowywan\u0105 w inkubatorze przez IBM,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.spring.io\/spring-cloud-function\/\">Spring Cloud Functions<\/a><\/noindex>, jako cz\u0119\u015b\u0107 do\u015b\u0107 bogatego ekosystemu Spring Framework, kt\u00f3ry mo\u017ce by\u0107 r\u00f3wnie\u017c u\u017cywany jako fasada AWS Lambda, Azure Functions i OpenWhisk,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/fnproject\">Projekt Fn<\/a><\/noindex>, wspierany przez Oracle.<\/li>\n<\/ul>\n<p><\/p>\n<p>Wszystkie te rozwi\u0105zania s\u0105 ca\u0142kowicie niezale\u017cne od chmur, to znaczy mog\u0105 by\u0107 instalowane w dowolnej chmurze, w tym w chmurze prywatnej, publicznej lub oczywi\u015bcie w Exoscale.<\/p>\n<p><\/p>\n<h2 id=\"kak-proekt-fn-ustroen\">Jak dzia\u0142a projekt Fn<\/h2>\n<p><\/p>\n<p>Fn jest w pe\u0142ni oparty na Dockerze, sk\u0142ada si\u0119 z dw\u00f3ch g\u0142\u00f3wnych komponent\u00f3w:<\/p>\n<p><\/p>\n<ul>\n<li>CLI programu, przeznaczonego do zarz\u0105dzania wszystkimi aspektami infrastruktury Fn i interakcjonuj\u0105cego z serwerem Fn,<\/li>\n<li>Sama serwer Fn, zwyk\u0142a aplikacja zapakowana w kontener dla Docker.<\/li>\n<\/ul>\n<p><\/p>\n<p>Funkcje uruchamiane w Fn s\u0105 r\u00f3wnie\u017c wykonywane w oddzielnych kontenerach, co pozwala na obs\u0142ug\u0119 wielu j\u0119zyk\u00f3w programowania, na przyk\u0142ad\u2026 Clojure!<\/p>\n<p><\/p>\n<p>Argumenty funkcji s\u0105 przekazywane do standardowego wej\u015bcia (STDIN), a wyniki s\u0105 zapisywane na standardowym wyj\u015bciu (STDOUT). Je\u015bli argumenty lub zwracane warto\u015bci nie s\u0105 prostymi warto\u015bciami (na przyk\u0142ad obiekt JSON) \u2013 mog\u0105 by\u0107 przetwarzane za pomoc\u0105 warstwy abstrakcji, kt\u00f3r\u0105 sam Fn udost\u0119pnia w postaci zestawu do tworzenia funkcji (FDK).<\/p>\n<p><\/p>\n<p>Dla wygody oferowane s\u0105 wbudowane zestawy szablon\u00f3w, kt\u00f3re u\u0142atwiaj\u0105 wdra\u017canie FaaS w szerokim wachlarzu r\u00f3\u017cnych j\u0119zyk\u00f3w i ich wersji (Go, r\u00f3\u017cne wersje Java, Python itd.).<\/p>\n<p><\/p>\n<p>Stworzenie FaaS jest proste, post\u0119puj\u0105c wed\u0142ug tego schematu:<\/p>\n<p><\/p>\n<ul>\n<li>Wdra\u017camy funkcj\u0119 za pomoc\u0105 CLI Fn: tworzony jest plik konfiguracyjny aplikacji dla Fn, oparty na wybranym szablonie.<\/li>\n<li>Wypuszczamy nasz\u0105 funkcj\u0119, zn\u00f3w za pomoc\u0105 CLI Fn: obraz kontenera umieszczany jest w pewnym repozytorium, a nast\u0119pnie serwer jest informowany o istnieniu i lokalizacji tego obrazu.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Budujemy w\u0142asny serverless oparty na Fn\" src=\"\/wp-content\/uploads\/2019\/11\/5add8b58c80e976cd61a156fdd0fba11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Zasada dostarczania funkcji w Fn<\/em><\/p>\n<p><\/p>\n<h2 id=\"lokalnaya-ustanovka-i-testirovanie-besservernyh-funkciy\">Lokalna instalacja i testowanie bezserwerowych funkcji<\/h2>\n<p><\/p>\n<p>Zaczynamy od instalacji Fn na lokalnej maszynie. Najpierw instalujemy Docker, jak wymaga Fn. Zak\u0142adamy, \u017ce jeste\u015bmy na Debianie\/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>Lub skorzystaj z mened\u017cera pakiet\u00f3w \/ kompilacji Dockera zgodnie z twoim systemem. Nast\u0119pnie mo\u017cna przej\u015b\u0107 bezpo\u015brednio do instalacji Fn CLI. Na przyk\u0142ad, u\u017cywaj\u0105c 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>Je\u015bli pracujesz na OSX i masz zainstalowanego Homebrew, mo\u017cna p\u00f3j\u015b\u0107 inn\u0105 drog\u0105:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ brew install fn\n\n==&gt; Pobieranie https:\/\/homebrew.bintray.com\/bottles\/fn-0.5.8.high_sierra.bottle.tar.gz\n==&gt; Pobieranie z https:\/\/akamai.bintray.com\/b1\/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb\n######################################################################## 100.0%\n==&gt; Wylewaj\u0105c fn-0.5.8.high_sierra.bottle.tar.gz\n  \/usr\/local\/Cellar\/fn\/0.5.8: 5 plik\u00f3w, 16.7MB<\/code><\/pre>\n<p><\/p>\n<p>Teraz wszystko jest gotowe do pocz\u0105tkowego wdro\u017cenia naszej funkcji z u\u017cyciem CLI. Dla uproszczenia b\u0119dziemy u\u017cywa\u0107 wbudowanego \u015brodowiska uruchomieniowego, na przyk\u0142ad Node:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn init --runtime node --trigger http hellonode\n\nTworzenie funkcji w: \/hellonode\nWygenerowano szablon funkcji.\nfunc.yaml utworzono.<\/code><\/pre>\n<p><\/p>\n<p>Zostanie utworzony nowy katalog <code>hellonode<\/code> do dalszego rozwoju naszej funkcji Fn z kilkoma podstawowymi plikami konfiguracyjnymi. Wewn\u0105trz nowo utworzonego katalogu mo\u017cesz stworzy\u0107 swoj\u0105 aplikacj\u0119, przestrzegaj\u0105c standard\u00f3w wybranego przez siebie j\u0119zyka lub \u015brodowiska uruchomieniowego:<\/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 tworzy pocz\u0105tkow\u0105 struktur\u0119 projektu, tworzy plik <code>func.yaml<\/code>, zawieraj\u0105cy niezb\u0119dne konfiguracje dla Fn oraz ustalaj\u0105cy szablon dla kodu w wybranym j\u0119zyku.<\/p>\n<p><\/p>\n<p>W przypadku \u015brodowiska wykonawczego Node oznacza to:<\/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>Teraz szybko przetestujemy nasz\u0105 funkcj\u0119 lokalnie, aby zobaczy\u0107, jak to wszystko dzia\u0142a.<\/p>\n<p><\/p>\n<p>Na pocz\u0105tek uruchomimy serwer Fn. Jak ju\u017c wspomniano, serwer Fn jest kontenerem Docker, wi\u0119c po uruchomieniu pobierze obraz z rejestru Docker.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn start -d                    # uruchamiamy lokalny serwer w tle\n\nNie mo\u017cna znale\u017a\u0107 obrazu 'fnproject\/fnserver:latest' lokalnie\nlatest: Pobieranie z fnproject\/fnserver\nff3a5c916c92: Pobieranie zako\u0144czone\n1a649ea86bca: Pobieranie zako\u0144czone\nce35f4d5f86a: Pobieranie zako\u0144czone\n\n...\n\nStan: Pobrano nowszy obraz dla fnproject\/fnserver:latest\n668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5<\/code><\/pre>\n<p><\/p>\n<p>Aby uruchomi\u0107 nasz\u0105 funkcj\u0119, musimy j\u0105 \u201ewypu\u015bci\u0107\u201d. W tym celu potrzebujemy <code>nazwa aplikacji<\/code>: w Fn wszystkie aplikacje musz\u0105 by\u0107 zdefiniowane jako przestrzenie nazw dla powi\u0105zanych funkcji.<\/p>\n<p><\/p>\n<p>Fn CLI b\u0119dzie szuka\u0107 pliku <code>func.yaml<\/code> w bie\u017c\u0105cym katalogu, kt\u00f3ry b\u0119dzie u\u017cywany do konfiguracji funkcji. Wi\u0119c najpierw musimy przej\u015b\u0107 do naszego katalogu <code>hellonode<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ cd hellonode\n$ fn deploy --app fnexo --local  # wypuszczamy funkcj\u0119 lokalnie, nazwa aplikacji - fnexo.\n                                 # parametr local nie przesy\u0142a obrazu do zdalnego rejestru,\n                                 # uruchamiaj\u0105c go bezpo\u015brednio\n\nWdra\u017canie hellonode do aplikacji: fnexo\nZwi\u0119kszono do wersji 0.0.2\nBudowanie obrazu nfrankel\/hellonode:0.0.3 .\nAktualizowanie funkcji hellonode przy u\u017cyciu obrazu nfrankel\/hellonode:0.0.3...\nPomy\u015blnie utworzono aplikacj\u0119:  fnexo\nPomy\u015blnie utworzono funkcj\u0119: hellonode z nfrankel\/hellonode:0.0.3\nPomy\u015blnie utworzono wyzwalacz: hellonode-trigger<\/code><\/pre>\n<p><\/p>\n<p>Jak wida\u0107 z wyj\u015bcia polecenia, tworzony jest nowy obraz kontenera dla Docker, zawieraj\u0105cy nasz\u0105 funkcj\u0119. Funkcja jest gotowa do wywo\u0142ania, a mamy dwa sposoby, aby to zrobi\u0107:<\/p>\n<p><\/p>\n<ul>\n<li>korzystaj\u0105c z polecenia Fn <code>invoke<\/code><\/li>\n<li>wywo\u0142uj\u0105c bezpo\u015brednio przez <code>http<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Wywo\u0142anie <code>invoke<\/code> Fn emuluje po\u0142\u0105czenie HTTP do test\u00f3w, co jest wygodne do szybkiej weryfikacji:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn invoke fnexo hellonode      # wywo\u0142ujemy funkcj\u0119 hellonode aplikacji fnexo\n\n{\"message\":\"Hello World\"}<\/code><\/pre>\n<p><\/p>\n<p>Aby wywo\u0142a\u0107 funkcj\u0119 bezpo\u015brednio, musisz zna\u0107 pe\u0142ny 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>Serwer Fn udost\u0119pnia swoje funkcje przez port 8080, a URL funkcji odpowiada schematowi <code>t\/app\/function<\/code>, ale nie w ca\u0142o\u015bci. Funkcja jest wywo\u0142ywana przez HTTP nie bezpo\u015brednio, ale poprzez tzw. wyzwalacz, kt\u00f3ry zgodnie z nazw\u0105 \u201euruchamia\u201d wywo\u0142anie funkcji. Wyzwalacze s\u0105 definiowane w <code>`func.yml<\/code> projekcie:<\/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 wyzwalacza<\/code><\/pre>\n<p><\/p>\n<p>Mo\u017cemy zmieni\u0107 nazw\u0119 wyzwalacza, aby odpowiada\u0142a nazwie funkcji, co wszystko upro\u015bci:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">triggers:\n- name: hellonode-trigger\n  type: http\n  source: \/hellonode    # pasuje do nazwy funkcji<\/code><\/pre>\n<p><\/p>\n<p>Nast\u0119pnie uruchamiamy wdra\u017canie funkcji jeszcze raz i wywo\u0142ujemy j\u0105 z nowego wyzwalacza:<\/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>Wszystko dzia\u0142a! Czas przej\u015b\u0107 do rzeczywistych eksperyment\u00f3w i opublikowa\u0107 nasze FaaS na serwerze!<\/p>\n<p><\/p>\n<h2 id=\"ustanovka-servisov-besservernyh-funkciy-na-sobstvennoy-infrastrukture\">Instalacja serwis\u00f3w funkcji bezserwerowych na w\u0142asnej infrastrukturze<\/h2>\n<p><\/p>\n<p>Szybko zainstalujmy maszyn\u0119 wirtualn\u0105 korzystaj\u0105c z CLI Exoscale. Je\u015bli jeszcze jej nie skonfigurowa\u0142e\u015b \u2014 mo\u017cesz skorzysta\u0107 <noindex><a rel=\"nofollow\" href=\"https:\/\/community.exoscale.com\/documentation\/tools\/exoscale-command-line-interface\/\">z naszego przewodnika szybkiego uruchomienia<\/a><\/noindex>. To \u015bwietne narz\u0119dzie, kt\u00f3re jeszcze bardziej zwi\u0119kszy Twoj\u0105 produktywno\u015b\u0107. <strong>Nie zapomnij o skonfigurowaniu regu\u0142y otwieraj\u0105cej port 8080 w grupie bezpiecze\u0144stwa!<\/strong> Nast\u0119puj\u0105ce polecenia uruchomi\u0105 czyst\u0105 maszyn\u0119 wirtualn\u0105, gotow\u0105 do hostowania naszych funkcji:<\/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>Nast\u0119pnie mo\u017cna zalogowa\u0107 si\u0119 przez ssh na maszyn\u0119 wirtualn\u0105 i zainstalowa\u0107 serwer Fn:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ exo ssh fn-server\n\nThe authenticity of host '185.19.30.175 (185.19.30.175)' can't be established.\nECDSA key fingerprint is SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.\nAre you sure you want to continue connecting (yes\/no)? yes\nWarning: Permanently added '185.19.30.175' (ECDSA) to the list of known hosts.\nWelcome to Ubuntu 18.04 LTS (GNU\/Linux 4.15.0-20-generic x86_64)<\/code><\/pre>\n<p><\/p>\n<p>Nast\u0119pnie instalujemy Dockera i serwer Fn tak jak to ju\u017c by\u0142o robione na lokalnej maszynie, uruchamiamy serwer:<\/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 jest gotowy do odbioru funkcji! Do przesy\u0142ania funkcji na zdalny serwer u\u017cyjemy komendy <code>deploy<\/code> z lokalnego komputera, pomijaj\u0105c flag\u0119 <code>--local<\/code>.<\/p>\n<p><\/p>\n<p>Poza tym Fn wymaga podania adresu serwera Fn oraz rejestru Dockera. Te parametry mog\u0105 by\u0107 ustawione przez zmienne \u015brodowiskowe <code>FN_API_URL<\/code> i <code>FN_REGISTRY<\/code> odpowiednio, ale zaproponowany jest te\u017c wygodniejszy spos\u00f3b na proste zarz\u0105dzanie tworzeniem i zarz\u0105dzaniem konfiguracjami dla wdro\u017cenia.<\/p>\n<p><\/p>\n<p>W terminologii Fn, konfiguracja dla wdro\u017cenia nazywa si\u0119 <code>context<\/code>. Nast\u0119puj\u0105ca komenda stworzy 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\u017cesz wy\u015bwietli\u0107 dost\u0119pne konteksty w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn list contexts\n\nAKTUALNA NAZWA      DOSTAWCA      URL API                      REJESTR\n    default       default       http:\/\/localhost:8080\/\n    exoscale      default       http:\/\/185.19.30.175:8080    nfrankel\n<\/code><\/pre>\n<p><\/p>\n<p>Aby prze\u0142\u0105czy\u0107 si\u0119 na kontekst, kt\u00f3ry w\u0142a\u015bnie zosta\u0142 utworzony, u\u017cyj nast\u0119puj\u0105cej komendy:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"> $ fn use context exoscale\n\n Teraz u\u017cywany kontekst: exoscale<\/code><\/pre>\n<p><\/p>\n<p>Od tego miejsca dostarczanie funkcji Fn zacznie \u0142adowa\u0107 obrazy Docker, korzystaj\u0105c z wybranego konta na DockerHub (w moim przypadku \u2014 <code>nfrankel<\/code>), nast\u0119pnie powiadomi serwer zdalny (w tym przyk\u0142adzie \u2014 <code>http:\/\/185.19.30.175:8080<\/code>) o lokalizacji i wersji ostatniego obrazu, zawieraj\u0105cego twoj\u0105 funkcj\u0119.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn deploy --app fnexo .   # wykonywane na lokalnej maszynie z katalogu hellonode\n\nWdra\u017canie funkcji z: \/.\nWdra\u017canie hellonode do aplikacji: fnexo\nZaktualizowano do wersji 0.0.5\nBudowanie obrazu nfrankel\/hellonode:0.0.5 .<\/code><\/pre>\n<p><\/p>\n<p>Na koniec:<\/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=\"Budujemy w\u0142asny serverless oparty na Fn\" src=\"\/wp-content\/uploads\/2019\/11\/51a7b88cd6bf4953740cfac937b0acc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Cykl \u017cycia funkcji w obliczeniach bezserwerowych opartych na Fn<\/em><\/p>\n<p><\/p>\n<h2 id=\"preimuschestva-besservernyh-vychisleniy-na-svoih-moschnostyah\">Zalety oblicze\u0144 bezserwerowych na w\u0142asnych zasobach<\/h2>\n<p><\/p>\n<p>Obliczenia bezserwerowe to wygodne rozwi\u0105zanie do szybkiego wdra\u017cania niezale\u017cnych cz\u0119\u015bci aplikacji, kt\u00f3re wsp\u00f3\u0142pracuj\u0105 z bardziej z\u0142o\u017conymi aplikacjami lub mikroserwisami.<\/p>\n<p><\/p>\n<p>Cz\u0119sto zwi\u0105zane jest to z ukrytymi kosztami uzale\u017cnienia od wybranego dostawcy, co w zale\u017cno\u015bci od konkretnego przypadku u\u017cycia i skali mo\u017ce prowadzi\u0107 do wy\u017cszych wydatk\u00f3w i mniejszej elastyczno\u015bci w przysz\u0142o\u015bci.<\/p>\n<p><\/p>\n<p>Architektury multi-cloud i hybrydowe r\u00f3wnie\u017c cierpi\u0105 z tego powodu, poniewa\u017c \u0142atwo mo\u017cna znale\u017a\u0107 si\u0119 w sytuacji, w kt\u00f3rej chcia\u0142oby si\u0119 korzysta\u0107 z oblicze\u0144 bezserwerowych, ale ze wzgl\u0119du na polityk\u0119 korporacyjn\u0105 mo\u017ce to by\u0107 niemo\u017cliwe.<\/p>\n<p><\/p>\n<p>Fn jest stosunkowo prosty w u\u017cyciu, mo\u017ce da\u0107 prawie taki sam interfejs FaaS przy minimalnych kosztach. Umo\u017cliwia unikni\u0119cie jakichkolwiek uzale\u017cnie\u0144 od dostawcy, mo\u017cna go zainstalowa\u0107 lokalnie lub u dowolnego wybranego dostawcy chmurowego. Istnieje r\u00f3wnie\u017c swoboda w wyborze j\u0119zyka programowania.<\/p>\n<p><\/p>\n<p>W artykule przedstawiono jedynie podstawy Fn, jednak stworzenie w\u0142asnego \u015brodowiska wykonawczego jest wystarczaj\u0105co proste, a og\u00f3ln\u0105 architektur\u0119 mo\u017cna wdro\u017cy\u0107 szerzej, korzystaj\u0105c z load balancera Fn lub umieszczaj\u0105c Fn za proxy w celu ochrony.<\/p>\n<p>\u0179r\u00f3d\u0142o: <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.1.1 - 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\/pl\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Budujemy w\u0142asny serverless na bazie Fn | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/52562","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=52562"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/52562\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=52562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=52562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=52562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}