Exercice – Configurer Azure Container Apps

Terminée

Dans cette unité, vous créez un groupe de ressources Azure qui contient les ressources de l’application. Vous configurez ensuite la base de données PostgreSQL à l’aide d’Azure CLI. Enfin, vous configurez l’application Quarkus pour accéder à la base de données PostgreSQL distante. Exécutez les commandes dans l’environnement Bash local configuré dans les conditions préalables. Sur Windows, utilisez votre distribution WSL 2 configurée.

Préparer l’environnement de travail

Revenez à l’interpréteur de commandes Bash que vous avez utilisé pour les commandes Maven antérieures, dans le répertoire de projet todo généré. Si le mode de développement de Quarkus est toujours en cours d’exécution, appuyez sur Ctrl+C avant de continuer. Utilisez cet interpréteur de commandes pour les exports suivants et laissez-le ouvert pendant le démarrage, l’empaquetage et le déploiement de l’application.

Utilisez Azure CLI 2.87.0 ou version ultérieure. Vous devez avoir l’autorisation de créer le groupe de ressources et les ressources et d’enregistrer les fournisseurs de ressources, tels que Contributeur ou Propriétaire dans l’étendue de l’abonnement. La politique d’abonnement et le quota peuvent imposer des restrictions supplémentaires.

Connectez-vous à Azure dans cet environnement Bash local à l’aide du flux de connexion interactif Azure CLI, y compris toute authentification multifacteur requise. Remplacez <subscription-id> par votre ID d’abonnement prévu, puis sélectionnez et affichez cet abonnement :

az login
az account set --subscription "<subscription-id>"
az account show --query "{name:name,id:id}" --output table

Vérifiez que l’abonnement affiché est celui que vous envisagez d’utiliser avant de créer des ressources facturables. La connexion à Cloud Shell n’ouvre pas de session sur une CLI locale distincte. Terminez chaque commande Azure correctement avant de continuer.

Vous devez configurer certaines variables d’environnement. Voici quelques notes sur les variables que vous allez créer :

Variable Description
AZ_PROJECT Valeur de projet en minuscules avec un suffixe d’unicité. Conservez le nom de la variable inchangé ; le suffixe appartient à sa valeur.
AZ_RESOURCE_GROUP Nom du groupe de ressources qui contient les ressources.
AZ_LOCATION Région Azure. Nous vous recommandons d’utiliser une région proche de l’endroit où vous vivez. Pour obtenir la liste des régions disponibles, entrez az account list-locations à une invite de commandes.
AZ_CONTAINERAPP Nom de l’instance Azure Container Apps qui contient les conteneurs.
AZ_CONTAINERAPP_ENV Nom de l’environnement Azure Container Apps.
AZ_POSTGRES_SERVER_NAME Nom global unique du serveur flexible PostgreSQL. Utilisez 3 à 63 caractères composés de lettres minuscules, de chiffres et de traits d’union. La valeur générée psql${AZ_PROJECT} suit ces règles ; choisissez un suffixe différent si ce nom n’est pas disponible.
AZ_POSTGRES_DB_NAME Nom de la base de données de l’application. Vous créez cette base de données explicitement après avoir créé le serveur.
AZ_POSTGRES_USERNAME Nom d’utilisateur de l’administrateur de votre serveur de base de données PostgreSQL.
AZ_POSTGRES_PASSWORD Mot de passe administrateur pour votre serveur de base de données PostgreSQL. Saisissez un mot de passe sécurisé lorsque l’invite s’affiche sans message.

Remarque

Vous pouvez nommer vos ressources Azure de quelque manière que vous le souhaitez, mais nous vous recommandons de consulter exemples d’abréviations pour les ressources Azure. Cet article fournit des exemples d’abréviations pour de nombreuses ressources Azure (par exemple, rg pour les groupes de ressources et les ca pour les applications conteneur).

Exécutez le bloc suivant une fois pour configurer les variables. Sélectionnez une région appropriée pour votre abonnement et entrez un mot de passe qui répond aux exigences du service PostgreSQL. L’invite de mot de passe n’affiche pas ce que vous tapez.

export AZ_PROJECT="quarkus-${RANDOM}${RANDOM}"
export AZ_RESOURCE_GROUP="rg${AZ_PROJECT}"
export AZ_LOCATION="eastus"
export AZ_CONTAINERAPP="ca${AZ_PROJECT}"
export AZ_CONTAINERAPP_ENV="cae${AZ_PROJECT}"
export AZ_POSTGRES_DB_NAME="postgres${AZ_PROJECT}"
export AZ_POSTGRES_SERVER_NAME="psql${AZ_PROJECT}"
export AZ_POSTGRES_USERNAME="pgadmin"

read -r -s -p "PostgreSQL administrator password: " AZ_POSTGRES_PASSWORD
printf '\n'
export AZ_POSTGRES_PASSWORD

Le suffixe aléatoire réduit les collisions de nom de ressource ; il ne garantit pas la disponibilité globale. Si le nom du serveur PostgreSQL n’est pas disponible, choisissez un autre suffixe pour AZ_POSTGRES_SERVER_NAME avant de créer le serveur. Conservez les autres identificateurs de ressource inchangés.

Ces variables d’environnement sont utilisées dans le reste de ce module. Conservez-les dans cet Interpréteur de commandes Bash et ne relancez pas le bloc de génération aléatoire du nom et du mot de passe entre les unités. Le terminal distinct utilisé pour les requêtes HTTP n’a pas besoin du mot de passe de la base de données.

Créez ensuite un groupe de ressources :

az group create \
    --name "$AZ_RESOURCE_GROUP" \
    --location "$AZ_LOCATION"

Créer une instance d’Azure Database pour PostgreSQL

Vous allez maintenant créer un serveur PostgreSQL 16 managé ordinaire avec la référence SKU B1ms burstable et 32 Gio de stockage SSD Premium. La région sélectionnée doit prendre en charge cette version et cette référence SKU et disposer d’une capacité d’abonnement disponible. Résolvez tout quota ou toute erreur de stratégie avant de continuer.

Enregistrez le fournisseur PostgreSQL et attendez la fin de l’inscription :

az provider register --namespace Microsoft.DBforPostgreSQL --wait

Important

Cette opération autorise temporairement les tentatives de connexion à la base de données à partir de toutes les adresses IPv4 publiques. L’authentification est toujours requise. Utilisez un nouveau serveur et un groupe de ressources dédiés à l’exercice, effectuez la restriction de pare-feu ultérieure et supprimez les ressources de l’exercice une fois l’exercice terminé. Ce paramètre réseau initial n’est pas une recommandation pour un environnement de production.

Créez le serveur PostgreSQL :

az postgres flexible-server create \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --location "$AZ_LOCATION" \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --admin-user "$AZ_POSTGRES_USERNAME" \
    --admin-password="$AZ_POSTGRES_PASSWORD" \
    --public-access All \
    --tier Burstable \
    --sku-name Standard_B1ms \
    --storage-type Premium_LRS \
    --storage-size 32 \
    --version 16 \
    --yes \
    --output none

L’option --public-access All active le point de terminaison public et crée l’unique règle de pare-feu pour toutes les adresses utilisée plus loin dans ce module. L'exception Azure-services ultérieure utilise toujours ce point de terminaison public et autorise les tentatives de connexion à partir de ressources Azure, y compris les abonnements d'autres clients. Il ne s’agit pas d’un accès privé ou réservé aux applications.

Une fois la création du serveur réussie, créez explicitement la base de données d’application :

az postgres flexible-server db create \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --server-name "$AZ_POSTGRES_SERVER_NAME" \
    --name "$AZ_POSTGRES_DB_NAME" \
    --output none

Vérifiez que la base de données existe avant de démarrer l’application :

az postgres flexible-server db show \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --server-name "$AZ_POSTGRES_SERVER_NAME" \
    --name "$AZ_POSTGRES_DB_NAME" \
    --query name \
    --output tsv

Le nom retourné doit correspondre à la valeur de AZ_POSTGRES_DB_NAME. Ces commandes de base de données utilisent --server-name pour le serveur et --name pour la base de données.

Configurer Quarkus pour accéder à la base de données PostgreSQL

Obtenez le nom de domaine complet (FQDN) du serveur et générez une URL JDBC sans informations d’identification :

export AZ_POSTGRES_HOST=$(
    az postgres flexible-server show \
        --resource-group "$AZ_RESOURCE_GROUP" \
        --name "$AZ_POSTGRES_SERVER_NAME" \
        --query fullyQualifiedDomainName \
        --output tsv
)
export AZ_POSTGRES_JDBC_URL="jdbc:postgresql://${AZ_POSTGRES_HOST}:5432/${AZ_POSTGRES_DB_NAME}?sslmode=require"

Cette URL utilise sslmode=require pour exiger un transport chiffré. Le nom d’utilisateur et le mot de passe sont fournis séparément par le biais des propriétés de source de données, de sorte que les caractères tels que & dans un mot de passe ne sont pas analysés en tant que paramètres d’URL. N’imprimez pas ou ne consignez pas les valeurs d’informations d’identification.

Le chiffrement n’est pas la vérification de l’identité du certificat. sslmode=require ne vérifie pas le certificat de serveur et le nom d’hôte. Si vous avez besoin de cette vérification, suivez les instructions pgJDBC verify-full et les instructions Azure relatives à la confiance accordée au certificat, y compris la configuration de la racine de confiance. La simple modification du mode sans configurer la confiance n’est pas une procédure complète de validation de certificat.

Configurer l’application Quarkus pour se connecter à la base de données PostgreSQL

Dans src/main/resources/application.properties, remplacez l’URL de la source de données sans profil existante et les entrées de génération de schéma par les quatre lignes suivantes. Supprimez également toutes les entrées de nom d’utilisateur ou de mot de passe de source de données sans profil. Conservez les expressions ${...} littérales dans le fichier ; ne les remplacez pas par des valeurs d’informations d’identification. Conservez les paramètres non concernés inchangés.

%dev,prod.quarkus.hibernate-orm.database.generation=update
%dev,prod.quarkus.datasource.jdbc.url=${AZ_POSTGRES_JDBC_URL}
%dev,prod.quarkus.datasource.username=${AZ_POSTGRES_USERNAME}
%dev,prod.quarkus.datasource.password=${AZ_POSTGRES_PASSWORD}

Ces paramètres s’appliquent aux profils dev et prod, pas aux tests automatisés. Le mode de développement utilise la base de données Azure pour cette unité, et l’application déployée l’utilise en mode de production. Les tests utilisent un PostgreSQL Dev Service distinct. Conservez Docker en cours d’exécution lors du test ou de l’empaquetage de l’application. Le cycle de vie Maven package exécute les tests ; il ne doit pas ajouter d’enregistrements de test à la base de données Azure.

N’exportez pas les remplacements sans profil QUARKUS_DATASOURCE_*. Si vous en avez déjà défini dans cet interpréteur de commandes, supprimez-les avant de procéder aux tests ou à la création du package, car ils annulent cette séparation. Les AZ_ variables sont résolues uniquement par les expressions à portée de profil. Pour plus d’informations, consultez la référence de configuration de Quarkus 3.18.4.

Exécutez l'application Quarkus localement pour tester la connexion à la base de données distante.

Un processus hérite des variables d’environnement au démarrage. Exporter AZ_POSTGRES_* dans un autre terminal ne met pas à jour un processus Quarkus déjà en cours d’exécution, et modifier application.properties ne suffit pas à lui seul pour cette transition.

Vérifiez que le processus de développement précédent s’est arrêté en appuyant sur Ctrl+C dans son terminal si nécessaire. À partir du todo répertoire de l’interpréteur de commandes Bash contenant les variables de ressources et de base de données exportées, démarrez l’application :

./mvnw clean quarkus:dev

Une fois que Quarkus est en cours d’exécution, créez quelques tâches à l’aide des commandes cURL suivantes dans un deuxième terminal Bash local. Laissez l’interpréteur de commandes contenant la variable exécuter Quarkus :

curl --header "Content-Type: application/json" \
    --request POST \
    --data '{"description":"Take Quarkus MS Learn","details":"Take the MS Learn on deploying Quarkus to Azure Container Apps","done": "true"}' \
    http://127.0.0.1:8080/api/todos

curl --header "Content-Type: application/json" \
    --request POST \
    --data '{"description":"Take Azure Container Apps MS Learn","details":"Take the ACA Learn module","done": "false"}' \
    http://127.0.0.1:8080/api/todos

Ensuite, vérifiez que les tâches se trouvent dans la base de données en accédant au point de terminaison GET défini dans l’application to-do :

curl http://127.0.0.1:8080/api/todos

La réponse doit contenir les descriptions que vous avez envoyées, similaires à la sortie suivante. Les identificateurs, les horodatages et l’ordre peuvent varier, et répéter une requête POST crée un autre élément.

[
  {
    "id": 1,
    "description": "Take Quarkus MS Learn",
    "details": "Take the MS Learn on deploying Quarkus to Azure Container Apps",
    "done": true,
    "createdAt": "2025-02-26T08:03:28.390854Z"
  },
  {
    "id": 2,
    "description": "Take Azure Container Apps MS Learn",
    "details": "Take the ACA Learn module",
    "done": false,
    "createdAt": "2025-02-26T08:03:34.142249Z"
  }
]

Si la réponse contient les éléments que vous avez créés, vous avez correctement exécuté l’application Quarkus et vous êtes connecté à la base de données PostgreSQL distante.

Avant de passer à l’empaquetage dans l’unité suivante, revenez au terminal exécutant Quarkus et appuyez sur Ctrl+C. Gardez l’interpréteur de commandes Bash ouvert dans le todo répertoire avec toutes les variables exportées intactes. Ne réexécutez pas le bloc de nom aléatoire et de mot de passe ; utilisez ce même interpréteur de commandes pour l’empaquetage et le déploiement.