Appeler un programme externe depuis une Azure Function
Les Azure Functions sont des fonctions hébergées dans le "cloud" et qui offrent la possibilité aux développeurs d'être invoquées (et donc consommées) uniquement à la demande.
Elles permettent de faire tout ce que vous pourriez vouloir faire avec une méthode classique : utiliser une librairie de désérialisation JSON, appeler une API, etc. Il est donc normal de se dire que l'on pourrait également appeler un programme externe (tel que FFMPEG par exemple, qui permet le traitement de vidéos).
La première chose à faire, pour que cela fonctionne, est d'ajouter votre exécutable à votre solution afin de faire en sorte que celui-ci soit déployé en même temps que votre fonction:
Ensuite, vous pouvez écrire le reste de votre programme de manière traditionnelle. En effet, pour appeler un programme tiers depuis du code C#, il convient d'utiliser les classe Process et ProcessStartInfo :
string FfMpegProcessName = "ffmpeg.exe"; var ffmpegProcessStartInfo = new ProcessStartInfo(); ffmpegProcessStartInfo.Arguments = "-y -i " + copyFileName + " -vf hflip " + transformedFileName; ffmpegProcessStartInfo.CreateNoWindow = true; ffmpegProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden; ffmpegProcessStartInfo.UseShellExecute = false; ffmpegProcessStartInfo.RedirectStandardOutput = true; ffmpegProcessStartInfo.RedirectStandardError = true; Process.Start(ffmpegProcessStartInfo);
Ce type de code est commun et ne présente pas de difficultés particulières. Cependant, il manque l'indication du nom (et surtout de l'emplacement) de l'exécutable à appeler. Sur une application .NET traditionnelle, on récupèrerait l'emplacement de l'application appelante via une combinaison de GetDirectoryName, Assembly.GetExecutingAssembly().Location et autres joyeusetés.
Mais là, notre code s'exécute dans une Azure Function donc nous devons trouver un moyen d'accéder à cette information. Et c'est la classe ExecutionContext, que vous allez pouvoir injecter dans la signature de votre fonction, qui va vous indiquer ce que vous voulez savoir :
public static async Task HorizontalFlipVideo([BlobTrigger("videosuploaded/{blobName}")]Stream blobContent, string blobName, Microsoft.Azure.WebJobs.ExecutionContext context, TraceWriter log)
Cette classe expose différentes propriétés concernant votre Azure Function :
- InvocationId: Fournit l'identifiant unique de l'invocation de votre fonction
- FunctionName: Retourne le nom de la fonction
- FunctionDirectory: Retourne le nom du répertoire de la fonction courante (par exemple d:\home\site\wwwroot\HttpTrigger1)
- FunctionAppDirectory: Retourne le nom du répertoire racine de la fonction (par exemple d:\home\site\wwwroot)
A partir de là, il devient très simple d'adapter notre code pour indiquer l'emplacement de l'exécutable externe a appeler :
ffmpegProcessStartInfo.FileName = string.Concat(context.FunctionAppDirectory, "/", FfMpegProcessName);
Et le tour est joué!
Happy coding! :)
Commentaires