Créer et déployer une fonction Azure déclenchée par un Timer en go

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  

S'inscrire à ma liste de diffusion

Abonnement réussi

Erreur lors de l'inscription.

Nous ne communiquerons jamais votre adresse électronique à qui que ce soit.