Introduction
Go est souvent considéré comme un langage de seconde zone pour créer des fonctions sur Azure. Malgré cela, c’est simple de créer des fonctions déclenchées via HTTP. En revanche, créer une fonction déclenchée par un Timer en Go n’est pas aussi évident. Cet article montre comment y parvenir.
Création de la fonction Azure
Il nous faut initier le projet
func init go-cron --worker-runtime custom
Nous génèrons ensuite la fonction du nom de demo en précisant qu’elle sera déclenchée par un TimerTrigger
cd go-cron
func function new -l Custom -t TimerTrigger -n demo
Rajoutons le code Go dans le dossier script
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("Hello cron run at: ", time.Now())
}
Compilons le code Go pour démarrer la fonction en local
go build -o script/cron script/cron.go
Configuration de la function Azure
Nous ajoutons la clé “scriptFile” avec comme valeur le chemin relatif de l’exécutable de votre code Go dans le fichier demo/function.json.
{
"scriptFile": "../script/cron",
"bindings": [
{
"name": "myTimer",
"type": "timerTrigger",
"direction": "in",
"schedule": "*/10 * * * * *"
}
]
}
Dans cette configuration le script cron sera appelée toutes les 10 secondes. Mettez à jour le champ schedule selon vos besoins. Nous mettons à jour la valeur de defaultExecutablePath dans host.json
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
}
},
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[3.*, 4.0.0)"
},
"customHandler": {
"description": {
"defaultExecutablePath": "script/cron",
"workingDirectory": "",
"arguments": []
}
}
}
Nous pouvons lancer la fonction puis vérifier si elle est appelée de façon périodique.
func start
[2024-02-22T14:13:33.116Z] Hello cron run at: 2024-02-22 15:13:33.106465 +0100 CET m=+0.001005376
[2024-02-22T14:13:33.147Z] The listener for function 'Functions.demo' was unable to start.
[2024-02-22T14:13:33.147Z] The listener for function 'Functions.demo' was unable to start. Microsoft.Azure.WebJobs.Extensions.Timers.Storage: Could not create BlobContainerClient for ScheduleMonitor.
Functions:
demo: timerTrigger
For detailed output, run func with --verbose flag.
[2024-02-22T14:13:37.795Z] Host lock lease acquired by instance ID '0000000000000000000000001ACC75A4'.
[2024-02-22T14:14:10.175Z] Failed to start http worker process. workerId:d1829fe9-5fdd-4b96-871a-178f92eb6939
[2024-02-22T14:14:10.175Z] Microsoft.Azure.WebJobs.Script: Initializing HttpWorker timed out.
[2024-02-22T14:14:10.273Z] Hello cron run at: 2024-02-22 15:14:10.26971 +0100 CET m=+0.000085792
Et voilà notre cron Go qui est déclenché par un déclencheur de type Timer. Pour le déploiement sur Azure, il faut recompiler le code Go.
GOOS=linux GOARCH=amd64 go build -o script/cron script/cron.go
func azure functionapp publish fn-demo-mygglo