Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
Dans cette partie de la série de tutoriels, vous allez apprendre à déployer une application web Python en conteneur sur Azure App Service Web App Service pour conteneurs. Ce service entièrement managé vous permet d’exécuter des applications conteneurisées sans avoir à gérer votre propre orchestrateur de conteneurs.
App Service simplifie le déploiement via des pipelines d’intégration/de déploiement continu (CI/CD) qui fonctionnent avec Docker Hub, Azure Container Registry, Azure Key Vault et d’autres outils DevOps. Ce tutoriel fait partie 4 d’une série de tutoriels en 5 parties.
À la fin de cet article, vous disposez d’une application web App Service sécurisée et prête pour la production exécutée à partir d’une image conteneur Docker. L’application utilise une identité managée affectée par le système pour extraire l’image d’Azure Container Registry et récupérer des secrets à partir d’Azure Key Vault.
Ce diagramme de service met en évidence les composants abordés dans cet article.
Les commandes Azure CLI peuvent être exécutées dans Azure Cloud Shell ou sur un ordinateur local avec Azure CLI installé.
Importante
Nous vous recommandons d’utiliser Azure Cloud Shell pour toutes les étapes basées sur l’interface CLI de ce didacticiel, car elle :
- Est pré-authentifié avec votre compte Azure, ce qui évite les problèmes de connexion
- Inclut toutes les extensions Azure CLI requises prêtes à l’emploi
- Garantit un comportement cohérent, quel que soit votre système d’exploitation ou votre environnement local
- Nécessite aucune installation locale, idéale pour les utilisateurs sans droits d’administrateur
- Fournit un accès direct aux services Azure à partir du portail : aucune configuration locale de Docker ou de réseau n’est requise
- Évite les problèmes de configuration réseau ou de pare-feu local
Créer un coffre de clés avec l’autorisation RBAC
Azure Key Vault est un service sécurisé permettant de stocker des secrets, des clés API, des chaînes de connexion et des certificats. Dans ce script, il stocke la chaîne de connexion MongoDB et l’application SECRET_KEYweb.
Key Vault est configuré pour utiliser le contrôle d’accès en fonction du rôle (RBAC) pour gérer l’accès via des rôles Azure au lieu de stratégies d’accès traditionnelles. L’application web utilise son identité managée affectée par le système pour récupérer les secrets en toute sécurité au moment de l’exécution.
Remarque
La création anticipée du coffre de clés garantit que les rôles peuvent être attribués avant toute tentative d’accès aux secrets. Il permet également d’éviter les retards de propagation dans les attributions de rôles. Étant donné que Key Vault ne dépend pas d’App Service, le provisionnement précoce améliore la fiabilité et le séquencement.
Dans cette étape, vous utilisez la commande az keyvault create pour créer un coffre de clés Azure avec RBAC activé.
#!/bin/bash RESOURCE_GROUP_NAME="msdocs-web-app-rg" LOCATION="westus" KEYVAULT_NAME="${RESOURCE_GROUP_NAME}-kv" az keyvault create \ --name "$KEYVAULT_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --location "$LOCATION" \ --enable-rbac-authorization true
Créer le plan App Service et l’application web
Le plan App Service définit les ressources de calcul, le niveau tarifaire et la région de votre application web. L’application web exécute votre application conteneurisée et est approvisionnée avec une identité managée affectée par le système utilisée pour s’authentifier en toute sécurité auprès d’Azure Container Registry (ACR) et d’Azure Key Vault.
Dans cette étape, vous effectuez les tâches suivantes :
- Créer un plan App Service
- Créer l’application web avec son identité managée
- Configurer l’application web à déployer à l’aide d’une image conteneur spécifique
- Préparer le déploiement continu via ACR
Remarque
L’application web doit être créée avant d’attribuer l’accès à ACR ou Key Vault, car l’identité managée est créée uniquement au moment du déploiement. En outre, l’attribution de l’image conteneur lors de la création garantit que l’application démarre correctement avec la configuration prévue.
Dans cette étape, vous utilisez la commande az appservice plan create pour provisionner l’environnement de calcul pour votre application.
#!/bin/bash APP_SERVICE_PLAN_NAME="msdocs-web-app-plan" az appservice plan create \ --name "$APP_SERVICE_PLAN_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --sku B1 \ --is-linuxDans cette étape, vous utilisez la commande az webapp create pour créer l’application web. Cette commande active également une identité managée affectée par le système et définit l’image conteneur exécutée par l’application.
#!/bin/bash APP_SERVICE_NAME="msdocs-website-name" #APP_SERVICE_NAME must be globally unique as it becomes the website name in the URL `https://<website-name>.azurewebsites.net`. # Use the same registry name as in part 2 of this tutorial series. REGISTRY_NAME="msdocscontainerregistryname" #REGISTRY_NAME is the registry name you used in part 2 of this tutorial. CONTAINER_NAME="$REGISTRY_NAME.azurecr.io/msdocspythoncontainerwebapp:latest" #CONTAINER_NAME is of the form "yourregistryname.azurecr.io/repo_name:tag". az webapp create \ --resource-group "$RESOURCE_GROUP_NAME" \ --plan "$APP_SERVICE_PLAN_NAME" \ --name "$APP_SERVICE_NAME" \ --assign-identity '[system]' \ --deployment-container-image-name "$CONTAINER_NAME"Remarque
Lors de l’exécution de cette commande, l’erreur suivante peut s’afficher :
No credential was provided to access Azure Container Registry. Trying to look up... Retrieving credentials failed with an exception:'Failed to retrieve container registry credentials. Please either provide the credentials or run 'az acr update -n msdocscontainerregistryname --admin-enabled true' to enable admin first.'Cette erreur se produit parce que l’application web tente d’utiliser les informations d’identification d’administrateur pour accéder à ACR, les informations d’identification désactivées par défaut. Il est sûr d’ignorer ce message : l’étape suivante configure l’application web pour utiliser son identité managée pour s’authentifier auprès d’ACR.
Accorder le rôle Agent secrets à l’utilisateur connecté
Pour stocker des secrets dans Azure Key Vault, l’utilisateur exécutant le script doit avoir le rôle Agent des secrets Key Vault . Ce rôle permet de créer et de gérer des secrets dans le coffre.
Dans cette étape, le script affecte ce rôle à l’utilisateur actuellement connecté. Cet utilisateur peut ensuite stocker en toute sécurité les secrets d’application, tels que la chaîne de connexion MongoDB et l’application SECRET_KEY.
Cette attribution de rôle est la première de deux attributions de rôles liées à Key Vault. Plus tard, l’identité managée affectée par le système de l’application web est autorisée à récupérer des secrets à partir du coffre.
L’utilisation d’Azure RBAC garantit un accès sécurisé et auditable en fonction de l’identité, ce qui élimine la nécessité d’informations d’identification codées en dur.
Remarque
L’utilisateur doit être affecté au rôle Agent des secrets Key Vaultavant de tenter de stocker des secrets dans le coffre de clés. Cette attribution est effectuée à l’aide de la commande az role assignment create appliquée au coffre de clés.
Dans cette étape, vous utilisez la commande az role assignment create pour affecter le rôle dans l’étendue Key Vault.
#!/bin/bash CALLER_ID=$(az ad signed-in-user show --query id -o tsv) echo $CALLER_ID # Verify this value retrieved successfully. In production, poll to verify this value is retrieved successfully. az role assignment create \ --role "Key Vault Secrets Officer" \ --assignee "$CALLER_ID" \ --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
Accorder un accès web à ACR à l’aide d’une identité managée
Pour extraire des images d’Azure Container Registry (ACR) en toute sécurité, l’application web doit être configurée pour utiliser son identité managée affectée par le système. L’utilisation de l’identité managée évite la nécessité d’informations d’identification d’administrateur et prend en charge le déploiement sécurisé et sans informations d’identification.
Ce processus implique deux actions clés :
- Activation de l’application web pour utiliser son identité managée lors de l’accès à ACR
- Affectation du rôle AcrPull à cette identité sur l’ACR cible
Dans cette étape, vous récupérez l’ID principal (ID d’objet unique) de l’identité managée de l’application web à l’aide de la commande az webapp identity show . Ensuite, vous activez l’utilisation de l’identité managée pour l’authentification ACR en définissant la propriété
acrUseManagedIdentityCredssurtrueen utilisant `az webapp config set`. Vous affectez ensuite le rôle AcrPull à l’identité managée de l’application web à l’aide de la commande az role assignment create . Ce rôle accorde à l’application web l’autorisation d’extraire des images du Registre.#!/bin/bash PRINCIPAL_ID=$(az webapp identity show \ --name "$APP_SERVICE_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --query principalId \ -o tsv) echo $PRINCIPAL_ID # Verify this value retrieved successfully. In production, poll for successful 'AcrPull' role assignment using `az role assignment list`. az webapp config set \ --resource-group "$RESOURCE_GROUP_NAME" \ --name "$APP_SERVICE_NAME" \ --generic-configurations '{"acrUseManagedIdentityCreds": true}' az role assignment create \ --role "AcrPull" \ --assignee "$PRINCIPAL_ID" \ --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ContainerRegistry/registries/$REGISTRY_NAME"
Accorder l’accès au coffre de clés à l’identité managée de l’application web
L’application web a besoin de l’autorisation d’accéder aux secrets comme la chaîne de connexion MongoDB et le SECRET_KEY. Pour accorder ces autorisations, vous devez attribuer le rôle Utilisateur des secrets Key Vault à l’identité managée affectée par le système de l’application web.
Dans cette étape, vous utilisez l’identificateur unique (ID principal) de l’identité managée affectée par le système de l’application web pour accorder à l’application web l’accès au coffre de clés avec le rôle Utilisateur secrets Key Vault à l’aide de la commande az role assignment create .
#!/bin/bash az role assignment create \ --role "Key Vault Secrets User" \ --assignee "$PRINCIPAL_ID" \ --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
Stocker des secrets dans Key Vault
Pour éviter le codage en dur des secrets dans votre application, cette étape stocke la chaîne de connexion MongoDB et la clé secrète de l’application web dans Azure Key Vault. Ces secrets peuvent ensuite être accessibles en toute sécurité par l’application web au moment de l’exécution via son identité managée, sans avoir à stocker les informations d’identification dans le code ou la configuration.
Remarque
Bien que ce didacticiel stocke uniquement la chaîne de connexion et la clé secrète dans le coffre de clés, vous pouvez également stocker d’autres paramètres d’application tels que le nom de la base de données MongoDB ou le nom de collection dans Key Vault.
Dans cette étape, vous utilisez la commande az cosmosdb keys list pour récupérer la chaîne de connexion MongoDB. Vous utilisez ensuite la commande az keyvault secret set pour stocker à la fois la chaîne de connexion et une clé secrète générée de manière aléatoire dans Key Vault.
#!/bin/bash ACCOUNT_NAME="msdocs-cosmos-db-account-name" MONGO_CONNECTION_STRING=$(az cosmosdb keys list \ --name "$ACCOUNT_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --type connection-strings \ --query "connectionStrings[?description=='Primary MongoDB Connection String'].connectionString" -o tsv) SECRET_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9') # This key is cryptographically secure, using OpenSSL’s strong random number generator. az keyvault secret set \ --vault-name "$KEYVAULT_NAME" \ --name "MongoConnectionString" \ --value "$MONGO_CONNECTION_STRING" az keyvault secret set \ --vault-name "$KEYVAULT_NAME" \ --name "MongoSecretKey" \ --value "$SECRET_KEY"
Configurer l’application web pour utiliser les secrets Kay Vault
Pour accéder en toute sécurité aux secrets au moment de l’exécution, l’application web doit être configurée pour référencer les secrets stockés dans Azure Key Vault. Cette étape s’effectue à l’aide de références Key Vault, qui injectent les valeurs secrètes dans l’environnement de l’application via son identité managée affectée par le système.
Cette approche évite les secrets de codage en dur et permet à l’application de récupérer en toute sécurité des valeurs sensibles telles que la chaîne de connexion MongoDB et la clé secrète pendant l’exécution.
Dans cette étape, vous utilisez la commande az webapp config appsettings set pour ajouter des paramètres d’application qui référencent les secrets Key Vault. Plus précisément, cela définit les paramètres d'application
MongoConnectionStringetMongoSecretKeypour référencer les secrets correspondants stockés dans Key Vault.#!/bin/bash MONGODB_NAME="restaurants_reviews" MONGODB_COLLECTION_NAME="restaurants_reviews" az webapp config appsettings set \ --resource-group "$RESOURCE_GROUP_NAME" \ --name "$APP_SERVICE_NAME" \ --settings \ CONNECTION_STRING="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoConnectionString)" \ SECRET_KEY="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoSecretKey)" \ DB_NAME="$MONGODB_NAME" \ COLLECTION_NAME="$MONGODB_COLLECTION_NAME"
Activer le déploiement continu à partir d’ACR
L’activation du déploiement continu permet à l’application web d’extraire et d’exécuter automatiquement la dernière image conteneur chaque fois qu’elle est envoyée à Azure Container Registry (ACR). Cela réduit les étapes de déploiement manuel et permet de garantir que votre application reste à jour.
Remarque
À l’étape suivante, vous allez inscrire un webhook dans ACR pour notifier l’application web lorsqu’une nouvelle image est envoyée(s).
Dans cette étape, vous utilisez la commande az webapp deployment container config pour activer le déploiement continu d’ACR vers l’application web.
#!/bin/bash az webapp deployment container config \ --name "$APP_SERVICE_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --enable-cd true
Inscrire un webhook ACR pour le déploiement continu
Pour automatiser les déploiements, inscrivez un webhook dans Azure Container Registry (ACR) qui avertit l’application web chaque fois qu’une nouvelle image conteneur est envoyée (push). Le webhook permet à l’application d’extraire et d’exécuter automatiquement la dernière version.
Le webhook configuré dans Azure Container Registry (ACR) envoie une requête POST au point de terminaison SCM de l’application web (SERVICE_URI) chaque fois qu’une nouvelle image est envoyée au dépôt msdocspythoncontainerwebapp. Cette action déclenche l’application web pour extraire et déployer l’image mise à jour, en effectuant le pipeline de déploiement continu entre ACR et Azure App Service.
Remarque
L’URI du webhook doit suivre ce format :
https://<app-name>.scm.azurewebsites.net/api/registry/webhook
Il doit se terminer par /api/registry/webhook. Si vous recevez une erreur d’URI, vérifiez que le chemin d’accès est correct.
Dans cette étape, utilisez la commande az acr webhook create pour inscrire le webhook et le configurer pour qu’il se déclenche sur
pushdes événements.#!/bin/bash CREDENTIAL=$(az webapp deployment list-publishing-credentials \ --resource-group "$RESOURCE_GROUP_NAME" \ --name "$APP_SERVICE_NAME" \ --query publishingPassword --output tsv) # Web app publishing credentials may not be available immediately. In production, poll until non-empty. SERVICE_URI="https://$APP_SERVICE_NAME:$CREDENTIAL@$APP_SERVICE_NAME.scm.azurewebsites.net/api/registry/webhook" az acr webhook create \ --name webhookforwebapp \ --registry "$REGISTRY_NAME" \ --scope msdocspythoncontainerwebapp:* \ --uri "$SERVICE_URI" \ --actions push
Parcourir le site
Pour vérifier que l’application web est en cours d’exécution, ouvrez https://<website-name>.azurewebsites.net, en remplaçant <website-name> par le nom de votre App Service. Vous devriez voir l’exemple d’application de révision de restaurant. Il peut prendre quelques instants pour charger la première fois.
Une fois le site affiché, essayez d’ajouter un restaurant et de soumettre une révision pour confirmer que l’application fonctionne correctement.
Remarque
La commande az webapp browse n’est pas prise en charge dans Cloud Shell. Si vous utilisez Cloud Shell, ouvrez manuellement un navigateur et accédez à l’URL du site.
Si vous utilisez Azure CLI localement, vous pouvez utiliser la commande az webapp browse pour ouvrir le site dans votre navigateur par défaut :
az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
Remarque
La commande az webapp browse n’est pas prise en charge dans Cloud Shell. Ouvrez une fenêtre de navigateur et accédez à l’URL du site web à la place.
Résoudre les problèmes de déploiement
Si vous ne voyez pas l’exemple d’application, essayez les étapes suivantes.
- Avec le déploiement de conteneurs et App Service, vérifiez toujours la page Deployment Center / Logs dans le portail Azure. Vérifiez que le conteneur a été extrait et est en cours d’exécution. L’extraction initiale et l’exécution du conteneur peuvent prendre quelques instants.
- Essayez de redémarrer App Service et vérifiez si cela résout votre problème.
- S’il existe des erreurs de programmation, ces erreurs s’affichent dans les journaux d’application. Sur la page du Portail Azure pour App Service, sélectionnez Diagnostiquer et résoudre les problèmes/Journaux d’application.
- L’exemple d’application s’appuie sur une connexion à Azure Cosmos DB pour MongoDB. Vérifiez que App Service a des paramètres d’application avec les informations de connexion correctes.
- Vérifiez que l’identité managée est activée pour App Service et est utilisée dans le Centre de déploiement. Sur la page du portail Azure pour l’App Service, rendez-vous dans la ressource Deployment Center de l’App Service et confirmez que Authentication est défini sur Managed Identity.
- Vérifiez que le webhook est défini dans Azure Container Registry. Le webhook permet au service App de télécharger l’image du conteneur. En particulier, vérifiez que l’URI du service se termine par « /api/registry/webhook ». Si ce n’est pas le cas, ajoutez-le.
- Différentes références SKU Azure Container Registry ont différentes fonctionnalités, notamment le nombre de webhooks. Si vous réutilisez un registre existant, vous pouvez voir le message suivant : « Quota dépassé pour les webhooks de type de ressource pour la référence SKU Essentiel du registre. En savoir plus sur les différents quotas de référence SKU et le processus de mise à niveau : https://aka.ms/acr/tiers". Si vous voyez ce message, utilisez un nouveau registre ou réduisez le nombre de webhooks de registre en cours d’utilisation.