avril 12, 2021

Tuto: Ma première Azure function (3/3)

Description de l’Azure Function

index.js

Contient le code exécuté lorsqu’un fichier est déposé. C’est ici que nous allons récupérer le contenu du fichier, l’analyser et enfin envoyer un e-mail.

Voici le code basique d’une Azure Function qui a pour trigger un blob storage :

module.exports = async function (context, myBlob) {
    context.log("JavaScript blob trigger function processed blob \n Blob:", context.bindingData.blobTrigger, "\n Blob Size:", myBlob.length, "Bytes");
};

Une function en Javascript s’exécute sur Node.js, c’est pour cela que vous retrouvez « module.exports = async function (…) ».


Le premier argument est et sera toujours l’objet « context« . Il récupère les données des input et output binding, permet de « loguer » des informations (comme on peut le voir dans le code plus haut).
Nous pouvons par exemple récupérer le nom du fichier qui vient d’être déposé. Il suffit d’utiliser le nom que l’on a renseigné dans le path (nous avons utilisé text-files/{name}).

context.log(context.bindingData.name);
// Output => test.txt

Le deuxième argument ici est « myBlob », qui est le « stream » de notre fichier. Si l’on souhaite accéder au contenu de notre fichier texte, nous pouvons utiliser la ligne suivante :

context.log(myBlob.toString());
// Output (contenu du fichier) => BONJOUR

Note : il y a plusieurs façon de récupérer les inputs bindings. Il est recommandé par Microsoft de les récupérer via les paramètres de votre fonction comme dans le code basique en premier exemple de cet article.

// RECOMMANDÉ
module.exports = async function (context, myBlob) {
    // myBlob est l'input binding correspondant à notre blob   
};
module.exports = async function (context) {
    context.bindings.myBlob
};

function.json

Ce fichier est accessible dans la liste déroulante.

Il est utilisé pour configurer les bindings. Voici ce que nous pouvons trouver dans notre fichier pour le moment :

{
  "bindings": [
    {
      "name": "myBlob",
      "type": "blobTrigger",
      "direction": "in",
      "path": "text-files/{name}",
      "connection": "sagwfblog_STORAGE"
    }
  ]
}

Nous retrouvons la configuration de notre blobTrigger. C’est également ici que nous allons renseigner la configuration pour Sendgrid !

Implémentation de la solution

Nous sommes arrivé à un stade où ce schéma devrait être totalement clair pour vous avec l’explication ci-dessus et le test que nous avons fait ensemble dans l’article précédent.

On se rend compte qu’en réalité, il ne nous reste pas grand chose à faire… Concrètement, il ne nous reste plus qu’à vérifier que le fichier contient bien « BONJOUR », configurer l’output binding et envoyer un e-mail !

C’est là où l’on se rend compte de l’intérêt d’une Azure Function, il y a déjà énormément de choses faites et on se concentre sur notre « logique métier ». On gagne vraiment du temps de développement. Bien que cela requiert de la configuration en amont, c’est vrai…

Configurer l’output binding

Dans le portail, toujours dans notre function, cliquez sur « Integration » dans le menu de gauche. Nous avons ici la représentation complète. Le trigger (accompagné de myBlob) qui va activer la function pour enfin aller vers « outputs ». Cliquez sur « Add output ».

Renseignez les informations nécessaires. Pour la clé d’API, il est nécessaire de créer un nouveau paramètre en cliquant sur « new ». Renseignez un nom (j’ai choisi « sgketbernardbonjour » dans mon exemple) et renseignez la clé d’API que nous avons généré dans l’article précédent.

Pour l’adresse de l’expéditeur, il est nécessaire de renseigner l’adresse e-mail que vous avez renseigné lorsque vous avez créé le sender sur le site de sendgrid.

Une fois que tout est renseigné comme il le faut, cliquez sur ok. Retournez dans le fichier function.json et constatez que l’output binding a été ajouté !

Entendu que nous avons un seul output binding et que notre function est async, il est nécessaire de changer le « name »: »message » en « name »: »$return ».

Lorsque l’on créer notre azure function, nous utilisons la dernière version du runtime. Ici, je suis en version du runtime 3. Depuis la version 2 du runtime, on peut faire directement un « return » d’un objet. Avant, il était nécessaire de faire appel au callback contexte.done pour signaler que l’on avait terminé. N’hésitez pas à consulter la documentation à ce sujet.

Pour connaitre la version du runtime que vous exécutez (voir capture ci-après), allez dans votre function app > configuration > Function runtime settings

https://docs.microsoft.com/fr-fr/azure/azure-functions/functions-reference-node?tabs=v2#exporting-an-async-function

Modifions maintenant le code pour qu’il s’adapte à notre besoin. Comme vu dans la présentation de index.js, nous savons récupérer le contenu du fichier texte. Il suffit de faire myBlob.toString(). Il suffit maintenant de vérifier que sa valeur est bien égale à « BONJOUR ».

Concernant l’envoi de l’email, nous avons déjà préconfiguré l’objet du mail et l’adresse (le sender) qui va envoyer l’e-mail. Il ne nous reste plus qu’à configurer le destinataire et le contenu du message. Cette fois-ci nous allons le faire dans le code. Pour savoir comment faire, regardons l’exemple de la documentation de Microsoft.

Voici le code final :

module.exports = async function (context, myBlob) {
    context.log(`Contenu du fichier : ${ myBlob.toString() }`);

    const msg = { "personalizations": [ { "to": [ { "email": "gw.flamant@gmail.com" } ] } ] }
    let content = "";
    if(myBlob.toString() ==="BONJOUR") {
        content = "Il a dit bonjour";
    } else {
        content = "Il n'a pas dit bonjour..."
    }

    msg.content = [{
        type: 'text/plain',
        value: content
    }]

    return msg;
};

Je modifie le code et le sauvegarde. C’est l’heure du test.
J’ai deux fichiers nommés test1.txt et test2.txt. L’un contient « BONJOUR » et l’autre « AU REVOIR ». Verdict …

Verdict du test

C’est concluant ! J’ai bien reçu deux e-mails différents. Parfait, Bernard va pouvoir être peinard. Il va pouvoir se consacrer à d’autres tâches !

Bravo, vous savez maintenant comment fonctionne une azure function ! Cela dit, il vous reste pas mal de contenu à explorer. Il existe de nombreux bindings et plusieurs options à découvrir, comme la gestion de la sécurité (qui est autorisé à appeler votre fonction etc…) !

J’espère que ce tutoriel vous aura été utile ! N’hésitez pas à le partager si vous pensez que ça peut aider. Vous pouvez également me faire un retour en commentaire ou via LinkedIn !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *