{"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\/fr\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","title":{"rendered":"Construisons notre propre serverless bas\u00e9 sur Fn","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Construisons notre propre serverless bas\u00e9 sur 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\">Calculs sans serveur<\/a><\/noindex> \u2014 l'une des tendances les plus remarquables dans le cloud computing. Le principe de fonctionnement repose sur le fait que l'infrastructure est une pr\u00e9occupation non pas des DevOps, mais du fournisseur de services. La mont\u00e9e en charge des ressources s'ajuste automatiquement \u00e0 la demande et offre une grande rapidit\u00e9 de changement.<\/p>\n<p><\/p>\n<p>Une autre caract\u00e9ristique commune est la tendance \u00e0 minimiser et \u00e0 se concentrer sur le code, c'est pourquoi l'informatique sans serveur est parfois appel\u00e9e \u00ab fonction en tant que service \u00bb (FaaS).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Historiquement, le premier fournisseur de services cloud \u00e0 proposer le FaaS avec AWS Lambda \u00e9tait Amazon, d'o\u00f9 vient ce nom. D'autres fournisseurs de cloud proposent \u00e9galement des analogues :<\/p>\n<p><\/p>\n<ul>\n<li>Cloud Functions de Google<\/li>\n<li>Azure Functions de Microsoft<\/li>\n<\/ul>\n<p><\/p>\n<p>Toutes ces entreprises fournissent des calculs sans serveur, une mont\u00e9e en charge automatique et ne facturent que les ressources effectivement utilis\u00e9es, tout en liant les clients \u00e0 leur produit propri\u00e9taire. Cependant, il existe des alternatives gratuites et open source pour organiser des calculs sans serveur. \u00c0 noter :<\/p>\n<p><\/p>\n<ul>\n<li>La plateforme <noindex><a rel=\"nofollow\" href=\"https:\/\/openwhisk.apache.org\/\">Apache OpenWhisk<\/a><\/noindex>, d\u00e9velopp\u00e9e dans l'incubateur par IBM,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.spring.io\/spring-cloud-function\/\">Spring Cloud Functions<\/a><\/noindex>, comme partie d'un \u00e9cosyst\u00e8me assez riche du Spring Framework, qui peut \u00e9galement \u00eatre utilis\u00e9 comme fa\u00e7ade pour AWS Lambda, Azure Functions et OpenWhisk,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/fnproject\">Le projet Fn<\/a><\/noindex>, soutenu par Oracle.<\/li>\n<\/ul>\n<p><\/p>\n<p>Tous sont compl\u00e8tement ind\u00e9pendants du cloud, c'est-\u00e0-dire qu'ils peuvent \u00eatre install\u00e9s dans n'importe quel cloud, y compris le v\u00f4tre, public ou priv\u00e9, et bien s\u00fbr dans Exoscale.<\/p>\n<p><\/p>\n<h2 id=\"kak-proekt-fn-ustroen\">Comment le projet Fn est structur\u00e9<\/h2>\n<p><\/p>\n<p>Fn est enti\u00e8rement construit sur Docker, compos\u00e9 de deux composants principaux :<\/p>\n<p><\/p>\n<ul>\n<li>Une interface en ligne de commande (CLI) con\u00e7ue pour g\u00e9rer tous les aspects de l'infrastructure Fn et interagir avec le serveur Fn,<\/li>\n<li>Le serveur Fn lui-m\u00eame, une application classique emball\u00e9e dans un conteneur Docker.<\/li>\n<\/ul>\n<p><\/p>\n<p>Les fonctions d\u00e9ploy\u00e9es dans Fn s'ex\u00e9cutent \u00e9galement dans des conteneurs s\u00e9par\u00e9s, ce qui permet de supporter de nombreux langages de programmation, par exemple\u2026 Clojure !<\/p>\n<p><\/p>\n<p>Les arguments des fonctions sont transmis via l'entr\u00e9e standard (STDIN), et les r\u00e9sultats sont \u00e9crits sur la sortie standard (STDOUT). Si les arguments ou les valeurs retourn\u00e9es ne sont pas des valeurs simples (par exemple, un objet JSON), ils peuvent \u00eatre transform\u00e9s \u00e0 l'aide de la couche d'abstraction fournie par Fn sous la forme d'un kit de d\u00e9veloppement de fonctions (FDK).<\/p>\n<p><\/p>\n<p>Pour plus de commodit\u00e9, des ensembles de mod\u00e8les int\u00e9gr\u00e9s sont propos\u00e9s, facilitant le d\u00e9ploiement de FaaS sur une large liste de langages diff\u00e9rents et leurs versions (Go, plusieurs versions de Java, Python, etc.).<\/p>\n<p><\/p>\n<p>Cr\u00e9er un FaaS est simple, en suivant ce sch\u00e9ma :<\/p>\n<p><\/p>\n<ul>\n<li>Nous d\u00e9ployons la fonction \u00e0 l'aide de la CLI Fn : un fichier de configuration d'application pour Fn est cr\u00e9\u00e9, bas\u00e9 sur le mod\u00e8le choisi.<\/li>\n<li>Nous d\u00e9ployons notre propre fonction, encore une fois avec la CLI Fn : l'image du conteneur est plac\u00e9e dans un certain d\u00e9p\u00f4t, apr\u00e8s quoi le serveur est inform\u00e9 de l'existence et de l'emplacement de cette image.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Construisons notre propre serverless bas\u00e9 sur Fn\" src=\"\/wp-content\/uploads\/2019\/11\/5add8b58c80e976cd61a156fdd0fba11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Le principe de livraison des fonctions dans Fn<\/em><\/p>\n<p><\/p>\n<h2 id=\"lokalnaya-ustanovka-i-testirovanie-besservernyh-funkciy\">Installation locale et test des fonctions serverless<\/h2>\n<p><\/p>\n<p>Commen\u00e7ons par installer Fn sur la machine locale. D'abord, Docker est install\u00e9, comme l'exige Fn. On suppose que nous sommes sous 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>Ou utilisez le gestionnaire de paquets ou la version de Docker appropri\u00e9e pour votre syst\u00e8me. Ensuite, nous pouvons passer directement \u00e0 l'installation de la CLI Fn. Par exemple, avec 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>Si vous travaillez sur OSX avec Homebrew install\u00e9, vous pouvez prendre une autre voie :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ brew install fn\n\n==&gt; Downloading https:\/\/homebrew.bintray.com\/bottles\/fn-0.5.8.high_sierra.bottle.tar.gz\n==&gt; Downloading from https:\/\/akamai.bintray.com\/b1\/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb\n######################################################################## 100.0%\n==&gt; Pouring fn-0.5.8.high_sierra.bottle.tar.gz\n  \/usr\/local\/Cellar\/fn\/0.5.8: 5 files, 16.7MB<\/code><\/pre>\n<p><\/p>\n<p>Tout est maintenant pr\u00eat pour le d\u00e9ploiement initial de notre fonction en utilisant la CLI. Pour simplifier, nous allons utiliser l'environnement int\u00e9gr\u00e9, par exemple Node :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn init --runtime node --trigger http hellonode\n\nCr\u00e9ation de la fonction \u00e0 : \/hellonode\nMod\u00e8le de fonction g\u00e9n\u00e9r\u00e9.\nfunc.yaml cr\u00e9\u00e9.<\/code><\/pre>\n<p><\/p>\n<p>Un nouveau r\u00e9pertoire sera cr\u00e9\u00e9 <code>hellonode<\/code> pour le d\u00e9veloppement ult\u00e9rieur de notre fonction Fn avec quelques fichiers de configuration essentiels. \u00c0 l'int\u00e9rieur du r\u00e9pertoire nouvellement cr\u00e9\u00e9, vous pouvez cr\u00e9er votre application en respectant les normes du langage ou de l'environnement d'ex\u00e9cution que vous avez choisi :<\/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 cr\u00e9e la structure initiale du projet, cr\u00e9e le fichier <code>func.yaml<\/code>, contenant les configurations n\u00e9cessaires pour Fn, et met en place un mod\u00e8le pour le code dans le langage que vous avez choisi.<\/p>\n<p><\/p>\n<p>Dans le cas de l'environnement d'ex\u00e9cution Node, cela signifie :<\/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>Nous allons maintenant tester rapidement notre fonction localement pour voir comment tout fonctionne.<\/p>\n<p><\/p>\n<p>Pour commencer, nous allons lancer le serveur Fn. Comme d\u00e9j\u00e0 mentionn\u00e9, le serveur Fn est un conteneur Docker, donc une fois lanc\u00e9, il ira chercher l'image dans le registre Docker.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn start -d                    # lance le serveur local en arri\u00e8re-plan\n\nImpossible de trouver l'image 'fnproject\/fnserver:latest' localement\nlatest : R\u00e9cup\u00e9ration depuis fnproject\/fnserver\nff3a5c916c92 : T\u00e9l\u00e9chargement complet\n1a649ea86bca : T\u00e9l\u00e9chargement complet\nce35f4d5f86a : T\u00e9l\u00e9chargement complet\n\n...\n\nStatut : Image plus r\u00e9cente t\u00e9l\u00e9charg\u00e9e pour fnproject\/fnserver:latest\n668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5<\/code><\/pre>\n<p><\/p>\n<p>Pour ex\u00e9cuter notre fonction, elle doit \u00eatre \u00ab d\u00e9ploy\u00e9e \u00bb. Pour cela, il faut <code>le nom de l'application<\/code>: dans Fn, toutes les applications doivent \u00eatre d\u00e9finies sous forme d'espaces de noms pour les fonctions associ\u00e9es.<\/p>\n<p><\/p>\n<p>Le CLI Fn cherchera le fichier <code>func.yaml<\/code> dans le r\u00e9pertoire actuel, qui sera utilis\u00e9 pour configurer la fonction. Donc, il faut d'abord acc\u00e9der \u00e0 notre r\u00e9pertoire <code>hellonode<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ cd hellonode\n$ fn deploy --app fnexo --local  # publie la fonction localement, le nom de l'application est fnexo.\n                                 # Le param\u00e8tre local ne t\u00e9l\u00e9charge pas l'image dans le registre distant,\n                                 # l'ex\u00e9cutant directement\n\nD\u00e9ploiement de hellonode vers l'application : fnexo\nVersion augment\u00e9e \u00e0 0.0.2\nConstruction de l'image nfrankel\/hellonode:0.0.3 .\nMise \u00e0 jour de la fonction hellonode en utilisant l'image nfrankel\/hellonode:0.0.3...\nApplication cr\u00e9\u00e9e avec succ\u00e8s :  fnexo\nFonction cr\u00e9\u00e9e avec succ\u00e8s : hellonode avec nfrankel\/hellonode:0.0.3\nD\u00e9clencheur cr\u00e9\u00e9 avec succ\u00e8s : hellonode-trigger<\/code><\/pre>\n<p><\/p>\n<p>Comme on peut le voir dans la sortie de la commande, une nouvelle image de conteneur Docker est cr\u00e9\u00e9e, contenant notre fonction. La fonction est pr\u00eate \u00e0 \u00eatre appel\u00e9e, et nous avons deux moyens de le faire :<\/p>\n<p><\/p>\n<ul>\n<li>en utilisant la commande Fn <code>invoke<\/code><\/li>\n<li>en l'appelant directement via <code>http<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>de system-nspawn <code>invoke<\/code> via Fn, cela \u00e9mule simplement le fonctionnement par HTTP pour des tests, ce qui est pratique pour une v\u00e9rification rapide :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn invoke fnexo hellonode      # appelle la fonction hellonode de l'application fnexo\n\n{\"message\":\"Hello World\"}<\/code><\/pre>\n<p><\/p>\n<p>Pour appeler la fonction directement, il faut conna\u00eetre l'URL compl\u00e8te :<\/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>Le serveur Fn fournit ses fonctions via le port 8080, et il semble que l'URL de la fonction suive le sch\u00e9ma <code>t\/app\/function<\/code>, mais pas enti\u00e8rement. Via HTTP, la fonction n'est pas appel\u00e9e directement, mais \u00e0 travers ce qu'on appelle un trigger, qui, comme son nom l'indique, \u00ab d\u00e9clenche \u00bb l'appel de la fonction. Les triggers sont d\u00e9finis dans <code>`func.yml<\/code> le projet :<\/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 du d\u00e9clencheur<\/code><\/pre>\n<p><\/p>\n<p>Nous pouvons changer le nom du d\u00e9clencheur pour qu'il corresponde au nom de la fonction, cela simplifiera tout :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">triggers:\n- name: hellonode-trigger\n  type: http\n  source: \/hellonode    # correspond au nom de la fonction<\/code><\/pre>\n<p><\/p>\n<p>Ensuite, nous relan\u00e7ons le d\u00e9ploiement de la fonction et l'appelons depuis le nouveau d\u00e9clencheur :<\/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\":\"Bonjour le monde\"}<\/code><\/pre>\n<p><\/p>\n<p>Tout fonctionne ! Il est temps de passer aux exp\u00e9riences pratiques et de publier notre FaaS sur le serveur !<\/p>\n<p><\/p>\n<h2 id=\"ustanovka-servisov-besservernyh-funkciy-na-sobstvennoy-infrastrukture\">Installation des services de fonctions sans serveur sur votre propre infrastructure<\/h2>\n<p><\/p>\n<p>Installer rapidement une machine virtuelle en utilisant l'interface en ligne de commande Exoscale. Si vous ne l'avez pas encore configur\u00e9e, vous pouvez consulter <noindex><a rel=\"nofollow\" href=\"https:\/\/community.exoscale.com\/documentation\/tools\/exoscale-command-line-interface\/\">notre guide pour un d\u00e9marrage rapide<\/a><\/noindex>. C'est un excellent outil qui augmentera encore votre productivit\u00e9. <strong>N'oubliez pas de configurer une r\u00e8gle pour ouvrir le port 8080 dans le groupe de s\u00e9curit\u00e9 !<\/strong> Les commandes suivantes lanceront une machine virtuelle propre, pr\u00eate \u00e0 h\u00e9berger nos fonctions :<\/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>Ensuite, vous pouvez vous connecter via ssh \u00e0 la machine virtuelle et installer le serveur Fn :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ exo ssh fn-server\n\nL'authenticit\u00e9 de l'h\u00f4te '185.19.30.175 (185.19.30.175)' ne peut pas \u00eatre confirm\u00e9e.\nL'empreinte de cl\u00e9 ECDSA est SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.\n\u00cates-vous s\u00fbr de vouloir continuer \u00e0 vous connecter (oui\/non) ? oui\nAvertissement : '185.19.30.175' (ECDSA) ajout\u00e9 de fa\u00e7on permanente \u00e0 la liste des h\u00f4tes connus.\nBienvenue dans Ubuntu 18.04 LTS (GNU\/Linux 4.15.0-20-generic x86_64)<\/code><\/pre>\n<p><\/p>\n<p>Ensuite, nous installons Docker et le serveur Fn de la m\u00eame mani\u00e8re que sur la machine locale, puis nous d\u00e9marrons le serveur :<\/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 est pr\u00eat \u00e0 recevoir des fonctions ! Pour transmettre des fonctions au serveur distant, nous allons utiliser la commande <code>deploy<\/code> depuis l'ordinateur local, en omettant le drapeau <code>--local<\/code>.<\/p>\n<p><\/p>\n<p>De plus, Fn n\u00e9cessite que vous sp\u00e9cifiiez l'emplacement du serveur Fn et du registre Docker. Ces param\u00e8tres peuvent \u00eatre d\u00e9finis via des variables d'environnement <code>FN_API_URL<\/code> et <code>FN_REGISTRY<\/code> respectivement, mais une m\u00e9thode encore plus pratique est propos\u00e9e pour g\u00e9rer facilement la cr\u00e9ation et la gestion des configurations de d\u00e9ploiement.<\/p>\n<p><\/p>\n<p>En termes de Fn, la configuration pour le d\u00e9ploiement est appel\u00e9e <code>context<\/code>. La commande suivante cr\u00e9era un contexte :<\/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>Vous pouvez afficher les contextes disponibles de cette mani\u00e8re :<\/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>Et pour passer au contexte qui vient d'\u00eatre cr\u00e9\u00e9, faites ainsi :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"> $ fn use context exoscale\n\n Maintenant en utilisant le contexte : exoscale<\/code><\/pre>\n<p><\/p>\n<p>\u00c0 partir de cet endroit, la livraison des fonctions Fn commencera \u00e0 charger des images Docker en utilisant le compte choisi sur DockerHub (dans mon cas \u2014 <code>nfrankel<\/code>), puis notifiera le serveur distant (dans cet exemple \u2014 <code>http:\/\/185.19.30.175:8080<\/code>) de l'emplacement et de la version de la derni\u00e8re image contenant votre fonction.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn deploy --app fnexo .   # s'ex\u00e9cute sur la machine locale depuis le r\u00e9pertoire hellonode\n\nD\u00e9ploiement de la fonction \u00e0 : \/.\nD\u00e9ploiement de hellonode dans l'application : fnexo\nVersion mise \u00e0 jour 0.0.5\nConstruction de l'image nfrankel\/hellonode:0.0.5 .<\/code><\/pre>\n<p><\/p>\n<p>Enfin :<\/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=\"Construisons notre propre serverless bas\u00e9 sur Fn\" src=\"\/wp-content\/uploads\/2019\/11\/51a7b88cd6bf4953740cfac937b0acc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Cycle de vie de la fonction dans le calcul sans serveur bas\u00e9 sur Fn<\/em><\/p>\n<p><\/p>\n<h2 id=\"preimuschestva-besservernyh-vychisleniy-na-svoih-moschnostyah\">Avantages du calcul sans serveur sur vos propres infrastructures<\/h2>\n<p><\/p>\n<p>Le calcul sans serveur est une solution pratique pour introduire rapidement des parties ind\u00e9pendantes d'une application, interagissant avec des applications plus complexes ou des microservices.<\/p>\n<p><\/p>\n<p>Cela est souvent li\u00e9 au co\u00fbt cach\u00e9 d'un engagement envers un fournisseur choisi, ce qui, selon le cas d'utilisation sp\u00e9cifique et l'\u00e9chelle, peut entra\u00eener des co\u00fbts plus \u00e9lev\u00e9s et une diminution de la flexibilit\u00e9 \u00e0 l'avenir.<\/p>\n<p><\/p>\n<p>Les architectures multi-cloud et hybrides souffrent \u00e9galement dans ce cas, car il est facile de se retrouver dans une situation o\u00f9 l'on souhaiterait utiliser le calcul sans serveur, mais en raison de la politique d'entreprise, cela peut \u00eatre impossible.<\/p>\n<p><\/p>\n<p>Fn est suffisamment simple \u00e0 utiliser, il peut offrir presque la m\u00eame interface FaaS, avec peu de frais. Il lib\u00e8re de tout engagement vis-\u00e0-vis d'un fournisseur, pouvant \u00eatre install\u00e9 localement ou chez n'importe quel fournisseur de solutions cloud de votre choix. De plus, il offre la libert\u00e9 de choisir le langage de programmation.<\/p>\n<p><\/p>\n<p>L'article pr\u00e9sente seulement les bases de Fn, mais cr\u00e9er votre propre environnement d'ex\u00e9cution est assez simple, et l'architecture globale peut \u00eatre \u00e9tendue en utilisant un r\u00e9partiteur de charge Fn, ou en pla\u00e7ant Fn derri\u00e8re un proxy pour protection.<\/p>\n<p>Source : <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.2 - 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\/fr\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Construire notre propre serverless bas\u00e9 sur Fn | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/52562","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=52562"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/52562\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=52562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=52562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=52562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}