Construisons notre propre serverless basé sur Fn

Construisons notre propre serverless basé sur Fn

Calculs sans serveur — 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Ă©occupation non pas des DevOps, mais du fournisseur de services. La montĂ©e en charge des ressources s'ajuste automatiquement Ă  la demande et offre une grande rapiditĂ© de changement.

Une autre caractéristique commune est la tendance à la minimisation et à la concentration du code, c'est pourquoi le calcul sans serveur est parfois appelé « fonction comme service » (FaaS).

Historiquement, le premier fournisseur de services cloud Ă  proposer le FaaS avec AWS Lambda Ă©tait Amazon, d'oĂč vient ce nom. D'autres fournisseurs de cloud proposent Ă©galement des analogues :

  • Cloud Functions de Google
  • Azure Functions de Microsoft

Toutes ces entreprises fournissent des calculs sans serveur, une montĂ©e en charge automatique et ne facturent que les ressources effectivement utilisĂ©es, tout en liant les clients Ă  leur produit propriĂ©taire. Cependant, il existe des alternatives gratuites et open source pour organiser des calculs sans serveur. À noter :

  • La plateforme Apache OpenWhisk, dĂ©veloppĂ©e dans l'incubateur par IBM,
  • Spring Cloud Functions, comme partie d'un Ă©cosystĂšme assez riche du Spring Framework, qui peut Ă©galement ĂȘtre utilisĂ© comme façade pour AWS Lambda, Azure Functions et OpenWhisk,
  • Le projet Fn, soutenu par Oracle.

Tous sont complĂštement indĂ©pendants du cloud, c'est-Ă -dire qu'ils peuvent ĂȘtre installĂ©s dans n'importe quel cloud, y compris le vĂŽtre, public ou privĂ©, et bien sĂ»r dans Exoscale.

Comment le projet Fn est structuré

Fn est entiÚrement construit sur Docker, composé de deux composants principaux :

  • Une interface en ligne de commande (CLI) conçue pour gĂ©rer tous les aspects de l'infrastructure Fn et interagir avec le serveur Fn,
  • Le serveur Fn lui-mĂȘme, une application classique emballĂ©e dans un conteneur Docker.

Les fonctions déployées dans Fn s'exécutent également dans des conteneurs séparés, ce qui permet de supporter de nombreux langages de programmation, par exemple
 Clojure !

Les arguments des fonctions sont transmis via l'entrĂ©e standard (STDIN), et les rĂ©sultats sont Ă©crits sur la sortie standard (STDOUT). Si les arguments ou les valeurs retournĂ©es ne sont pas des valeurs simples (par exemple, un objet JSON), ils peuvent ĂȘtre transformĂ©s Ă  l'aide de la couche d'abstraction fournie par Fn sous la forme d'un kit de dĂ©veloppement de fonctions (FDK).

Pour plus de commodité, des ensembles de modÚles intégrés sont proposés, facilitant le déploiement de FaaS sur une large liste de langages différents et leurs versions (Go, plusieurs versions de Java, Python, etc.).

Créer un FaaS est simple, en suivant ce schéma :

  • Nous dĂ©ployons la fonction Ă  l'aide de la CLI Fn : un fichier de configuration d'application pour Fn est créé, basĂ© sur le modĂšle choisi.
  • Nous dĂ©ployons notre propre fonction, encore une fois avec la CLI Fn : l'image du conteneur est placĂ©e dans un certain dĂ©pĂŽt, aprĂšs quoi le serveur est informĂ© de l'existence et de l'emplacement de cette image.

Construisons notre propre serverless basé sur Fn
Le principe de livraison des fonctions dans Fn

Installation locale et test des fonctions serverless

Commençons par installer Fn sur la machine locale. D'abord, Docker est installé, comme l'exige Fn. On suppose que nous sommes sous Debian/Ubuntu :

$ sudo apt-get update
$ sudo apt-get install docker.io

Ou utilisez le gestionnaire de paquets ou la version de Docker appropriée pour votre systÚme. Ensuite, nous pouvons passer directement à l'installation de la CLI Fn. Par exemple, avec curl :

$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh

Si vous travaillez sur OSX avec Homebrew installé, vous pouvez prendre une autre voie :

$ brew install fn

==> Downloading https://homebrew.bintray.com/bottles/fn-0.5.8.high_sierra.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/b1/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb
######################################################################## 100.0%
==> Pouring fn-0.5.8.high_sierra.bottle.tar.gz
  /usr/local/Cellar/fn/0.5.8: 5 files, 16.7MB

Tout est maintenant prĂȘt pour le dĂ©ploiement initial de notre fonction en utilisant la CLI. Pour simplifier, nous allons utiliser l'environnement intĂ©grĂ©, par exemple Node :

$ fn init --runtime node --trigger http hellonode

Création de la fonction à : /hellonode
ModÚle de fonction généré.
func.yaml créé.

Un nouveau rĂ©pertoire sera créé hellonode pour le dĂ©veloppement ultĂ©rieur de notre fonction Fn avec quelques fichiers de configuration essentiels. À l'intĂ©rieur du rĂ©pertoire nouvellement créé, vous pouvez crĂ©er votre application en respectant les normes du langage ou de l'environnement d'exĂ©cution que vous avez choisi :

# ĐšĐ°Ń‚Đ°Đ»ĐŸĐł с node ĐČŃ‹ĐłĐ»ŃĐŽĐžŃ‚ таĐș:

   hellonode
   ├── func.js
   ├── func.yaml
   └── package.json

# ĐĄĐČĐ”Đ¶Đ”ŃƒŃŃ‚Đ°ĐœĐŸĐČĐ»Đ”ĐœĐœĐŸĐ” ĐŸĐșŃ€ŃƒĐ¶Đ”ĐœĐžĐ” Java11 таĐșĐŸĐ”:

   hellojava11
   ├── func.yaml
   ├── pom.xml
   └── src
       ├── main
       │   └── java
       │       └── com
       │           └── example
       │               └── fn
       │                   └── HelloFunction.java
       └── test
           └── java
               └── com
                   └── example
                       └── fn
                           └── HelloFunctionTest.java

Fn crée la structure initiale du projet, crée le fichier func.yaml, contenant les configurations nécessaires pour Fn, et met en place un modÚle pour le code dans le langage que vous avez choisi.

Dans le cas de l'environnement d'exécution Node, cela signifie :

$ cat hellonode/func.js

const fdk=require('@fnproject/fdk');

fdk.handle(function(input){
  let name = 'World';
  if (input.name) {
    name = input.name;
  }
  return {'message': 'Hello ' + name}
})

Nous allons maintenant tester rapidement notre fonction localement pour voir comment tout fonctionne.

Pour commencer, nous allons lancer le serveur Fn. Comme déjà mentionné, le serveur Fn est un conteneur Docker, donc une fois lancé, il ira chercher l'image dans le registre Docker.

$ fn start -d                    # lance le serveur local en arriĂšre-plan

Impossible de trouver l'image 'fnproject/fnserver:latest' localement
latest : Récupération depuis fnproject/fnserver
ff3a5c916c92 : Téléchargement complet
1a649ea86bca : Téléchargement complet
ce35f4d5f86a : Téléchargement complet

...

Statut : Image plus récente téléchargée pour fnproject/fnserver:latest
668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5

Pour dĂ©ployer notre fonction, elle doit ĂȘtre « publiĂ©e ». Cela nĂ©cessite le nom de l'application: dans Fn, toutes les applications doivent ĂȘtre dĂ©finies sous forme d'espaces de noms pour les fonctions associĂ©es.

Le CLI Fn cherchera le fichier func.yaml dans le répertoire actuel, qui sera utilisé pour configurer la fonction. Donc, il faut d'abord accéder à notre répertoire hellonode.

$ cd hellonode
$ fn deploy --app fnexo --local  # publie la fonction localement, le nom de l'application est fnexo.
                                 # Le paramÚtre local ne télécharge pas l'image dans le registre distant,
                                 # l'exécutant directement

Déploiement de hellonode vers l'application : fnexo
Version augmentée à 0.0.2
Construction de l'image nfrankel/hellonode:0.0.3 .
Mise Ă  jour de la fonction hellonode en utilisant l'image nfrankel/hellonode:0.0.3...
Application créée avec succÚs :  fnexo
Fonction créée avec succÚs : hellonode avec nfrankel/hellonode:0.0.3
Déclencheur créé avec succÚs : hellonode-trigger

Comme on peut le voir dans la sortie de la commande, une nouvelle image de conteneur Docker est créée, contenant notre fonction. La fonction est prĂȘte Ă  ĂȘtre appelĂ©e, et nous avons deux moyens de le faire :

  • en utilisant la commande Fn invoke
  • en l'appelant directement via http

de system-nspawn invoke via Fn, cela émule simplement le fonctionnement par HTTP pour des tests, ce qui est pratique pour une vérification rapide :

$ fn invoke fnexo hellonode      # appelle la fonction hellonode de l'application fnexo

{"message":"Hello World"}

Pour appeler la fonction directement, il faut connaĂźtre l'URL complĂšte :

$ curl http://localhost:8080/t/fnexo/hellonode-trigger

{"message":"Hello World"}

Le serveur Fn fournit ses fonctions via le port 8080, et il semble que l'URL de la fonction suive le schéma t/app/function, mais pas complÚtement. Par HTTP, la fonction n'est pas appelée directement, mais via ce qu'on appelle un déclencheur, qui, comme son nom l'indique, « déclenche » l'appel de la fonction. Les déclencheurs sont définis dans `func.yml le projet :

schema_version: 20180708
name: hellonode
version: 0.0.3
runtime: node
entrypoint: node func.js
format: json
triggers:
- name: hellonode-trigger
  type: http
  source: /hellonode-trigger    # URL du déclencheur

Nous pouvons changer le nom du déclencheur pour qu'il corresponde au nom de la fonction, cela simplifiera tout :

triggers:
- name: hellonode-trigger
  type: http
  source: /hellonode    # correspond au nom de la fonction

Ensuite, nous relançons le déploiement de la fonction et l'appelons depuis le nouveau déclencheur :

$ fn deploy --app fnexo hellonode --local
$ curl http://localhost:8080/t/fnexo/hellonode

{"message":"Bonjour le monde"}

Tout fonctionne ! Il est temps de passer aux expériences pratiques et de publier notre FaaS sur le serveur !

Installation des services de fonctions sans serveur sur votre propre infrastructure

Installer rapidement une machine virtuelle en utilisant l'interface en ligne de commande Exoscale. Si vous ne l'avez pas encore configurĂ©e, vous pouvez consulter notre guide pour un dĂ©marrage rapide. C'est un excellent outil qui augmentera encore votre productivitĂ©. N'oubliez pas de configurer une rĂšgle pour ouvrir le port 8080 dans le groupe de sĂ©curitĂ© ! Les commandes suivantes lanceront une machine virtuelle propre, prĂȘte Ă  hĂ©berger nos fonctions :

$ exo firewall create fn-securitygroup
$ exo firewall add fn-securitygroup ssh --my-ip
$ exo firewall add fn-securitygroup -p tcp -P 8080-8080 -c 0.0.0.0/0
$ exo vm create fn-server -s fn-securitygroup

Ensuite, vous pouvez vous connecter via ssh Ă  la machine virtuelle et installer le serveur Fn :

$ exo ssh fn-server

L'authenticitĂ© de l'hĂŽte '185.19.30.175 (185.19.30.175)' ne peut pas ĂȘtre confirmĂ©e.
L'empreinte de clé ECDSA est SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.
Êtes-vous sĂ»r de vouloir continuer Ă  vous connecter (oui/non) ? oui
Avertissement : '185.19.30.175' (ECDSA) ajouté de façon permanente à la liste des hÎtes connus.
Bienvenue dans Ubuntu 18.04 LTS (GNU/Linux 4.15.0-20-generic x86_64)

Ensuite, nous installons Docker et le serveur Fn de la mĂȘme maniĂšre que sur la machine locale, puis nous dĂ©marrons le serveur :

$ sudo apt-get update
$ sudo apt-get install docker.io
$ sudo systemctl start docker
$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh
$ sudo fn start

...

    ______
   / ____/___
  / /_  / __ 
 / __/ / / / / /
/_/   /_/ /_/
    v0.3.643

Fn est prĂȘt Ă  recevoir des fonctions ! Pour transmettre des fonctions au serveur distant, nous allons utiliser la commande deploy depuis l'ordinateur local, en omettant le drapeau --local.

De plus, Fn nĂ©cessite que vous spĂ©cifiiez l'emplacement du serveur Fn et du registre Docker. Ces paramĂštres peuvent ĂȘtre dĂ©finis via des variables d'environnement FN_API_URL et FN_REGISTRY respectivement, mais une mĂ©thode encore plus pratique est proposĂ©e pour gĂ©rer facilement la crĂ©ation et la gestion des configurations de dĂ©ploiement.

En termes de Fn, la configuration pour le déploiement est appelée context. La commande suivante créera un contexte :

$ fn create context exoscale --provider default --api-url http://185.19.30.175:8080 --registry nfrankel

Vous pouvez afficher les contextes disponibles de cette maniĂšre :

$ fn list contexts

CURRENT NAME      PROVIDER      API URL                      REGISTRY
    default       default       http://localhost:8080/
    exoscale      default       http://185.19.30.175:8080    nfrankel

Et pour passer au contexte qui vient d'ĂȘtre créé, faites ainsi :

 $ fn use context exoscale

 Maintenant en utilisant le contexte : exoscale

À partir de cet endroit, la livraison des fonctions Fn commencera à charger des images Docker en utilisant le compte choisi sur DockerHub (dans mon cas — nfrankel), puis notifiera le serveur distant (dans cet exemple — http://185.19.30.175:8080) de l'emplacement et de la version de la derniùre image contenant votre fonction.

$ fn deploy --app fnexo .   # s'exécute sur la machine locale depuis le répertoire hellonode

Déploiement de la fonction à : /.
Déploiement de hellonode dans l'application : fnexo
Version mise Ă  jour 0.0.5
Construction de l'image nfrankel/hellonode:0.0.5 .

Enfin :

$ curl http://185.19.30.175:8080/t/fnexo/hellonode

{"message":"Hello World"}

Construisons notre propre serverless basé sur Fn
Cycle de vie de la fonction dans le calcul sans serveur basé sur Fn

Avantages du calcul sans serveur sur vos propres infrastructures

Le calcul sans serveur est une solution pratique pour introduire rapidement des parties indépendantes d'une application, interagissant avec des applications plus complexes ou des microservices.

Cela est souvent lié au coût caché d'un engagement envers un fournisseur choisi, ce qui, selon le cas d'utilisation spécifique et l'échelle, peut entraßner des coûts plus élevés et une diminution de la flexibilité à l'avenir.

Les architectures multi-cloud et hybrides souffrent Ă©galement dans ce cas, car il est facile de se retrouver dans une situation oĂč l'on souhaiterait utiliser le calcul sans serveur, mais en raison de la politique d'entreprise, cela peut ĂȘtre impossible.

Fn est suffisamment simple Ă  utiliser, il peut offrir presque la mĂȘme interface FaaS, avec peu de frais. Il libĂšre de tout engagement vis-Ă -vis d'un fournisseur, pouvant ĂȘtre installĂ© localement ou chez n'importe quel fournisseur de solutions cloud de votre choix. De plus, il offre la libertĂ© de choisir le langage de programmation.

L'article prĂ©sente seulement les bases de Fn, mais crĂ©er votre propre environnement d'exĂ©cution est assez simple, et l'architecture globale peut ĂȘtre Ă©tendue en utilisant un rĂ©partiteur de charge Fn, ou en plaçant Fn derriĂšre un proxy pour protection.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster