Créer et déployer une fonction Azure en go

Introduction

Azure Functions est une solution serverless qui vous permet d’écrire moins de code, de maintenir moins d’infrastructure et de réaliser des économies. Au lieu de vous soucier du déploiement et de la maintenance des serveurs, l’infrastructure cloud fournit toutes les ressources à jour nécessaires au bon fonctionnement de vos applications.

Création des ressources Azure

Se connecter à Azure

Avant toute chose, il nous faut nous connecter à Azure.

az login

Choisir ou créer une souscription existante

Pour voir toutes nos souscriptions existante et en choisir une

az account list -o table
az account set --subscription <SubscriptionId> # remplacer par l'ID de la souscription

Creer une Resource Group

Nous créons une Resource Group dans la localisation francecentral

az group create -n rg-demo -l francecentral

Création d’un storage account

Les fonctions Azure requièrent un storage account. Ce storage account est utilisé pour stocker les méta-données de la function, son historique et ses configurations.

az storage account create -n samygglodemo -g rg-demo -l francecentral

Création de la fonction

Une fois toutes les dépendances résolues, nous créons la fonction.

az functionapp create -n fn-mygglo-demo \
  -g rg-demo \
  --consumption-plan-location francecentral \
  --os-type Linux \
  --runtime custom \
  --functions-version 4 \
  --disable-app-insights false \
  --storage-account samygglodemo

Le code source

Installation du cli fn

L’installation se fait avec brew sur mac

brew tap azure/functions
brew install azure-functions-core-tools@4
# if upgrading on a machine that has 2.x or 3.x installed:
brew link --overwrite azure-functions-core-tools@4

Sur Ubuntu

curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-$(lsb_release -cs)-prod $(lsb_release -cs) main" > /etc/apt/sources.list.d/dotnetdev.list'
sudo apt-get update
sudo apt-get install azure-functions-core-tools-4

Pour Windows et les autres distributions Linux visitez la documentation Azure.

Création du squelette de fonction pour go

Il nous faut initier le projet

func init demo --worker-runtime custom

Nous nous déplaçons ensuite dans le dossier demo puis créons la fonction demo-mygglo

cd demo 
func function new -l Custom -t HttpTrigger -n demo-mygglo -a anonymous

Ajout du code Go de la fonction

Nous créons un ficher handler.go dans le répertoire racine de la fonction (celui qui contient host.json). Voici le contenu du fichier handler.go

package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
    message := "This HTTP triggered function executed successfully. Pass a name in the query string for a personalized response.\n"
    name := r.URL.Query().Get("name")
    if name != "" {
        message = fmt.Sprintf("Hello, %s. This HTTP triggered function executed successfully.\n", name)
    }
    fmt.Fprint(w, message)
}

func main() {
    listenAddr := ":8080"
    if val, ok := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT"); ok {
        listenAddr = ":" + val
    }
    http.HandleFunc("/api/demo-mygglo", helloHandler)
    log.Printf("About to listen on %s. Go to https://127.0.0.1%s/", listenAddr, listenAddr)
    log.Fatal(http.ListenAndServe(listenAddr, nil))
}

Il faut remarquer que l’url de la fonction suit la syntaxe /api/<nom_de_la_fonction>. Dans notre cas : /api/demo-mygglo. Il faut donc faire attention dans le code Go à respecter cette convention. Nous compilons le code Go avec la commande :

go build handler.go

Configuration de la fonction

Nous configurons la fonction pour utiliser le binaire handler généré. Pour cela ouvrir le fichier host.json. Dans la section customHandler.description nous affectons la valeur handler à defaultExecutablePath. Dans la section customHandler nous ajoutons “enableForwardingHttpRequest”: true . La section customHandler ressemble à :

"customHandler": {
  "description": {
    "defaultExecutablePath": "handler",
    "workingDirectory": "",
    "arguments": []
  },
  "enableForwardingHttpRequest": true
}

Test local de la fonction

Dans un terminal, dans le dossier demo , lancer la commande suivante :

func start

La sortie montre l’url de la fonction. On peut la tester avec une commande curl:

curl http://localhost:7071/api/demo-mygglo?name=okkkk

Compiler le code pour Azure

Nous compilons ensuite notre fonction pour Azure.

GOOS=linux GOARCH=amd64 go build handler.go

Déployer la fonction sur azure

Dans le dossier demo, nous lançons la commande suivante pour déployer la fonction.

func azure functionapp publish fn-mygglo-demo

Une fois la fonction déployée, nous pouvons la tester avec l’url qui s’affiche :

curl https://fn-mygglo-demo.azurewebsites.net/api/demo-mygglo?name=james

Suppression des ressources azure

az group delete --name rg-demo

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.