Dans l’univers des Function as a Service, il existe un fournisseur qui commence à être connu. Il se nomme auth0 et propose sa propre solution d’exécution de fonction : Webtask.

Très orienté webhook, ce service offre quelques fonctionnalités intéressantes et la mise en œuvre semble plutôt simple. Les langages supportés sont Node.js, Express et C#. Reprenons l’exemple simple utilisé pour découvrir Serverless Framework.

Installation

L’installation du Webtask CLI nécessite NPM et s’exécute avec la ligne de commande suivante :

$ npm install wt-cli -g

Dans un premier temps, il faut initialiser Webtask CLI afin d’activer son environnement d’exécution distant (via un code transmis par mail ou SMS) :

$ wt init pnom@company.com
Please enter the verification code we sent to pnom@company.com below.
Verification code: 123654
Welcome to webtasks! Create your first one as follows:

$ echo "module.exports = function (cb) { cb(null, 'Hello'); }" > hello.js
$ wt create hello.js

Une fois déployée, la fonction est éditable en ligne. Pour connaitre l’URL d’édition de la fonction, il faut exécuter la commande suivante :

$ wt edit hello
Attempting to open the following url in your browser:

https://webtask.it.auth0.com/edit/wt-host-id-0#/hello/...

Implémentation

Au lieu de prendre l’exemple proposé, nous allons reprendre notre précédent exemple en l’adaptant au prototype de Webtask que nous allons mettre dans un fichier hello.js :

console.log('Loading function');

module.exports = function (context, callback) {
  console.log('Received event:', JSON.stringify(context, null, 2));
  callback(null, 'Hello');
};

Déploiement

Le déploiement se fait en une seule ligne de commande et sans fichier de configuration :

$ wt create hello.js
Webtask created

You can access your webtask at the following url:

https://wt-host-id-0.run.webtask.io/hello

La fonction est déployée et exposée via un endpoint HTTP (ici host-id remplace l’identifiant de l’hôte de notre environnement).

Exécution

Pour exécuter la fonction, il est donc nécessaire d’utiliser votre client HTTP préféré. Voici un exemple avec curl :

$ curl -i https://wt-host-id-0.run.webtask.io/hello
HTTP/1.1 200 OK
x-auth0-proxy-stats: {"proxy_host":"172.31.200.42","proxy_pid":28,"container_id":"8624ced6-9b59-41f9-8258-c9ee88ff9fbb","latency":52,"uptime":449193.942,"memory":{"rss":110329856,"heapTotal":71334240,"heapUsed":68038808},"req_id":"1486510226315.15966"}
content-type: application/json
x-wt-response-source: webtask
x-auth0-stats: {"worker_pid":1,"response":{"200":1},"time":36,"uptime":78.386,"memory":{"rss":38936576,"heapTotal":19779936,"heapUsed":12368992}}
date: Tue, 07 Feb 2017 23:30:26 GMT
transfer-encoding: chunked
Connection: keep-alive

"Hello"

Il est possible d’afficher en temps réel les logs de la fonction avec la commande ci-dessous :

$ wt logs
[23:30:26.443Z]  INFO wt: new webtask request 1486510226315.15966
[23:30:26.483Z]  INFO wt: Loading function
[23:30:26.488Z]  INFO wt:
    Received event: {
      "data": {},
      "params": {},
      "query": {},
      "secrets": {},
      "headers": {
        "host": "wt-host-id-0.run.webtask.io",
        "user-agent": "curl/7.44.0",
        "accept": "*/*",
        "accept-version": "2.0.0",
        "x-wt-params": "...",
        "x-forwarded-for": "::ffff:172.31.20.161",
        "x-forwarded-proto": "https",
        "x-forwarded-port": "8721",
        "connection": "close"
      },
      "token": "...",
      "id": "1486510226315.15966",
      "storage": {}
    }
[23:30:26.490Z]  INFO wt: finished webtask request 1486510226315.15966 with HTTP 200 in 52ms

Nettoyage

A priori, il n’y a pas d’accès aux logs. Il est simplement possible de supprimer la fonction de cette façon :

$ wt rm hello
Removed webtask: hello

Conclusion

Ce qui saute aux yeux avec Webtask, c’est sa simplicité d’utilisation. Avec une simple ligne de commande, il est possible d’exposer en HTTP une Webtask. L’éditeur de code est plutôt bien réalisé. Il propose l’auto-complétion et la validation syntaxique. Un client HTTP est également intégré.
Webtask possède de nombreuses fonctionnalités intéressante comme l’exécution en local, le stockage de données (un seul document de 500Ko maximum), un ordonnanceur, un bac à sable pour exécuter du code dynamique, …
Le dernier point fort de ce service est son intégration avec le service d’authentification auth0.

Il est regrettable de ne pas pouvoir consulter les logs à posteriori. Les Webtask peuvent implémenter 3 interfaces différentes, ce qui peut se révéler un peu perturbant au départ. De plus, il n’y a aucune notion d’événement. D’ailleurs, Webtask se revendique comme un service d’exécution de fonction synchrone contrairement à toutes les autres alternatives qui sont généralement asynchrones. Ceci afin d’obtenir des latences plus réduites.
De même, les webstasks sont toujours exécutées dans le même containeur. Il est donc possible de réutiliser des ressources telles qu’un pool de connexion. Très pratique, cette fonctionnalit” semble contraire au caractère multi-tenant et stateless de ce genre de service…
Dernier point négatif : je n’ai pas réussi à récupérer le payload d’un POST. Et la documentation n’est pas complète sur ces fonctionnalités.

Même si cette solution présente quelques défauts, certaines fonctionnalités méritent de s’y attarder. En première approche, Webtask donne l’impression d’être orienté webhook et être une solution d’intégration de auth0 avec d’autres API.