Tutoriel : Se connecter à une base de données MySQL à partir de Java JBoss EAP sur Azure App Service

Dans ce tutoriel, vous allez apprendre à connecter une application JBoss EAP Java sur Azure App Service à une base de données Azure Database pour MySQL à l’aide d’une identité managée. App Service peut utiliser identité managée pour fournir un accès sécurisé à Azure Database pour MySQL et à d’autres services Azure. Une identité managée élimine la nécessité d’utiliser des secrets dans votre application, comme les informations d’identification dans les variables d’environnement.

Ce tutoriel utilise Azure CLI commandes pour effectuer les tâches suivantes :

  • Crée un serveur Azure Database pour MySQL et une base de données.
  • Déploie un exemple d’application JBoss EAP sur App Service à l’aide d’un package WAR.
  • Configure l’application web Spring Boot pour utiliser l’authentification Microsoft Entra avec la base de données MySQL.
  • Connecte l’application web à la base de données MySQL à l’aide de Service Connector avec l’authentification d’identité managée.

Prérequis

  • Un abonnement Azure avec des autorisations d’attribution de rôle Microsoft Entra et des autorisations d’écriture de ressources Azure, dans une région Azure qui prend en charge le Service Connector et dispose de suffisamment de soutien et de quota pour le service App Service pour le didacticiel.

  • Les fournisseurs de ressources Microsoft.ServiceLinker et Microsoft.DBforMySQL inscrits dans votre abonnement Azure. Vous pouvez exécuter az provider register -n Microsoft.[service] pour inscrire les fournisseurs.

  • Git pour accéder à l’exemple de dépôt et le cloner.

  • Accès à Azure Cloud Shell pour exécuter les étapes du didacticiel, ou si vous préférez exécuter localement, les prérequis et les étapes suivants :

    • Java JDK installé

    • Maven installé

    • jq installé

    • Client MySQL installé

    • Azure CLI 2.46.0 ou version ultérieure installée. Pour vérifier votre version, exécutez az --version. Pour effectuer la mise à niveau, exécutez az upgrade.

      Si vous exécutez localement :

      1. Connectez-vous à Azure à l’aide de az login et suivez les invites.
      2. Si vous avez plusieurs abonnements Azure connectés à vos informations d’identification de connexion, exécutez az account set --subscription <subscription-ID> pour sélectionner l’abonnement approprié.

Configurer votre environnement

  1. Installez les extensions Azure CLI suivantes :

    az extension add --name serviceconnector-passwordless --upgrade
    az extension add --name rdbms-connect
    
  2. Exécutez les commandes suivantes pour cloner l’exemple de référentiel et modifier les répertoires dans l’exemple de dossier de projet d’application. Exécutez toutes les commandes restantes à partir de ce dossier.

    git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
    cd Passwordless-Connections-for-Java-Apps/JakartaEE/jboss-eap/
    
  3. Définissez les variables d’environnement suivantes pour le didacticiel, en remplaçant l’espace <region> réservé par une valeur valide. LOCATION doit être une région Azure où votre abonnement dispose d’un quota suffisant pour créer les ressources Azure et aucune restriction sur les services.

    LOCATION="<region>"
    RESOURCE_GROUP="mysql-mi-webapp"
    
  4. Créez un groupe de ressources Azure pour contenir toutes les ressources du projet. Le nom du groupe de ressources est mis en cache et appliqué automatiquement aux commandes suivantes.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    

Créer une base de données Azure pour MySQL

Créez un serveur et une base de données Azure Database pour MySQL dans votre abonnement. L’application Spring Boot se connecte à cette base de données et stocke ses données lors de l’exécution, en persistant l’état de l’application, quel que soit l’emplacement où vous exécutez l’application.

  1. Exécutez la commande suivante pour créer un serveur Azure Database pour MySQL. Le nom MYSQL_HOST doit être unique dans tous les Azure.

    Remarque

    Bien que la commande définit un compte d'administrateur, le compte n'est pas utilisé, car le compte d'administrateur Microsoft Entra effectue toutes les tâches administratives.

    export MYSQL_ADMIN_USER=azureuser
    export MYSQL_ADMIN_PASSWORD="AdminPassword1"
    export RAND_ID=$RANDOM
    export MYSQL_HOST="mysql-mi-$RAND_ID"
    az mysql flexible-server create \
        --name $MYSQL_HOST \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION \
        --admin-user $MYSQL_ADMIN_USER \
        --admin-password $MYSQL_ADMIN_PASSWORD \
        --public-access 0.0.0.0 \
        --tier Burstable \
        --sku-name Standard_B1ms \
        --storage-size 32
    
  2. Créez une base de données nommée checklist pour l’application à utiliser.

    export DATABASE_NAME="checklist"
    az mysql flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $MYSQL_HOST \
        --database-name $DATABASE_NAME
    
  3. Ouvrez un pare-feu pour autoriser la connexion à la base de données à partir de votre adresse IP actuelle.

    # Create a temporary firewall rule to allow connections from your current machine to the MySQL server
    export MY_IP=$(curl http://whatismyip.akamai.com)
    az mysql flexible-server firewall-rule create \
        --resource-group $RESOURCE_GROUP \
        --name $MYSQL_HOST \
        --rule-name AllowCurrentMachineToConnect \
        --start-ip-address ${MY_IP} \
        --end-ip-address ${MY_IP}
    
  4. Connectez-vous à la base de données et créez les tables comme spécifié dans l’exemple de fichier projet /azure/init-db.sql .

    export DATABASE_FQDN=${MYSQL_HOST}.mysql.database.azure.com
    export CURRENT_USER=$(az account show --query user.name --output tsv)
    export RDBMS_ACCESS_TOKEN=$(az account get-access-token \
        --resource-type oss-rdbms \
        --output tsv \
        --query accessToken)
    mysql -h "${DATABASE_FQDN}" --user "${CURRENT_USER}" --password="$RDBMS_ACCESS_TOKEN" < azure/init-db.sql
    
  5. Supprimez la règle de pare-feu temporaire.

    az mysql flexible-server firewall-rule delete \
        --resource-group $RESOURCE_GROUP \
        --name $MYSQL_HOST \
        --rule-name AllowCurrentMachineToConnect
    

Créer une ressource App Service

Créez une ressource App Service JBoss EAP sur Linux. JBoss EAP nécessite un niveau Premium sku .

# Create an App Service plan
export APPSERVICE_PLAN="mysql-mi-plan"
export APPSERVICE_NAME="mysql-mi-app"
az appservice plan create \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_PLAN \
    --location $LOCATION \
    --sku P1V3 \
    --is-linux

# Create an App Service web app
az webapp create \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --plan $APPSERVICE_PLAN \
    --runtime "JBOSSEAP:7-java8"

Créer et configurer une identité gérée attribuée à un utilisateur

Utilisez la commande suivante pour créer une identité managée affectée par l’utilisateur Azure à utiliser pour l’authentification Microsoft Entra. Pour plus d’informations, consultez Configurer l’authentification Microsoft Entra pour Azure Database pour MySQL : Serveur flexible.

export USER_IDENTITY_NAME="my-user-assigned-identity"
export IDENTITY_RESOURCE_ID=$(az identity create \
    --name $USER_IDENTITY_NAME \
    --resource-group $RESOURCE_GROUP \
    --query id \
    --output tsv)

Accordez les autorisations aux nouvelles identités attribuées par l'utilisateur User.Read.All, GroupMember.Read.All et Application.Read.All. Vous pouvez également attribuer à l’identité le rôle intégré Directory Readers Microsoft Entra.

Azure CLI n'est pas pris en charge pour attribuer des autorisations ou des rôles Microsoft Entra. Vous pouvez utiliser le centre d'administration Microsoft Entra, Microsoft Graph PowerShell ou l’API Microsoft Graph pour créer les assignations. Pour plus d’informations, consultez Attribuer des rôles Microsoft Entra.

Remarque

Pour ajouter ces attributions, vous devez disposer au moins du rôle ou des autorisations Administrateur de rôle privilégié dans votre locataire Microsoft Entra. Si vous n’avez pas ce rôle, demandez à votre administrateur général ou administrateur de rôle privilégié d’accorder les autorisations.

Utiliser l’identité managée pour connecter les services

Utilisez Service Connector pour connecter votre application web App Service JBoss EAP à la base de données MySQL avec une identité managée. Service Connector effectue les tâches suivantes en arrière-plan :

  • Définit l’utilisateur connecté actuel en tant qu’administrateur de base de données Microsoft Entra.
  • Active l’identité managée affectée par le système pour l’application.
  • Ajoute un utilisateur de base de données pour l’identité managée affectée par le système et accorde tous les privilèges de base de données à cet utilisateur.
  • Ajoute un chaîne de connexion nommé AZURE_MYSQL_CONNECTIONSTRING à l'App Settings de l'application.

Utilisez la commande az webapp connection create suivante pour connecter votre application à la base de données MySQL à l’aide de l’identité managée.

az webapp connection create mysql-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $MYSQL_HOST \
    --database $DATABASE_NAME \
    --system-identity mysql-identity-id=$IDENTITY_RESOURCE_ID \
    --client-type java

Générer et déployer l’application

  1. Exécutez le code suivant pour ajouter le plug-in d’authentification sans mot de passe au connecteur de service chaîne de connexion généré. Le script de démarrage de l’application fait référence à cette chaîne de connexion.

    export PASSWORDLESS_URL=$(\
        az webapp config appsettings list \
            --resource-group $RESOURCE_GROUP \
            --name $APPSERVICE_NAME \
        | jq -c '.[] \
        | select ( .name == "AZURE_MYSQL_CONNECTIONSTRING" ) \
        | .value' \
        | sed 's/"//g')
    # Create a new environment variable with the connection string including the passwordless authentication plugin
    export PASSWORDLESS_URL=${PASSWORDLESS_URL}'&defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin'
    az webapp config appsettings set \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --settings "AZURE_MYSQL_CONNECTIONSTRING_PASSWORDLESS=${PASSWORDLESS_URL}"
    
  2. Générez l’application à l’aide du fichier pom.xml dans l’exemple d’application pour générer le fichier WAR.

    mvn clean package -DskipTests
    
  3. Déployez le fichier WAR et le script de démarrage sur App Service.

    az webapp deploy \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --src-path target/ROOT.war \
        --type war
    az webapp deploy \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --src-path src/main/webapp/WEB-INF/createMySQLDataSource.sh \
        --type startup
    

Tester l’application

  1. Exécutez le code suivant pour créer une liste avec certains éléments de liste.

    export WEBAPP_URL=$(az webapp show \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --query defaultHostName \
        --output tsv)/$DATABASE_NAME
    
    # Create a list
    curl -X POST -H "Content-Type: application/json" -d '{"name": "list1","date": "2022-03-21T00:00:00","description": "Sample checklist"}' https://${WEBAPP_URL}
    
    # Create few items on the list 1
    curl -X POST -H "Content-Type: application/json" -d '{"description": "item 1"}' https://${WEBAPP_URL}/1/item
    curl -X POST -H "Content-Type: application/json" -d '{"description": "item 2"}' https://${WEBAPP_URL}/1/item
    curl -X POST -H "Content-Type: application/json" -d '{"description": "item 3"}' https://${WEBAPP_URL}/1/item
    
  2. Si vous travaillez localement, exécutez le code suivant pour afficher l’application :

    # Get all list items
    curl https://${WEBAPP_URL}
    
    # Get list item 1
    curl https://${WEBAPP_URL}/1
    

    Cloud Shell ne peut pas ouvrir un navigateur local. Par conséquent, si vous travaillez dans Cloud Shell, le moyen le plus simple d'afficher l'application web consiste à sélectionner le lien Browse ou Défini domaine lien en haut de la page du portail Azure de l'application. Ensuite, ajoutez /checklist ou /checklist/1 à la fin de l’URL dans votre navigateur, par exemple https://mysql-mi-app.azurewebsites.net/checklist.

Nettoyer les ressources

Lorsque vous avez terminé ce didacticiel, vous pouvez éviter d’autres frais en supprimant les ressources que vous avez créées. Supprimez le groupe de ressources pour supprimer toutes les ressources qu’il contient. Veillez à ne plus avoir besoin des ressources avant d’exécuter la commande.

az group delete --name $RESOURCE_GROUP --no-wait

La suppression de toutes les ressources peut prendre un certain temps. L’argument --no-wait permet à la commande de retourner immédiatement.