Configurer des sources de données pour une application Tomcat, JBoss ou Java SE dans Azure App Service

Cet article présente comment configurer des sources de données dans une application Java SE, Tomcat ou JBoss dans App Service.

Azure App Service exécute des applications web Java en trois types sur un service entièrement managé :

  • Java Standard Edition (SE). Java SE peut exécuter une application déployée en tant que package d’archive Java (JAR) qui contient un serveur incorporé, tel que Spring Boot, Bézierus, Dropwizard ou une application avec un serveur Tomcat ou Jetty incorporé.
  • Tomcat. Le serveur Tomcat intégré peut exécuter une application déployée en tant que package WAR (Web Application Archive).
  • JBoss Enterprise Application Platform (EAP) : le serveur JBoss EAP intégré peut exécuter une application déployée en tant que package WAR ou enterprise archive (EAR). Cette option est prise en charge pour les applications Linux dans un ensemble de niveaux tarifaires incluant Free, Premium v3 et Isolé v2.

Note

JBoss EAP sur App Service prend désormais en charge la facturation BYOL (Bring Your Own License). BYOL permet aux clients disposant d’abonnements Red Hat existants d’appliquer ces licences directement à leurs déploiements JBoss EAP sur Azure App Service. Pour plus d’informations, consultez le soutien BYOL pour JBoss EAP sur App Service.

Configurer la source de données

Pour vous connecter à des sources de données dans des applications Spring Boot, nous vous suggérons de créer des chaînes de connexion et de les injecter dans votre fichier application.properties.

  1. Dans le volet gauche de la page App Service, sélectionnez Paramètres>Variables d’environnement. Sous l’onglet Chaînes de connexion , sélectionnez Ajouter. Définissez un nom pour la chaîne, collez votre chaîne de connexion JDBC dans le champ Valeur et définissez le type sur Personnalisé. Vous pouvez éventuellement définir la chaîne de connexion en tant que paramètre d’emplacement.

    La chaîne de connexion est accessible à votre application en tant que variable d’environnement nommée CUSTOMCONNSTR_<your-string-name>. Par exemple : CUSTOMCONNSTR_exampledb.

  2. Dans votre fichier application.properties , référencez la chaîne de connexion avec le nom de la variable d’environnement. Pour l’exemple précédent, vous allez utiliser ce code :

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

Pour plus d’informations, consultez la documentation Spring Boot sur l’accès aux données et la configuration externalisée.

Conseil

Les conteneurs Tomcat sous Linux peuvent configurer automatiquement des sources de données partagées dans le serveur Tomcat si vous définissez la variable d’environnement WEBSITE_AUTOCONFIGURE_DATABASE à true. La seule chose à faire est d’ajouter un paramètre d’application qui contient une chaîne de connexion JDBC valide à une base de données Oracle, SQL Server, PostgreSQL ou MySQL (y compris les informations d’identification de connexion). App Service ajoute automatiquement la base de données partagée correspondante à /usr/local/tomcat/conf/context.xml, à l’aide d’un pilote approprié disponible dans le conteneur. Pour un scénario de bout en bout qui utilise cette approche, consultez Tutoriel : Créer une application web Tomcat avec Azure App Service sur Linux et MySQL.

Ces instructions s’appliquent à toutes les connexions de base de données. Vous devez remplacer les espaces de substitution par le nom de la classe de pilote et le fichier JAR de la base de données que vous avez choisie. Le tableau suivant fournit des noms de classes et des téléchargements de pilotes pour les bases de données courantes.

Base de données Nom de la classe de pilote Pilote JDBC
PostgreSQL org.postgresql.Driver Télécharger
MySQL com.mysql.jdbc.Driver Télécharger (sélectionner indépendant de la plateforme.)
Serveur SQL com.microsoft.sqlserver.jdbc.SQLServerDriver Télécharger

Pour configurer Tomcat pour utiliser Java Database Connectivity (JDBC) ou l’API de persistance Java (JPA), personnalisez d’abord la CATALINA_OPTS variable d’environnement qui est lue par Tomcat au démarrage. Définissez cette valeur à l’aide d’un paramètre d’application dans le plug-in App Service Maven :

<appSettings>
    <property>
        <name>CATALINA_OPTS</name>
        <value>"$CATALINA_OPTS -Ddbuser=${DBUSER} -Ddbpassword=${DBPASSWORD} -DconnURL=${CONNURL}"</value>
    </property>
</appSettings>

Vous pouvez également définir la variable d’environnement sous l’onglet Paramètres de l’application de la pageVariables d’environnement> dans le portail Azure.

Ensuite, déterminez si la source de données doit être disponible pour une application ou pour toutes les applications s’exécutant sur le servlet Tomcat.

Sources de données au niveau de l’application

Pour configurer une source de données au niveau de l’application :

  1. Créez un fichier context.xml dans le répertoire META-INF / de votre projet. Créez le répertoire META-INF/ s’il n’existe pas.

  2. Dans context.xml, ajoutez un élément Context pour lier la source de données à une adresse JNDI. Remplacez le driverClassName par le nom de classe de votre pilote indiqué dans le tableau apparaissant précédemment dans cet article.

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </Context>
    
  3. Mettez à jour le fichier web.xml de votre application pour utiliser la source de données dans votre application.

    <resource-env-ref>
        <resource-env-ref-name>jdbc/dbconnection</resource-env-ref-name>
        <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
    </resource-env-ref>
    

Ressources au niveau du serveur partagées

Conseil

Les conteneurs Tomcat Linux peuvent appliquer automatiquement des fichiers XSLT à l’aide de la convention suivante pour les fichiers copiés dans /home/site/wwwroot: si server.xml.xsl ou server.xml.xslt est présent, les fichiers sont appliqués aux fichiers de server.xmlTomcat. Si context.xml.xsl ou context.xml.xslt est présent, les fichiers sont appliqués à context.xml de Tomcat.

L'ajout d'une source de données partagée au niveau du serveur vous oblige à modifier le fichier de Tomcat server.xml. Étant donné que les modifications de fichier en dehors du /home répertoire sont éphémères, les modifications apportées aux fichiers de configuration de Tomcat doivent être appliquées programmatiquement, comme suit :

  • Chargez un script de démarrage et définissez le chemin d’accès au script dans Configuration des paramètres>. Sous l’onglet Paramètres de la pile, ajoutez le chemin d’accès dans la boîte de commande de démarrage. Vous pouvez charger le script de démarrage à l’aide du protocole FTP.

Votre script de démarrage transforme une transformation XSL vers le server.xml fichier et génère le fichier XML obtenu en /usr/local/tomcat/conf/server.xml. Le script de démarrage doit être installé libxslt ou xlstproc, selon la distribution de la version de Tomcat de votre application web, comme indiqué dans le commentaire dans l’exemple de script suivant. Vous pouvez utiliser FTP pour charger votre fichier XSL et votre script de démarrage.

# Install the libxslt package on Alpine-based images:
apk add --update libxslt

# Install the xsltproc package on Debian or Ubuntu-based images:
apt install xsltproc

# Also copy the transform file to /home/tomcat/conf/
# Usage: xsltproc --output output.xml style.xsl input.xml
xsltproc --output /home/tomcat/conf/server.xml /home/tomcat/conf/transform.xsl /usr/local/tomcat/conf/server.xml

L’exemple de fichier XSL suivant ajoute un nouveau nœud de connecteur au fichier server.xml Tomcat.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@* | node()" name="Copy">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()" mode="insertConnector">
    <xsl:call-template name="Copy" />
  </xsl:template>

  <xsl:template match="comment()[not(../Connector[@scheme = 'https']) and
                                 contains(., '&lt;Connector') and
                                 (contains(., 'scheme=&quot;https&quot;') or
                                  contains(., &quot;scheme='https'&quot;))]">
    <xsl:value-of select="." disable-output-escaping="yes" />
  </xsl:template>

  <xsl:template match="Service[not(Connector[@scheme = 'https'] or
                                   comment()[contains(., '&lt;Connector') and
                                             (contains(., 'scheme=&quot;https&quot;') or
                                              contains(., &quot;scheme='https'&quot;))]
                                  )]
                      ">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" mode="insertConnector" />
    </xsl:copy>
  </xsl:template>

  <!-- Add the new connector after the last existing connector if there is one -->
  <xsl:template match="Connector[last()]" mode="insertConnector">
    <xsl:call-template name="Copy" />

    <xsl:call-template name="AddConnector" />
  </xsl:template>

  <!-- ... or before the first engine if there's no existing connector -->
  <xsl:template match="Engine[1][not(preceding-sibling::Connector)]"
                mode="insertConnector">
    <xsl:call-template name="AddConnector" />

    <xsl:call-template name="Copy" />
  </xsl:template>

  <xsl:template name="AddConnector">
    <!-- Add new line -->
    <xsl:text>&#xa;</xsl:text>
    <!-- This is the new connector -->
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
               maxThreads="150" scheme="https" secure="true" 
               keystoreFile="${{user.home}}/.keystore" keystorePass="changeit"
               clientAuth="false" sslProtocol="TLS" />
  </xsl:template>

</xsl:stylesheet>

Finaliser la configuration

Enfin, placez les pilotes JAR dans le classpath de Tomcat et redémarrez votre application App Service.

  • Veillez à ce que les fichiers du pilote JDBC soient disponibles pour le chargeur de classes Tomcat en les mettant dans le répertoire /home/site/lib. Dans Cloud Shell, exécutez az webapp deploy --type=lib pour chaque fichier JAR de pilote :
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --path <jar-name>.jar

Si vous avez créé une source de données de niveau serveur, redémarrez l’application App Service Linux. Tomcat rétablit CATALINA_BASE sur /home/tomcat et utilise la configuration mise à jour.

Conseil

Par défaut, les conteneurs JBoss Linux peuvent configurer automatiquement des sources de données partagées dans le serveur JBoss. La seule chose que vous devez faire est d’ajouter un paramètre d’application qui contient une chaîne de connexion JDBC valide à une base de données Oracle, SQL Server, PostgreSQL ou MySQL (y compris les informations d’identification de connexion) et d’ajouter le paramètre d’application /variable WEBSITE_AUTOCONFIGURE_DATABASE d’environnement avec la valeur true. Les connexions JDBC créées avec le connecteur de service sont également prises en charge. App Service ajoute automatiquement la source de données partagée correspondante (en fonction du nom du paramètre d’application et du suffixe _DS), à l’aide d’un pilote approprié disponible dans le conteneur. Pour un scénario de bout en bout qui utilise cette approche, consultez Tutoriel : Créer une application web JBoss avec Azure App Service sur Linux et MySQL.

Il existe trois étapes principales pour inscrire une source de données auprès de JBoss EAP :

  1. Téléchargez le pilote JDBC.
  2. Ajoutez le pilote JDBC en tant que module.
  3. Ajoutez une source de données avec le module.

App Service est un service d’hébergement sans état. Vous devez donc effectuer ces étapes dans un script de démarrage et l’exécuter chaque fois que le conteneur JBoss démarre. Voici des exemples PostgreSQL, MySQL et Azure SQL Database :

Note

JBoss EAP sur App Service prend en charge la facturation BYOL (Bring Your Own License). BYOL permet aux clients disposant d’abonnements Red Hat existants d’appliquer ces licences directement à leurs déploiements JBoss EAP sur Azure App Service. Pour plus d’informations, consultez BYOL Support pour JBoss EAP.

  1. Placez vos commandes CLI JBoss dans un fichier nommé jboss-cli-commands.cli. Les commandes JBoss doivent ajouter le module et l’inscrire en tant que source de données. L'exemple suivant montre les commandes CLI JBoss pour créer une source de données PostgreSQL avec le nom JNDI java:jboss/datasources/postgresDS.

    module add --name=org.postgresql --resources=/home/site/libs/postgresql-42.7.4.jar
    /subsystem=datasources/jdbc-driver=postgresql:add(driver-name="postgresql",driver-module-name="org.postgresql",driver-class-name="org.postgresql.Driver",driver-xa-datasource-class-name="org.postgresql.xa.PGXADataSource")
    data-source add --name=postgresql --driver-name="postgresql" --jndi-name="java:jboss/datasources/postgresDS" --connection-url="jdbc:postgresql://\${env.DB_HOST}:5432/postgres" --user-name="\${env.DB_USERNAME}" --password="\${env.DB_PASSWORD}" --enabled=true --use-java-context=true
    

    Notez que la commande module add utilise trois variables d’environnement (DB_HOST, DB_USERNAME et DB_PASSWORD), que vous devez ajouter dans App Service en tant que paramètres d’application. Le script les ajoute sans l'indicateur --resolve-parameter-values afin que JBoss n'enregistre pas leurs valeurs en texte brut.

  2. Créez un script de démarrage, startup.sh, qui appelle les commandes JBoss CLI. L’exemple suivant montre comment appeler votre fichier jboss-cli-commands.cli . Plus tard, vous configurez App Service pour exécuter ce script au démarrage du conteneur.

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/scripts/jboss-cli-commands.cli
    
  3. À l’aide d’une option de déploiement de votre choix, téléchargez votre pilote JDBC, jboss-cli-commands.cli et startup.sh vers les chemins spécifiés dans les scripts respectifs. Chargez startup.sh en tant que fichier de démarrage. Par exemple :

    export RESOURCE_GROUP_NAME=<resource-group-name>
    export APP_NAME=<app-name>
    
    # The lib type uploads to /home/site/libs by default.
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path postgresql-42.7.4.jar --target-path postgresql-42.7.4.jar --type lib
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path jboss-cli-commands.cli --target-path /home/site/scripts/jboss-cli-commands.cli --type static
    # The startup type uploads to /home/site/scripts/startup.sh by default.
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path startup.sh --type startup
    

    Pour plus d’informations, voir Déployer des fichiers vers App Service.

Pour vérifier que la source de données est ajoutée au serveur JBoss, SSH dans votre application web et exécutez $JBOSS_HOME/bin/jboss-cli.sh --connect. Une fois connecté à JBoss, exécutez /subsystem=datasources:read-resource pour imprimer une liste des sources de données.

Conformément à la définition dans jboss-cli-commands.cli, vous pouvez accéder à la connexion PostgreSQL à l’aide du nom java:jboss/datasources/postgresDSJNDI.