Créer votre première fonction Azure Functions conteneurisée
Dans cet article, vous allez créer une application de fonction s’exécutant dans un conteneur Linux et la déployer sur Azure Functions.
Le déploiement du code de votre fonction à Azure Functions dans un conteneur nécessite un hébergement de plan Premium ou de Plan dédié (App Service). Suivre cet article entraîne des coûts de quelques dollars US dans votre compte Azure, que vous pouvez réduire en nettoyant les ressources quand vous avez terminé.
Les autres options de déploiement de votre conteneur d’application de fonction sur Azure sont les suivantes :
Azure Container Apps : pour en savoir plus, consultez Déployer un conteneur sur Azure Container Apps.
Azure Arc (actuellement en préversion) : pour en savoir plus, consultez Déployer un conteneur sur Azure Arc.
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 :
Installez le Kit de développement logiciel (SDK) .NET 8.0.
Installez Azure Functions Core Tools version 4.0.5198 ou une version ultérieure.
- Installez Azure Functions Core Tools version 4.x.
- Installez une version de Node.jsprise en charge par Azure Functions.
- Installez une version de Python prise en charge par Azure Functions.
- Installez le SDK .NET 6.
Installez une version du kit de développement Javaprise en charge par Azure Functions.
Installez Apache Maven version 3.0 ou ultérieure.
- Azure CLI version 2.4 ou ultérieure.
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"
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"
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.
Utilisez cette commande pour vous connecter à votre instance de registre en utilisant vos informations d’identification Azure actuelles :
az acr login --name <REGISTRY_NAME>
Dans la commande précédente, remplacez
<REGISTRY_NAME>
par le nom de votre instance Container Registry.Utilisez cette commande pour étiqueter 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.Utilisez cette commande pour envoyer (push) le conteneur à votre instance de registre :
docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
Créer des ressources Azure de prise en charge pour votre fonction
Avant de déployer votre conteneur dans Azure, vous devez créer trois ressources :
- Un groupe de ressources, qui est un conteneur logique pour les ressources associées.
- Un compte de stockage, qui sert à conserver l’état et d’autres informations sur vos fonctions.
- Une application de fonction, qui fournit l’environnement d’exécution de votre code de fonction. Une application de fonction est mappée à votre projet de fonction local. Elle vous permet de regrouper les fonctions en tant qu’unité logique pour faciliter la gestion, le déploiement et le partage des ressources.
Utilisez les commandes suivantes pour créer ces éléments. Azure CLI et PowerShell sont pris en charge. Pour créer vos ressources Azure à l’aide d’Azure PowerShell, vous avez également besoin du module Az PowerShell, version 5.9.0 ou ultérieure.
Si vous ne l’avez pas déjà fait, connectez-vous à Azure.
az login
La commande
az login
vous connecte à votre compte Azure.Créez un groupe de ressources nommé
AzureFunctionsContainers-rg
dans la région de votre choix.az group create --name AzureFunctionsContainers-rg --location <REGION>
La commande
az group create
crée un groupe de ressources. Dans la commande ci-dessus, remplacez<REGION>
par une région près de chez vous en utilisant un code de région disponible retourné par la commande<REGION>
.Créez un compte de stockage universel dans votre groupe de ressources et votre région.
az storage account create --name <STORAGE_NAME> --location <REGION> --resource-group AzureFunctionsContainers-rg --sku Standard_LRS
La commande
az storage account create
crée le compte de 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 de stockage 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.Utilisez la commande pour créer un plan Premium pour Azure Functions nommé
myPremiumPlan
dans le niveau tarifairemyPremiumPlan
(--sku EP1
), dans votre<REGION>
et dans un conteneur Linux (--is-linux
).az functionapp plan create --resource-group AzureFunctionsContainers-rg --name myPremiumPlan --location <REGION> --number-of-workers 1 --sku EP1 --is-linux
Nous utilisons ici le plan Premium, qui peut être mis à l’échelle en fonction des besoins. Pour plus d’informations sur les plans d’hébergement, consultez Comparaison des plans d’hébergement Azure Functions. Pour plus d’informations sur la façon de calculer les coûts, consultez la page de tarification de Functions.
La commande crée aussi une instance d’Azure Application Insights associée dans le même groupe de ressources, avec laquelle vous pouvez superviser votre application de fonction et visualiser les journaux. Pour plus d’informations, consultez Surveiller l’exécution des fonctions Azure. L’instance n’entraîne aucun coût tant que vous ne l’activez pas.
Créer et configurer une application de fonction sur Azure avec l’image
Une application de fonction sur Azure gère l’exécution de vos fonctions dans votre plan d’hébergement Azure Functions. Dans cette section, vous utilisez les ressources Azure de la section précédente pour créer une application de fonction à partir d’une image sur un registre de conteneurs et pour la configurer avec une chaîne de connexion à Stockage Azure.
Créez une application de fonction à l’aide de la commande suivante, en fonction de votre registre de conteneurs :
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --resource-group AzureFunctionsContainers-rg --plan myPremiumPlan --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-username <USERNAME> --registry-password <SECURE_PASSWORD>
Dans cet exemple, remplacez
<STORAGE_NAME>
par le nom que vous avez utilisé dans la section précédente pour le compte de stockage. Remplacez aussi<APP_NAME>
par un nom globalement unique qui vous convient et<DOCKER_ID>
ou<LOGIN_SERVER>
par votre ID de compte 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. Vous pouvez également activer le déploiement continu sur Azure à partir de votre registre de conteneurs.
Conseil
Vous pouvez utiliser le
DisableColor
paramètre dans le fichier host.json pour empêcher l’écriture des caractères de contrôle ANSI dans les journaux de conteneur.Utilisez la commande suivante afin d’obtenir la chaîne de connexion pour le compte de stockage que vous avez créé :
az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <STORAGE_NAME> --query connectionString --output tsv
La chaîne de connexion pour le compte de stockage est retournée avec la commande
az storage account show-connection-string
.Remplacez
<STORAGE_NAME>
par le nom du compte de stockage que vous avez créé précédemment.Utilisez la commande suivante pour ajouter le paramètre à l’application de fonction :
az functionapp config appsettings set --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=<CONNECTION_STRING>
La commande
az functionapp config appsettings set
crée le paramètre.Dans cette commande, remplacez
<APP_NAME>
par le nom de votre application de fonction et<CONNECTION_STRING>
par la chaîne de connexion issue de l’étape précédente. La connexion doit être une longue chaîne codée qui commence parDefaultEndpointProtocol=
.La fonction peut maintenant utiliser cette chaîne de connexion pour accéder au compte de stockage.
Vérifier vos fonctions sur Azure
Une fois l’image déployée sur votre application de fonction dans Azure, vous pouvez appeler la fonction via des requêtes HTTP.
Exécutez la commande
az functionapp function show
suivante pour obtenir l’URL de votre nouvelle fonction :az functionapp function show --resource-group AzureFunctionsContainers-rg --name <APP_NAME> --function-name HttpExample --query invokeUrlTemplate
Remplacez
<APP_NAME>
par le nom de votre application de fonction.
- Utilisez l’URL que vous venez d’obtenir pour appeler le point de terminaison de fonction
HttpExample
, en ajoutant la chaîne de requête?name=Functions
.
- Utilisez l’URL que vous venez d’obtenir pour appeler le point de terminaison de fonction
HttpExample
.
Quand vous accédez à cette URL, le navigateur doit afficher une sortie similaire à celle générée au moment de l’exécution locale de la fonction.
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. Comme vous avez créé un plan Premium pour Azure Functions, un ou deux dollars US vous seront facturés quotidiennement.
Pour éviter ces frais récurrents, supprimez le groupe de ressources AzureFunctionsContainers-rg
pour supprimer toutes les ressources de ce groupe :
az group delete --name AzureFunctionsContainers-rg