Lire en anglais

Partager via


Créer vos premières fonctions conteneurisée sur Azure Container Apps

Choisir un langage de programmation

Dans cet article, vous allez créer une application de fonction s’exécutant dans un conteneur Linux et la déployer sur un environnement Azure Container Apps à partir d’un registre de conteneurs. En déployant sur Container Apps, vous pouvez intégrer vos applications de fonction dans des microservices natifs cloud. Pour plus d’informations, consultez Hébergement Azure Container Apps d’Azure Functions.

Cet article vous explique comment créer des fonctions qui s’exécutent dans un conteneur Linux et comment déployer le conteneur dans un environnement Container Apps.

La réalisation de ce guide de démarrage rapide entraîne un petit coût de quelques cents USD ou moins dans votre compte Azure, que vous pouvez réduire en nettoyant les ressources lorsque vous avez terminé.

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.

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

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

Bash
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 :

Console
func init --worker-runtime dotnet-isolated --docker
Console
func init --worker-runtime node --language javascript --docker
Console
func init --worker-runtime powershell --docker
Console
func init --worker-runtime python --docker
Console
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 :

Bash
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 :

Console
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.

Console
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.

Console
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.

Console
func start  
Console
func start  
Console
npm install
npm start
Console
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.

Console
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 :

Console
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. En guise de meilleure pratique de sécurité, vous devez utiliser une instance Azure Container Registry et appliquer des connexions basées sur des identités managées. Docker Hub vous oblige à vous authentifier à l’aide de secrets partagés, ce qui rend vos déploiements plus vulnérables.

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 cette commande pour vous connecter à votre instance de registre en utilisant vos informations d’identification Azure actuelles :

    Azure CLI
    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 cette commande pour étiqueter votre image avec le nom complet de votre serveur de connexion au registre :

    docker
    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 cette commande pour envoyer (push) le conteneur à votre instance de registre :

    docker
    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.
  • Un environnement Azure Container Apps avec un espace de travail Log Analytics.
  • Une identité managée affectée par l’utilisateur, qui permet à votre application de fonction de se connecter en toute sécurité aux ressources Azure sans utiliser de secrets partagés. Les connexions au compte stockage Azure et à l’instance Azure Container Registry sont effectuées à l’aide de l’authentification Microsoft Entra avec l’identité, ce qui est recommandé pour ce scénario.

Note

Docker Hub ne prend pas en charge les identités managées.

Utilisez ces commandes pour créer vos ressources Azure nécessaires :

  1. Si nécessaire, connectez-vous à Azure :

    La commande az login vous connecte à votre compte Azure. Utiliser az account set lorsque plusieurs abonnements sont associés à votre compte.

  2. Exécutez la commande suivante pour mettre à jour Azure CLI vers la dernière version :

    Azure CLI
    az upgrade
    

    Si votre version d’Azure CLI n’est pas la dernière version, une installation commence. Le mode de mise à niveau dépend de votre système d’exploitation. Vous pouvez continuer une fois la mise à niveau terminée.

  3. Exécutez les commandes suivantes qui mettent à niveau l’extension Azure Container Apps et inscrivent les espaces de noms requis par Container Apps :

    Azure CLI
    az extension add --name containerapp --upgrade -y
    az provider register --namespace Microsoft.Web 
    az provider register --namespace Microsoft.App 
    az provider register --namespace Microsoft.OperationalInsights 
    
  4. Créez un groupe de ressources nommé AzureFunctionsContainers-rg.

    Azure CLI
    az group create --name AzureFunctionsContainers-rg --location eastus
    

    Cette commande az group create crée un groupe de ressources dans la région USA Est. Si vous voulez utiliser une région près de chez vous à la place en utilisant un code de région disponible retourné par la commande az account list-locations. Vous devez modifier les commandes suivantes pour utiliser votre région personnalisée au lieu de eastus.

  5. Créez un environnement Azure Container App avec des profils de charge de travail activés.

    Azure CLI
    az containerapp env create --name MyContainerappEnvironment --enable-workload-profiles --resource-group AzureFunctionsContainers-rg --location eastus
    

    L’exécution de cette commande peut prendre plusieurs minutes.

  6. Créez un compte de stockage universel dans votre groupe de ressources et votre région, sans accès à clé partagée.

    Azure CLI
    az storage account create --name <STORAGE_NAME> --location eastus --resource-group AzureFunctionsContainers-rg --sku Standard_LRS --allow-blob-public-access false --allow-shared-key-access false
    

    La commande az storage account create crée le compte de stockage accessible uniquement à l’aide d’identités authentifiées par Microsoft Entra qui ont reçu des autorisations pour des ressources spécifiques.

    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.

  7. Créez une identité managée et utilisez le principalId retourné pour lui accorder à la fois l’accès à votre compte de stockage et les autorisations d’extraction dans votre instance de registre.

    Azure CLI
    principalId=$(az identity create --name <USER_IDENTITY_NAME> --resource-group AzureFunctionsContainers-rg --location eastus --query principalId -o tsv) 
    acrId=$(az acr show --name <REGISTRY_NAME> --query id --output tsv)
    az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal --role acrpull --scope $acrId
    storageId=$(az storage account show --resource-group AzureFunctionsContainers-rg --name glengatestaca2 --query 'id' -o tsv)
    az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal --role "Storage Blob Data Owner" --scope $storageId
    

    La commande az identity create crée une identité managée affectée par l’utilisateur et les commandes az role assignment create ajoutent votre identité aux rôles requis. Remplacez <REGISTRY_NAME>, <USER_IDENTITY_NAME> et <STORAGE_NAME> par le nom de votre registre de conteneurs existant, le nom de votre identité managée et le nom du compte de stockage, respectivement. L’identité managée peut désormais être utilisée par une application pour accéder au compte de stockage et à Azure Container Registry sans utiliser de secrets partagés.

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 environnement Azure Container Apps. 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 dans un environnement Container Apps. Vous configurez également le nouvel environnement avec une chaîne de connexion au compte de stockage Azure requis.

Utilisez la commande az functionapp create pour créer une application de fonction dans le nouvel environnement managé avec l’aide d’Azure Container Apps. Dans az functionapp create, le paramètre --environment spécifie l’environnement Container Apps.

Conseil

Pour vous assurer que votre application de fonction utilise une connexion basée sur une identité managée à votre instance de registre, ne définissez pas le paramètre --image dans az functionapp create. Lorsque vous définissez --image sur le nom complet de votre image dans le référentiel, les informations d’identification de secret partagé sont obtenues à partir de votre registre et stockées dans les paramètres de l’application.

Tout d’abord, vous devez obtenir la valeur d’ID complète de votre identité managée affectée par l’utilisateur avec un accès par extraction au registre, puis utiliser la commande az functionapp create pour créer une application de fonction à l’aide de l’image par défaut et avec cette identité qui lui est attribuée.

Azure CLI
UAMI_RESOURCE_ID=$(az identity show --name $uami_name --resource-group $group --query id -o tsv)
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --assign-identity $UAMI_RESOURCE_ID

Dans az functionapp create, --assign-identity attribue votre identité managée à la nouvelle application. Comme vous n’avez pas défini le paramètre --image dans az functionapp create, l’application est créée à l’aide d’une image d’espace réservé.

Dans cet exemple, remplacez <APP_NAME>, <STORAGE_NAME> et <USER_IDENTITY_NAME> par un nom pour votre nouvelle application de fonction, ainsi que le nom de votre compte de stockage et l’identité.

Enfin, vous devez mettre à jour le paramètre du site linuxFxVersion avec le nom complet de votre image dans le référentiel. Vous devez également mettre à jour les paramètres de site acrUseManagedIdentityCreds et acrUserManagedIdentityID afin que les identités managées soient utilisées lors de l’obtention de l’image à partir du registre.

Azure CLI
UAMI_RESOURCE_ID=$(az identity show --name <USER_IDENTITY_NAME> --resource-group AzureFunctionsContainers-rg --query id -o tsv)
az resource patch --resource-group AzureFunctionsContainers-rg --name <APP_NAME> --resource-type "Microsoft.Web/sites" --properties "{ \"siteConfig\": { \"linuxFxVersion\": \"DOCKER|<REGISTRY_NAME>.azurecr.io/azurefunctionsimage:v1.0.0\", \"acrUseManagedIdentityCreds\": true, \"acrUserManagedIdentityID\":\"$UAMI_RESOURCE_ID\", \"appSettings\": [{\"name\": \"DOCKER_REGISTRY_SERVER_URL\", \"value\": \"<REGISTRY_NAME>.azurecr.io\"}]}}"

Outre les paramètres de site requis, la commande az resource patch met également à jour le paramètre d’application DOCKER_REGISTRY_SERVER_URL à l’URL de votre serveur de registre.

Dans cet exemple, remplacez <APP_NAME>, <REGISTRY_NAME> et <USER_IDENTITY_NAME> par les noms de votre application de fonction, du registre de conteneurs et de l’identité, respectivement.

La spécification de --workload-profile-name "Consumption" crée votre application dans un environnement à l’aide du profil de charge de travail Consumption par défaut, ce qui coûte le même prix que l’exécution dans un plan de consommation Container Apps. Au moment où vous créez l’application de fonction, l’image initiale est tirée de votre registre.

Mettre à jour les paramètres d’application

Pour permettre à l’hôte Functions de se connecter au compte de stockage par défaut à l’aide de secrets partagés, vous devez remplacer le paramètre de chaîne de connexion AzureWebJobsStorage par un paramètre équivalent qui utilise l’identité managée affectée par l’utilisateur pour se connecter au compte de stockage.

  1. Supprimez le paramètre de chaîne de connexion AzureWebJobsStorage existant :

    Azure CLI
    az functionapp config appsettings delete --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --setting-names AzureWebJobsStorage 
    

    La commande az functionapp config appsettings delete supprime ce paramètre de votre application. Remplacez <APP_NAME> par le nom de votre application de fonction.

  2. Ajoutez des paramètres équivalents, avec un préfixe AzureWebJobsStorage__, qui définissent une connexion d’identité managée affectée par l’utilisateur au compte de stockage par défaut :

    Azure CLI
    clientId=$(az identity show --name <USER_IDENTITY_NAME> --resource-group AzureFunctionsContainers-rg --query 'clientId' -o tsv)
    az functionapp config appsettings set --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage__accountName=<STORAGE_NAME> AzureWebJobsStorage__credential=managedidentity AzureWebJobsStorage__clientId=$clientId
    

    Dans cet exemple, remplacez <APP_NAME>, <USER_IDENTITY_NAME>, <STORAGE_NAME> par le nom de votre application de fonction, le nom de votre identité et le nom du compte de stockage, respectivement.

À ce stade, vos fonctions s’exécutent dans un environnement Container Apps, avec les paramètres d’application requis déjà ajoutés. Si nécessaire, vous pouvez ajouter d’autres paramètres dans votre application de fonction de la manière standard pour Functions. Pour plus d’informations, consultez Utiliser des paramètres d’application.

Conseil

Lorsque vous apportez des modifications ultérieures au code de votre fonction, vous devez reconstruire le conteneur, republier l’image dans le Registre et mettre à jour l’application de fonction avec la nouvelle version de l’image. Pour plus d’informations, consultez Mettre à jour une image dans le Registre

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.

  1. Exécutez la commande az functionapp function show suivante pour obtenir l’URL de votre nouvelle fonction :

    Azure CLI
    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.

  1. 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.
  1. 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.

L’URL de requête doit être similaire à :

https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample?name=functions

https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample

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 :

Azure CLI
az group delete --name AzureFunctionsContainers-rg

Étapes suivantes