Tutorial: Conexión a una base de datos MySQL desde Java JBoss EAP en Azure App Service

En este tutorial, aprenderá a conectar una aplicación de Java JBoss EAP en Azure App Service a una base de datos de Azure Database for MySQL mediante una identidad administrada. App Service puede usar identidad administrada para proporcionar acceso seguro a Azure Database for MySQL y otros servicios de Azure. Una identidad administrada elimina la necesidad de usar secretos en la aplicación, como las credenciales de las variables de entorno.

En este tutorial se usan comandos CLI de Azure para completar las siguientes tareas:

  • Crea un servidor y una base de datos dentro de Azure Database para MySQL.
  • Implementa una aplicación de JBoss EAP de ejemplo en App Service mediante un paquete WAR.
  • Configura la aplicación web de Spring Boot para usar Microsoft Entra autenticación con la base de datos MySQL.
  • Conecta la aplicación web a la base de datos MySQL mediante Service Connector con autenticación de identidad administrada.

Requisitos previos

  • Una suscripción de Azure con permisos de asignación de roles de Microsoft Entra y permisos de escritura de recursos de Azure, en una región de Azure que admite Service Connector y que tenga suficiente soporte de App Service y cuota para el tutorial.

  • Los proveedores de recursos Microsoft.ServiceLinker y Microsoft.DBforMySQL registrados en la suscripción de Azure. Puede ejecutar az provider register -n Microsoft.[service] para registrar los proveedores.

  • Git para acceder y clonar el repositorio de ejemplo.

  • Acceso a Azure Cloud Shell para ejecutar los pasos del tutorial, o si prefiere ejecutar localmente, los siguientes requisitos previos y pasos:

    • Java JDK Instalado

    • Maven instalado

    • jq Instalado

    • Cliente MySQL instalado

    • CLI de Azure 2.46.0 o posterior instalado. Para comprobar la versión, ejecute az --version. Para actualizar, ejecute az upgrade.

      Si estás ejecutando localmente:

      1. Inicie sesión en Azure mediante az login y siga las indicaciones.
      2. Si tiene más de una suscripción de Azure conectada a las credenciales de inicio de sesión, ejecute az account set --subscription <subscription-ID> para seleccionar la suscripción correcta.

Configuración del entorno

  1. Instale las extensiones de la CLI de Azure siguientes:

    az extension add --name serviceconnector-passwordless --upgrade
    az extension add --name rdbms-connect
    
  2. Ejecute los siguientes comandos para clonar el repositorio de ejemplo y cambiar los directorios a la carpeta del proyecto de aplicación de ejemplo. Ejecute todos los comandos restantes desde esta carpeta.

    git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
    cd Passwordless-Connections-for-Java-Apps/JakartaEE/jboss-eap/
    
  3. Defina las siguientes variables de entorno para el tutorial, reemplazando el <region> marcador de posición por un valor válido. LOCATION debe ser una región de Azure en la que la suscripción tenga cuota suficiente para crear los recursos de Azure y sin restricciones en ninguno de los servicios.

    LOCATION="<region>"
    RESOURCE_GROUP="mysql-mi-webapp"
    
  4. Cree un grupo de recursos Azure para contener todos los recursos del proyecto. El nombre del grupo de recursos se almacena en caché y se aplica automáticamente a los comandos posteriores.

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

Crear una base de datos de Azure para MySQL

Cree un servidor de Azure Database for MySQL y una base de datos en tu suscripción. La aplicación Spring Boot se conecta a esta base de datos y almacena sus datos al ejecutarse, conservando el estado de la aplicación independientemente de dónde ejecute la aplicación.

  1. Ejecute el comando siguiente para crear un servidor Azure Database for MySQL. El nombre MYSQL_HOST debe ser único en todo Azure.

    Nota:

    Aunque el comando define una cuenta de administrador, la cuenta no se usa porque la cuenta de administrador de Microsoft Entra realiza todas las tareas administrativas.

    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. Cree una base de datos denominada checklist para que la aplicación la use.

    export DATABASE_NAME="checklist"
    az mysql flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $MYSQL_HOST \
        --database-name $DATABASE_NAME
    
  3. Abra un firewall para permitir la conexión a la base de datos desde la dirección IP actual.

    # 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. Conéctese a la base de datos y cree las tablas tal como se especifica en el archivo de proyecto de ejemplo /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. Elimine la regla de cortafuegos temporal.

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

Creación de un recurso de App Service

Cree un recurso de servicio de aplicaciones JBoss EAP en Linux. JBoss EAP requiere un nivel 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"

Creación y configuración de una identidad administrada asignada por el usuario

Use el comando siguiente para crear una identidad administrada asignada por el usuario Azure que se usará para la autenticación Microsoft Entra. Para obtener más información, consulte Configuración de la autenticación de Microsoft Entra para Azure Database for MySQL: servidor 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)

Conceda permisos a la nueva identidad asignada por el usuario User.Read.All, GroupMember.Read.All y Application.Read.All. Si lo prefiere, puede asignar a la identidad el rol integrado de Microsoft Entra Lectores de directorio.

CLI de Azure no es compatible para la asignación de permisos o roles en Microsoft Entra. Puede usar el Centro de administración Microsoft Entra, Microsoft Graph PowerShell o Microsoft Graph API para crear las asignaciones. Para obtener más información, consulte Asignar roles de Microsoft Entra.

Nota:

Para añadir estas asignaciones, debe tener al menos el rol Administrador de roles con privilegios o los permisos en el inquilino de Microsoft Entra. Si no tiene este rol, pida al administrador global o al administrador de roles con privilegios que conceda los permisos.

Uso de la identidad administrada para conectar los servicios

Use Service Connector para conectar la aplicación web de JBoss EAP de App Service a la base de datos MySQL con una identidad administrada. Service Connector realiza las siguientes tareas en segundo plano:

  • Establece el usuario que ha iniciado sesión actual como administrador de base de datos de Microsoft Entra.
  • Habilita la identidad administrada asignada por el sistema para la aplicación.
  • Agrega un usuario de base de datos para la identidad administrada asignada por el sistema y concede todos los privilegios de base de datos a este usuario.
  • Agrega una cadena de conexión denominada AZURE_MYSQL_CONNECTIONSTRING a la configuración de la aplicación App Settings.

Use el siguiente comando az webapp connection create para conectar la aplicación a la base de datos MySQL mediante la identidad administrada.

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

Compilación e implementación de la aplicación

  1. Ejecute el código siguiente para agregar el plugin de autenticación sin contraseña a la cadena de conexión generada por el Service Connector. El script de inicio de la aplicación hace referencia a este cadena de conexión.

    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. Compile la aplicación mediante el archivo pom.xml en la aplicación de ejemplo para generar el archivo WAR.

    mvn clean package -DskipTests
    
  3. Implemente el archivo WAR y el script de inicio en 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
    

Prueba de la aplicación

  1. Ejecute el código siguiente para crear una lista con algunos elementos de lista.

    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 trabaja localmente, ejecute el código siguiente para ver la aplicación:

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

    Cloud Shell no puede abrir un explorador local, por lo que si está trabajando en Cloud Shell, la manera más fácil de ver la aplicación web es seleccionar el vínculo Browse o Default domain cerca de la parte superior de la página del portal de Azure de la aplicación. A continuación, anexe /checklist o /checklist/1 al final de la dirección URL en el explorador, por ejemplo https://mysql-mi-app.azurewebsites.net/checklist.

Limpieza de recursos

Cuando haya terminado con este tutorial, puede evitar cargos adicionales mediante la eliminación de los recursos que ha creado. Elimine el grupo de recursos para eliminar todos los recursos que contiene. Asegúrese de que ya no necesita los recursos antes de ejecutar el comando.

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

La eliminación de todos los recursos puede llevar tiempo. El --no-wait argumento permite que el comando devuelva inmediatamente.