Oui, vous ne rêvez pas. Nous allons parler aujourd’hui de Microsoft Azure. Et plus particulièrement du service Azure Functions qui permet d’exécuter du code. Les fonctions Azure peuvent être déclenchées sur réception d’un événement Azure (Blob Storage, Table Storage, Azure DocumentDB, Bot Framework, ordonnanceur, HTTP, …) ou externe (Box, DropBox, OneDrive, SendGrid, …). Actuellement, les langages supportés sont le C#, F# et Javascript.

Comme nous sommes sur des outils Microsoft, nous allons utiliser les interfaces graphiques fournies. Mais il faut savoir qu’il existe une CLI pour créer et configurer les Azure Functions1.

Implémentation

Pour ce premier essai, nous allons reprendre l’exemple très simple qui avait été mis en place avec AWS Lambda et l’API Gateway. Le fichier index.js ci-dessous contient un exemple d’implémentation Javascript d’une fonction Azure :

module.exports = function (context, req) {
  context.log('Received event:', JSON.stringify(req, null, 2));
  context.done(null, '{"message" : "Hello ' + req.body.name + '"}');
};

Configuration

L’un des avantages d’Azure Functions est la facilité avec laquelle il est possible d’exposer la fonction en HTTP. La configuration se fait dans un fichier function.json comme ci-dessous :

{
  "disabled": false,
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "post"
      ],
      "route": "hello"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}

API Key

Les clés d’API sont configurables dans la section “Keys”. Ensuite, il faut fournir la clé soit en paramètre HTTP avec code ou en entête HTTP avec x-functions-key.

CORS

Le CORS est activable via le bouton “Configure CORS” dans l’onglet “Function App Settings”.

Exécution

Il est possible d’exécuter la fonction en cliquant sur “Run” ou bien de l’appeler via un client HTTP tel que curl :

$ curl -i -H "Content-Type: application/json" -H "x-functions-key: 89920c10b4727161081f5e1080c0d5b89a
cc40a3" -X POST -d '{"name": "me"}' "https://Functions7b37f01a.azurewebsites.net/api/hello"
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 22
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=9a28df4e8732651f926ff1f8e018c2be8bdfe44607507ecf185443817380ff08;Path=/;Domain=Functions7b37f01a.azurewebsites.net
Date: Sun, 05 Feb 2017 22:53:02 GMT

{"message":"Hello me"}

Les traces applicatives sont visibles dans la section “Logs” :

2017-02-05T22:53:02.469 Function started (Id=a33202a9-ffa6-4892-a13d-b4401ea5577b)

2017-02-05T22:53:02.484 Received event: {
  "originalUrl": "https://functions7b37f01a.azurewebsites.net/api/hello",
  "method": "POST",
  "query": {},
  "headers": {
    "connection": "Keep-Alive",
    "accept": "*/*",
    "host": "Functions7b37f01a.azurewebsites.net",
    "max-forwards": "10",
    "user-agent": "curl/7.44.0",
    "x-functions-key": "89920c10b4727161081f5e1080c0d5b89acc40a3",
    "x-liveupgrade": "1",
    "x-original-url": "/api/hello",
    "x-arr-log-id": "f190a674-d88a-4f06-9480-1892551d8278",
    "disguised-host": "Functions7b37f01a.azurewebsites.net",
    "x-site-deployment-id": "Functions7b37f01a",
    "was-default-hostname": "functions7b37f01a.azurewebsites.net",
    "x-forwarded-for": "82.242.139.38:52343",
    "x-arr-ssl": "2048|256|C=US, S=Washington, L=Redmond, O=Microsoft Corporation, OU=Microsoft IT, CN=Microsoft IT SSL SHA2|CN=*.azurewebsites.net"
  },
  "body": {
    "name": "me"
  },
  "params": {},
  "rawBody": "{\"name\": \"me\"}"
}

2017-02-05T22:53:02.484 Function completed (Success, Id=a33202a9-ffa6-4892-a13d-b4401ea5577b)

Conclusion

L’écriture du code des Azure Functions est assez classique pour du Function as a Service. Les sources d’événements déclencheurs n’ont pas été explorées ici mais on peut voir qu’elles sont très variées.

La console Azure Functions est vraiment très pratique (malgré quelques soucis de rafraichissement sur les endpoints). Le code des fonctions est éditable directement dans le navigateur avec de l’auto-complétion. De plus, il est possible de voir sur un seul et même écran : le code de la fonction, le client de test et les traces applicatives. Ce qui peut se révéler très pratique.

Enfin, le plus grand atout d’Azure Functions est la simplicité avec laquelle il est possible d’exposer en HTTP ses fonctions. L’implémentation d’un webhook serverless devient alors un jeu d’enfant !

  1. https://blogs.msdn.microsoft.com/appserviceteam/2016/12/01/running-azure-functions-locally-with-the-cli/