Partager via


Tutoriel : Se connecter à une base de données PostgreSQL à partir d’une application de conteneur Java Quarkus sans secrets à l’aide d’une identité managée

Azure Container Apps offre une identité managée pour votre application, qui constitue une solution clé en main permettant de sécuriser l’accès à Azure Database pour PostgreSQL et à d’autres services Azure. Les identités managées dans Container Apps sécurisent votre application en éliminant les secrets de celle-ci, par exemple les informations d’identification dans les variables d’environnement.

Ce tutoriel vous guide tout au long du processus de création, de configuration, de déploiement et de mise à l’échelle des applications de conteneur Java sur Azure. À la fin de ce tutoriel, vous disposerez d’une application Quarkus stockant des données dans une base de données PostgreSQL avec une identité managée s’exécutant sur Container Apps.

Contenu :

  • Configurez une application Quarkus pour vous authentifier à l’aide de Microsoft Entra ID avec une base de données PostgreSQL.
  • Créez un registre de conteneurs Azure et envoyez-lui (par push) une image d’application Java.
  • Créez une application de conteneur dans Azure.
  • Créez une base de données PostgreSQL dans Azure.
  • Connectez-vous à une base de données PostgreSQL avec une identité managée à l’aide d’un connecteur de services.

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

1. Prérequis

2. Créer un registre de conteneurs

Créez un groupe de ressources avec la commande az group create. Un groupe de ressources Azure est un conteneur logique dans lequel les ressources Azure sont déployées et gérées.

L’exemple suivant crée un groupe de ressources nommé myResourceGroup dans la région Azure USA Est.

az group create --name myResourceGroup --location eastus

Créez une instance de registre de conteneurs Azure à l’aide de la commande az acr create. Le nom du registre doit être unique dans Azure, contenir entre 5 et 50 caractères alphanumériques. Toutes les lettres doivent être indiqués en minuscules. mycontainerregistry007'exemple suivant. Mettez à jour le nom de façon à utiliser une valeur unique.

az acr create \
    --resource-group myResourceGroup \
    --name mycontainerregistry007 \
    --sku Basic

3. Cloner l’exemple d’application et préparer l’image de conteneur

Ce tutoriel utilise un exemple d'application de liste Fruits avec une interface utilisateur Web qui appelle une API REST Quarkus soutenue par Azure Database for PostgreSQL. Le code pour l’application est disponible sur GitHub. Pour en savoir plus sur l'écriture d'applications Java à l'aide de Quarkus et de PostgreSQL, consultez le guide Quarkus Hibernate ORM avec Panache et le guide Quarkus Datasource.

Exécutez les commandes suivantes dans votre terminal pour cloner l’exemple de dépôt et configurer l’exemple d’environnement d’application.

git clone https://github.com/quarkusio/quarkus-quickstarts
cd quarkus-quickstarts/hibernate-orm-panache-quickstart

Modifier votre projet

  1. Ajoutez les dépendances nécessaires au fichier BOM de votre projet.

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-providers-jdbc-postgresql</artifactId>
        <version>1.0.0-beta.1</version>
    </dependency>
    
  2. Configurez les propriétés de l’application Quarkus.

    La configuration de Quarkus se trouve dans le fichier src/main/resources/application.properties. Ouvrez ce fichier dans votre éditeur et observez plusieurs propriétés par défaut. Les propriétés préfixées avec%prod sont utilisées uniquement lorsque l’application est générée et déployée, par exemple lorsqu’elle est déployée sur Azure App Service. Lorsque l’application s’exécute localement, les propriétés %prod sont ignorées. De même, les propriétés %dev sont utilisées dans le mode Live Coding /Dev de Analysisus, et les propriétés %test sont utilisées pendant les tests continus.

    Supprimez le contenu existant dans application.properties et remplacez-le par ce qui suit pour configurer la base de données pour les modes de développement, de test et de production :

    quarkus.package.type=uber-jar
    
    quarkus.hibernate-orm.database.generation=drop-and-create
    quarkus.datasource.db-kind=postgresql
    quarkus.datasource.jdbc.max-size=8
    quarkus.datasource.jdbc.min-size=2
    quarkus.hibernate-orm.log.sql=true
    quarkus.hibernate-orm.sql-load-script=import.sql
    quarkus.datasource.jdbc.acquisition-timeout = 10
    
    %dev.quarkus.datasource.username=${AZURE_CLIENT_NAME}
    %dev.quarkus.datasource.jdbc.url=jdbc:postgresql://${DBHOST}.postgres.database.azure.com:5432/${DBNAME}?\
    authenticationPluginClassName=com.azure.identity.providers.postgresql.AzureIdentityPostgresqlAuthenticationPlugin\
    &sslmode=require\
    &azure.clientId=${AZURE_CLIENT_ID}\
    &azure.clientSecret=${AZURE_CLIENT_SECRET}\
    &azure.tenantId=${AZURE_TENANT_ID}
    
    %prod.quarkus.datasource.username=${AZURE_MI_NAME}
    %prod.quarkus.datasource.jdbc.url=jdbc:postgresql://${DBHOST}.postgres.database.azure.com:5432/${DBNAME}?\
    authenticationPluginClassName=com.azure.identity.providers.postgresql.AzureIdentityPostgresqlAuthenticationPlugin\
    &sslmode=require
    
    %dev.quarkus.class-loading.parent-first-artifacts=com.azure:azure-core::jar,\
    com.azure:azure-core-http-netty::jar,\
    io.projectreactor.netty:reactor-netty-core::jar,\
    io.projectreactor.netty:reactor-netty-http::jar,\
    io.netty:netty-resolver-dns::jar,\
    io.netty:netty-codec::jar,\
    io.netty:netty-codec-http::jar,\
    io.netty:netty-codec-http2::jar,\
    io.netty:netty-handler::jar,\
    io.netty:netty-resolver::jar,\
    io.netty:netty-common::jar,\
    io.netty:netty-transport::jar,\
    io.netty:netty-buffer::jar,\
    com.azure:azure-identity::jar,\
    com.azure:azure-identity-providers-core::jar,\
    com.azure:azure-identity-providers-jdbc-postgresql::jar,\
    com.fasterxml.jackson.core:jackson-core::jar,\
    com.fasterxml.jackson.core:jackson-annotations::jar,\
    com.fasterxml.jackson.core:jackson-databind::jar,\
    com.fasterxml.jackson.dataformat:jackson-dataformat-xml::jar,\
    com.fasterxml.jackson.datatype:jackson-datatype-jsr310::jar,\
    org.reactivestreams:reactive-streams::jar,\
    io.projectreactor:reactor-core::jar,\
    com.microsoft.azure:msal4j::jar,\
    com.microsoft.azure:msal4j-persistence-extension::jar,\
    org.codehaus.woodstox:stax2-api::jar,\
    com.fasterxml.woodstox:woodstox-core::jar,\
    com.nimbusds:oauth2-oidc-sdk::jar,\
    com.nimbusds:content-type::jar,\
    com.nimbusds:nimbus-jose-jwt::jar,\
    net.minidev:json-smart::jar,\
    net.minidev:accessors-smart::jar,\
    io.netty:netty-transport-native-unix-common::jar
    

Générer une image Docker et l’envoyer (push) au registre de conteneurs

  1. Générez l’image de conteneur.

    Exécutez la commande suivante pour générer l’image de l’application Quarkus. Vous devez la marquer avec le nom complet de votre serveur de connexion au registre. Le nom du serveur de connexion est au format <nom_registre>.azurecr.io (obligatoirement en minuscules uniquement). Par exemple : monregistreconteneurs007.azurecr.io. Remplacez le nom par votre propre nom de registre.

    mvnw quarkus:add-extension -Dextensions="container-image-jib"
    mvnw clean package -Pnative -Dquarkus.native.container-build=true -Dquarkus.container-image.build=true -Dquarkus.container-image.registry=mycontainerregistry007 -Dquarkus.container-image.name=quarkus-postgres-passwordless-app -Dquarkus.container-image.tag=v1
    
  2. Connectez-vous au registre.

    Avant d’envoyer (push) des images conteneur, vous devez vous connecter au registre. Pour ce faire, utilisez la commande   . Spécifiez uniquement le nom de la ressource du registre au moment de la connexion avec l’interface Azure CLI. N’utilisez pas le nom complet du serveur de connexion.

    az acr login --name <registry-name>
    

    Une fois l’opération terminée, la commande retourne un message Login Succeeded.

  3. Envoyez (push) l’image vers le registre.

    Utilisez [docker push][docker-push] pour envoyer l’image vers l’instance du registre. Remplacez mycontainerregistry007 par le nom du serveur de connexion de votre instance de registre. Cet exemple crée le référentiel quarkus-postgres-passwordless-app qui contient l’image quarkus-postgres-passwordless-app:v1.

    docker push mycontainerregistry007/quarkus-postgres-passwordless-app:v1
    

4. Créer une application de conteneur sur Azure

  1. Créez une instance Container Apps en exécutant la commande suivante. Veillez à remplacer la valeur des variables d’environnement par le nom et l’emplacement réels que vous souhaitez utiliser.

    RESOURCE_GROUP="myResourceGroup"
    LOCATION="eastus"
    CONTAINERAPPS_ENVIRONMENT="my-environment"
    
    az containerapp env create \
        --resource-group $RESOURCE_GROUP \
        --name $CONTAINERAPPS_ENVIRONMENT \
        --location $LOCATION
    
  2. Créez une application de conteneur avec votre image d’application en exécutant la commande suivante. Remplacez les espaces réservés par vos valeurs. Pour trouver les détails du compte administrateur du registre de conteneurs, consultez S’authentifier avec un registre de conteneurs Azure

    CONTAINER_IMAGE_NAME=quarkus-postgres-passwordless-app:v1
    REGISTRY_SERVER=mycontainerregistry007
    REGISTRY_USERNAME=<REGISTRY_USERNAME>
    REGISTRY_PASSWORD=<REGISTRY_PASSWORD>
    
    az containerapp create \
        --resource-group $RESOURCE_GROUP \
        --name my-container-app \
        --image $CONTAINER_IMAGE_NAME \
        --environment $CONTAINERAPPS_ENVIRONMENT \
        --registry-server $REGISTRY_SERVER \
        --registry-username $REGISTRY_USERNAME \
        --registry-password $REGISTRY_PASSWORD
    

5. Créer et connecter une base de données PostgreSQL avec une connectivité d’identité

Ensuite, créez une base de données PostgreSQL et configurez votre application de conteneur pour vous connecter à une base de données PostgreSQL avec une identité managée affectée par le système. L’application Quarkus se connecte à cette base de données et stocke ses données lors de l’exécution, entraînant la persistance de l’état de l’application, quel que soit l’endroit où vous exécutez cette dernière.

  1. Créez le service de la base de données.

    DB_SERVER_NAME='msdocs-quarkus-postgres-webapp-db'
    ADMIN_USERNAME='demoadmin'
    ADMIN_PASSWORD='<admin-password>'
    
    az postgres flexible-server create \
        --resource-group $RESOURCE_GROUP \
        --name $DB_SERVER_NAME \
        --location $LOCATION \
        --admin-user $DB_USERNAME \
        --admin-password $DB_PASSWORD \
        --sku-name GP_Gen5_2
    

Les paramètres suivants sont utilisés dans la commande Azure CLI ci-dessus :

  • resource-group → Utilisez le nom du groupe de ressources dans lequel vous avez créé l’application web, par exemple msdocs-quarkus-postgres-webapp-rg.

  • name → Nom du serveur de base de données PostgreSQL. Ce nom doit être unique dans Azure (le point de terminaison de serveur devient https://<name>.postgres.database.azure.com). Les caractères autorisés sont A-Z, 0-9 et -. Une bonne approche consiste à utiliser une combinaison du nom de votre société et d’un identificateur de serveur. (msdocs-quarkus-postgres-webapp-db)

  • location → Utilisez l’emplacement que vous avez utilisé pour l’application web.

  • admin-user → Nom d’utilisateur du compte administrateur. Ce ne peut pas être azure_superuser, admin, administrator, root, guest ou public. Par exemple, demoadmin convient.

  • admin-password → Mot de passe de l’utilisateur administrateur. Il doit contenir entre 8 et 128 caractères de trois des catégories suivantes : Lettres majuscules, lettres minuscules, chiffres et caractères non alphanumériques.

    Important

    Lorsque vous créez des noms d’utilisateur ou des mots de passe, n’utilisez pas le caractère $. Plus tard dans ce tutoriel, vous créerez des variables d’environnement avec ces valeurs où le caractère $ a une signification spéciale dans le conteneur Linux utilisé pour exécuter des applications Java.

  • public-accessNone qui définit le serveur en mode d’accès public sans règles de pare-feu. Les règles seront créées à une étape ultérieure.

  • sku-name → Nom du niveau tarifaire et de la configuration de calcul, par exemple GP_Gen5_2. Pour plus d’informations, consultez Niveaux tarifaires d’Azure Database pour PostgreSQL.

  1. Créez une base de données nommée fruits dans le service PostgreSQL avec cette commande :

    az postgres flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $DB_SERVER_NAME \
        --database-name fruits
    
  2. Installez l’extension sans mot de passe Connecteur de services pour Azure CLI :

    az extension add --name serviceconnector-passwordless --upgrade
    
  3. Connectez la base de données à l’application de conteneur avec une identité managée affectée par le système à l’aide de la commande de connexion.

    az containerapp connection create postgres-flexible \
        --resource-group $RESOURCE_GROUP \
        --name my-container-app \
        --target-resource-group $RESOURCE_GROUP \
        --server $DB_SERVER_NAME \
        --database fruits \
        --managed-identity
    

6. Passer en revue les modifications apportées

Vous pouvez trouver l’URL (FQDN) de l’application à l’aide de la commande suivante :

az containerapp list --resource-group $RESOURCE_GROUP

Lorsque la nouvelle page web affiche votre liste de fruits, votre application se connecte à la base de données à l’aide de l’identité managée. Vous devez désormais être en mesure de modifier la liste de fruits comme auparavant.

Nettoyer les ressources

Au cours des étapes précédentes, vous avez créé des ressources Azure au sein d’un groupe de ressources. Si vous ne pensez pas avoir besoin de ces ressources à l’avenir, supprimez le groupe de ressources en exécutant la commande suivante dans Cloud Shell :

az group delete --name myResourceGroup

L’exécution de cette commande peut prendre une minute.

Étapes suivantes

Découvrez-en plus sur l’exécution des applications Java sur Azure dans le guide du développeur.