Créer votre première fonction Azure Functions conteneurisée sur Azure Arc (préversion)

Dans cet article, vous allez créer une application de fonction s’exécutant dans un conteneur Linux et la déployer sur un cluster Kubernetes avec Azure Arc à partir d’un registre de conteneurs. Lorsque vous créez votre propre conteneur, vous pouvez personnaliser l’environnement d’exécution de votre application de fonction. Pour en savoir plus, consultez App Service, Functions et Logic Apps sur Azure Arc.

Notes

La prise en charge du déploiement d’un conteneur personnalisé sur un cluster Kubernetes avec Azure Arc est actuellement en préversion.

Vous pouvez également publier vos fonctions sur un cluster Kubernetes avec Azure Arc sans créer au préalable de conteneur. Pour en savoir plus, consultez Créer votre première fonction sur Azure Arc (préversion)

Choisissez votre langage de développement

Tout d’abord, vous utilisez les outils Azure Functions pour créer votre code de projet en tant qu’application de fonction dans un conteneur Docker à l’aide d’une image de base Linux spécifique au langage. Veillez à sélectionner le langage de votre choix en haut de l’article.

Core Tools génère automatiquement un fichier Dockerfile pour votre projet qui utilise la version la plus récente de l’image de base appropriée pour le langage de vos fonctions. Vous devez régulièrement mettre à jour votre conteneur à partir de l’image de base la plus récente et redéployer à partir de la version mise à jour de votre conteneur. Pour plus d’informations, consultez Création d’applications de fonction conteneurisées.

Prérequis

Avant de commencer, vous devez disposer de la configuration requise suivante :

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit Azure avant de commencer.

Pour publier l’image d’application de fonction en conteneur que vous créez dans un registre de conteneurs, vous avez besoin d’un ID Docker et d’une instance Docker s’exécutant sur votre ordinateur local. Si vous n’avez pas d’ID Docker, vous pouvez créer un compte Docker.

Vous devez également suivre la section Créer un registre de conteneurs du guide de démarrage rapide Container Registry pour créer une instance de registre. Notez le nom complet de votre serveur de connexion.

Créer et activer un environnement virtuel

Dans le dossier approprié, exécutez les commandes suivantes pour créer et activer un environnement virtuel nommé .venv. Veillez à utiliser une des versions Python prises en charge par Azure Functions.

python -m venv .venv
source .venv/bin/activate

Si Python n’a pas installé le package venv sur votre distribution Linux, exécutez la commande suivante :

sudo apt-get install python3-venv

Vous devez exécuter toutes les commandes suivantes dans cet environnement virtuel activé.

Créer et tester un projet de fonction local

Dans un terminal ou une invite de commandes, exécutez la commande suivante dans le langage de votre choix pour créer un projet d’application de fonction dans le dossier actuel :

func init --worker-runtime dotnet-isolated --docker
func init --worker-runtime node --language javascript --docker
func init --worker-runtime powershell --docker
func init --worker-runtime python --docker
func init --worker-runtime node --language typescript --docker

Dans un dossier vide, exécutez la commande suivante pour générer le projet Functions à partir d’un archétype Maven :

mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8 -Ddocker

Le paramètre -DjavaVersion dit au runtime Functions quelle version de Java utiliser. Utilisez -DjavaVersion=11 si vous voulez que vos fonctions s’exécutent sur Java 11. Si vous ne spécifiez pas -DjavaVersion, par défaut Maven utilise Java 8. Pour plus d’informations, consultez Versions de Java.

Important

La variable d’environnement JAVA_HOME doit être définie sur l’emplacement d’installation de la version appropriée du JDK pour que vous puissiez suivre cet article.

Maven vous invite à entrer les valeurs nécessaires pour terminer la génération du projet lors du déploiement. Suivez les invites et fournissez les informations suivantes :

Prompt Valeur Description
groupId com.fabrikam Valeur qui identifie de façon unique votre projet parmi tous les projets, avec respect des règles de nommage de package pour Java.
artifactId fabrikam-functions Valeur qui correspond au nom du fichier jar, sans numéro de version.
version 1.0-SNAPSHOT Sélectionnez la valeur par défaut.
package com.fabrikam.functions Valeur qui correspond au package Java pour le code de fonction généré. Utilisez la valeur par défaut.

Tapez Y ou appuyez sur Entrée pour confirmer.

Maven crée les fichiers projet dans un nouveau dossier avec le nom d’artifactId, qui est fabrikam-functions dans cet exemple.

L’option --docker génère un Dockerfile pour le projet, qui définit un conteneur approprié pour une utilisation avec Azure Functions et le runtime sélectionné.

Accédez au dossier du projet :

cd fabrikam-functions

Ajoutez une fonction à votre projet à l’aide de la commande suivante, où l’argument --name est le nom unique de votre fonction, et l’argument --template spécifie le déclencheur de la fonction. func new crée un fichier de code C# dans votre projet.

func new --name HttpExample --template "HTTP trigger" --authlevel anonymous

Ajoutez une fonction à votre projet à l’aide de la commande suivante, où l’argument --name est le nom unique de votre fonction, et l’argument --template spécifie le déclencheur de la fonction. func new crée un sous-dossier correspondant au nom de la fonction qui contient un fichier config nommé func new.

func new --name HttpExample --template "HTTP trigger" --authlevel anonymous

Pour tester la fonction localement, démarrez l’hôte du runtime Azure Functions local à la racine du dossier du projet.

func start  
func start  
npm install
npm start
mvn clean package  
mvn azure-functions:run

Quand vous voyez le point de terminaison HttpExample écrit dans la sortie, accédez à ce point de terminaison. Vous devez voir un message de bienvenue dans la sortie de la réponse.

Quand vous voyez le point de terminaison HttpExample écrit dans la sortie, accédez à http://localhost:7071/api/HttpExample?name=Functions. Le navigateur doit afficher un message « hello » qui renvoie Functions par écho, c’est-à-dire la valeur fournie au paramètre de requête name.

Appuyez sur Ctrl+C (Commande+C sur macOS) pour arrêter l’hôte.

Générer l’image conteneur et vérifier localement

(Facultatif) Examinez le Dockerfile à la racine du dossier du projet. Le Dockerfile décrit l’environnement requis pour exécuter l’application de fonction sur Linux. La liste complète des images de base prises en charge pour Azure Functions se trouve sur la pages des images de base Azure Functions.

À la racine du dossier du projet, exécutez la commande docker build, puis indiquez un nom (azurefunctionsimage) et une balise (v1.0.0). Remplacez <DOCKER_ID> par votre ID de compte Docker Hub. Cette commande génère l’image Docker pour le conteneur.

docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .

Une fois la commande terminée, vous pouvez exécuter le nouveau conteneur localement.

Pour vérifier la génération, exécutez l’image dans un conteneur local avec la commande docker run, en remplaçant à nouveau <DOCKER_ID> par votre ID de compte Docker Hub et en ajoutant l’argument pour les ports, -p 8080:80 :

docker run -p 8080:80 -it <DOCKER_ID>/azurefunctionsimage:v1.0.0

Après le démarrage de l’image dans le conteneur local, accédez à http://localhost:8080/api/HttpExample, qui doit afficher le même message d’accueil que précédemment. Étant donné que la fonction déclenchée par HTTP que vous avez créée utilise une autorisation anonyme, vous pouvez appeler la fonction en cours d’exécution dans le conteneur sans avoir à obtenir de clé d’accès. Pour plus d’informations, consultez Clés d’autorisation.

Après le démarrage de l’image dans le conteneur local, accédez à http://localhost:8080/api/HttpExample?name=Functions, qui doit afficher le même message « hello » que précédemment. Étant donné que la fonction déclenchée par HTTP que vous avez créée utilise une autorisation anonyme, vous pouvez appeler la fonction en cours d’exécution dans le conteneur sans avoir à obtenir de clé d’accès. Pour plus d’informations, consultez Clés d’autorisation.

Après avoir vérifié l’application de fonction dans le conteneur, appuyez sur Ctrl+C (Commande+C sur macOS) pour arrêter l’exécution.

Publier l’image conteneur dans un registre

Pour que votre image conteneur soit disponible pour le déploiement dans un environnement d’hébergement, vous devez l’envoyer à un registre de conteneurs.

Azure Container Registry est un service de registre privé permettant de créer, de stocker et de gérer des images conteneurs et des artefacts connexes. Vous devez utiliser un service de registre privé pour publier vos conteneurs sur les services Azure.

  1. Utilisez la commande suivante pour vous connecter à votre instance de registre :

    az acr login --name <REGISTRY_NAME>
    

    Dans la commande précédente, remplacez <REGISTRY_NAME> par le nom de votre instance Container Registry.

  2. Utilisez la commande suivante pour baliser votre image avec le nom complet de votre serveur de connexion au registre :

    docker tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 
    

    Remplacez <LOGIN_SERVER> par le nom complet de votre serveur de connexion au registre et <DOCKER_ID> par votre ID Docker.

  3. Utilisez la commande suivante pour envoyer le conteneur à votre instance de registre :

    docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
    
  4. Utilisez la commande suivante pour activer le compte d’administrateur intégré afin que Functions puisse se connecter au registre avec un nom d’utilisateur et un mot de passe :

    az acr update -n <REGISTRY_NAME> --admin-enabled true
    
  1. Utilisez la commande suivante pour récupérer le nom d’utilisateur et le mot de passe de l’administrateur, dont Functions a besoin pour se connecter au Registre :

    az acr credential show -n <REGISTRY_NAME> --query "[username, passwords[0].value]" -o tsv
    

    Important

    Le nom d’utilisateur et le mot de passe du compte d’administrateur sont des informations d’identification importantes. Veillez à les stocker en toute sécurité et jamais dans un emplacement accessible, comme un référentiel public.

Créer un environnement App Service Kubernetes

Avant de commencer, vous devez créer un environnement App Service Kubernetes pour un cluster Kubernetes avec Azure Arc.

Notes

Lorsque vous créez l’environnement, veillez à noter le nom de l’emplacement personnalisé et le nom du groupe de ressources contenant l’emplacement personnalisé. Vous pourrez les utiliser pour trouver l’ID d’emplacement personnalisé dont vous aurez besoin lors de la création de votre application de fonction dans l’environnement.

Si vous n’avez pas créé l’environnement, contactez l’administrateur de votre cluster.

Ajouter des extensions Azure CLI

Lancez l’environnement Bash dans Azure Cloud Shell.

Comme ces commandes CLI ne font pas encore partie de l’ensemble principal de l’interface CLI, ajoutez-les avec les commandes suivantes :

az extension add --upgrade --yes --name customlocation
az extension remove --name appservice-kube
az extension add --upgrade --yes --name appservice-kube

Créer des ressources Azure

Avant de pouvoir déployer votre conteneur dans votre nouvel environnement App Service Kubernetes, vous devez créer deux ressources supplémentaires :

  • Un compte de stockage. Bien que cet article crée un compte de stockage, dans certains cas, un compte de stockage peut ne pas être requis. Pour plus d’informations, consultez Clusters avec Azure Arc dans l’article sur les considérations relatives au stockage.
  • Une application de fonction, qui fournit le contexte d’exécution de votre conteneur. L’application de fonction s’exécute dans l’environnement App Service Kubernetes et est mappée à votre projet de fonction local. Une application de fonction permet de regrouper des fonctions en une unité logique pour faciliter la gestion, le déploiement et le partage de ressources.

Notes

Les applications de fonction s’exécutent dans un environnement App Service Kubernetes dans le cadre d’un plan Dedicated (App Service). Si vous créez votre application de fonction sans plan existant, un plan est créé automatiquement.

Créer un compte de stockage

Utilisez la commande az storage account create pour créer un compte de stockage universel dans votre groupe de ressources et votre région :

az storage account create --name <STORAGE_NAME> --location westeurope --resource-group myResourceGroup --sku Standard_LRS

Notes

Dans certains cas, un compte de stockage peut ne pas être requis. Pour plus d’informations, consultez Clusters avec Azure Arc dans l’article sur les considérations relatives au stockage.

Dans l’exemple précédent, remplacez <STORAGE_NAME> par un nom qui vous convient et qui est unique dans Stockage Azure. Les noms doivent contenir entre 3 et 24 caractères, et comporter uniquement des lettres minuscules. Standard_LRS spécifie un compte universel, qui est pris en charge par Functions. La valeur --location est une région Azure standard.

Créer l’application de fonction

Exécutez la commande az functionapp create pour créer une application de fonction dans l’environnement.

az functionapp create --name <APP_NAME> --custom-location <CUSTOM_LOCATION_ID> --storage-account <STORAGE_NAME> --resource-group AzureFunctionsContainers-rg --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-username <USERNAME> --registry-password <SECURE_PASSWORD> 

Dans cet exemple, remplacez <CUSTOM_LOCATION_ID> par l’ID de l’emplacement personnalisé que vous avez déterminé pour l’environnement App Service Kubernetes. Effectuez également ces trois remplacements : <STORAGE_NAME> par le nom du compte que vous avez utilisé à l’étape précédente, <APP_NAME> par le nom global unique dans votre cas et <DOCKER_ID> ou <LOGIN_SERVER> par votre ID Docker Hub ou serveur de registre de conteneurs, respectivement. Lorsque vous déployez à partir d’un registre de conteneurs personnalisé, le nom d’image indique l’URL du registre.

Au moment où vous créez l’application de fonction, l’image initiale est tirée (pull) de Docker Hub.

Définir les paramètres de l’application obligatoires

Exécutez les commandes suivantes afin de créer un paramètre d’application pour la chaîne de connexion du compte de stockage :

storageConnectionString=$(az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <STORAGE_NAME> --query connectionString --output tsv)
az functionapp config appsettings set --name <app_name> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=$storageConnectionString

Vous devez exécuter ce code dans Cloud Shell ou dans Bash sur votre ordinateur local. Remplacez <STORAGE_NAME> par le nom du compte de stockage et <APP_NAME> par le nom de l’application de fonction.

Appeler la fonction sur Azure

Dans la mesure où votre fonction utilise un déclencheur HTTP, vous l’appelez en adressant une requête HTTP à son URL dans le navigateur ou à l’aide d’un outil semblable à curl.

Copiez l’URL d’appel complète affichée au sein de la sortie de la commande de publication dans la barre d’adresse d’un navigateur, en ajoutant le paramètre de requête ?name=Functions. Le navigateur doit afficher une sortie similaire à celle générée au moment de l’exécution locale de la fonction.

The output of the function run on Azure in a browser

Nettoyer les ressources

Si vous voulez continuer à utiliser Azure Functions en utilisant les ressources que vous avez créées dans cet article, vous pouvez conserver toutes ces ressources en place.

Lorsque vous avez terminé d’utiliser ce déploiement d’application de fonction, supprimez le groupe de ressources AzureFunctionsContainers-rg pour nettoyer toutes les ressources de ce groupe :

az group delete --name AzureFunctionsContainers-rg

Cela supprime uniquement les ressources créées dans cet article. L’environnement Azure Arc sous-jacent reste en place.

Étapes suivantes