Compartir a través de


Tutorial: Conectarse a una base de datos MySQL desde JBoss EAP de Java App Service con conexión sin contraseña

Azure App Service proporciona un servicio de hospedaje web muy escalable y con aplicación de revisiones de un modo automático en Azure. También proporciona una identidad administrada para la aplicación, la cual constituye una solución inmediata para proteger el acceso a Azure Database for MySQL y a otros servicios de Azure. Las identidades administradas de App Service hacen que su aplicación sea más segura mediante la eliminación de los secretos de aplicación como, por ejemplo, las credenciales de las variables de entorno. En este tutorial, aprenderá a:

  • Cree una base de datos MySQL.
  • Implemente una aplicación JBoss EAP de ejemplo para Azure App Service mediante un paquete WAR.
  • Configure una aplicación web de Spring Boot para que use la autenticación de Microsoft Entra con una base de datos MySQL.
  • Conectar una base de datos MySQL con una identidad administrada mediante el conector de servicio.

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Requisitos previos

Clonación de la aplicación de ejemplo y preparación del repositorio

Ejecute los comandos siguientes en su terminal para clonar el repositorio de ejemplo y configurar el entorno de aplicación de ejemplo.

git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
cd Passwordless-Connections-for-Java-Apps/JakartaEE/jboss-eap/

Creación de una instancia de Azure Database for MySQL

Siga estos pasos para crear una instancia de Azure Database for MySQL en la 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 independiente de dónde se ejecute la aplicación.

  1. Inicie sesión en la CLI de Azure y, de manera opcional, establezca la suscripción si tiene más de una conectada a las credenciales de inicio de sesión.

    az login
    az account set --subscription <subscription-ID>
    
  2. Cree un grupo de recursos de Azure, teniendo en cuenta el nombre del grupo de recursos.

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=eastus
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Cree de un servidor de Azure Database for MySQL. El servidor se crea con una cuenta de administrador, pero no se utiliza porque se utilizará la cuenta de administrador de Microsoft Entra para realizar tareas administrativas.

    export MYSQL_ADMIN_USER=azureuser
    # MySQL admin access rights won't be used because Azure AD authentication is leveraged to administer the database.
    export MYSQL_ADMIN_PASSWORD=<admin-password>
    export MYSQL_HOST=<mysql-host-name>
    
    # Create a MySQL server.
    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
    
  4. Cree una base de datos para la aplicación.

    export DATABASE_NAME=checklist
    
    az mysql flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $MYSQL_HOST \
        --database-name $DATABASE_NAME
    

Crear una instancia de App Service

Cree un recurso de Azure App Service en Linux. JBoss EAP requiere SKU Premium.

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

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

Conexión de la base de datos de MySQL con conectividad de identidad

Después, conecte la base de datos mediante el Conector de servicio.

Instale la extensión sin contraseña del Conector de servicio para la CLI de Azure:

az extension add --name serviceconnector-passwordless --upgrade

A continuación, use el siguiente comando para crear una identidad administrada asignada por el usuario para la autenticación de Microsoft Entra. Para 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=<your-user-assigned-managed-identity-name>
export IDENTITY_RESOURCE_ID=$(az identity create \
    --name $USER_IDENTITY_NAME \
    --resource-group $RESOURCE_GROUP \
    --query id \
    --output tsv)

Importante

Después de crear la identidad asignada por el usuario, pida al administrador global o administrador de roles con privilegios que conceda los siguientes permisos para esta identidad: User.Read.All, GroupMember.Read.Ally Application.Read.ALL. Para obtener más información, consulte la sección Permisos de autenticación de Active Directory.

Después, conecte la aplicación a una base de datos de MySQL con una identidad administrada asignada por el sistema mediante el conector de servicio. Para ello, ejecute el comando az webapp connection create.

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

Este comando del conector de servicio realiza las siguientes tareas en segundo plano:

  • Habilita la identidad administrada asignada por el sistema para la aplicación $APPSERVICE_NAME alojada en Azure App Service.

  • Establezca el administrador de Microsoft Entra en el usuario que tiene actualmente la sesión iniciada.

  • Agrega un usuario de base de datos para la identidad administrada asignada por el sistema en el paso 1 y concede todos los privilegios de la base de datos $DATABASE_NAME a este usuario. Puede obtener el nombre de usuario de la cadena de conexión en la salida del comando anterior.

  • Agrega una cadena de conexión a Configuración de la aplicación en la aplicación denominada AZURE_MYSQL_CONNECTIONSTRING.

    Nota:

    Si aparece el mensaje de error The subscription is not registered to use Microsoft.ServiceLinker, ejecute el comando az provider register --namespace Microsoft.ServiceLinkerpara registrar el proveedor de recursos Service Connector y, a continuación, vuelva a ejecutar el comando de conexión.

Implementación de la aplicación

Siga estos pasos para preparar los datos en una base de datos e implementar la aplicación.

Cree el esquema de la base de datos

  1. Abra un firewall para permitir la conexión 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}
    
  2. Conéctese a la base de datos y cree tablas.

    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}" --enable-cleartext-plugin --password="$RDBMS_ACCESS_TOKEN" < azure/init-db.sql
    
  3. Quite la regla de firewall temporal.

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

Implementación de la aplicación

  1. Actualice la cadena de conexión en Configuración de la aplicación.

    Obtenga la cadena de conexión generada por Service Connector y agregue el complemento de autenticación sin contraseña. Se hace referencia a esta cadena de conexión en el script de inicio.

    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. La aplicación de ejemplo contiene un archivo pom.xml que puede generar el archivo WAR. Ejecute el siguiente comando para crear la aplicación.

    mvn clean package -DskipTests
    
  3. Implemente WAR y el script de inicio en el servicio de aplicaciones.

    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
    

Aplicación web de ejemplo

Use el siguiente comando para ejecutar la aplicación.

export WEBAPP_URL=$(az webapp show \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --query defaultHostName \
    --output tsv)

# 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}/checklist

# Create few items on the list 1
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 1"}' https://${WEBAPP_URL}/checklist/1/item
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 2"}' https://${WEBAPP_URL}/checklist/1/item
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 3"}' https://${WEBAPP_URL}/checklist/1/item

# Get all lists
curl https://${WEBAPP_URL}/checklist

# Get list 1
curl https://${WEBAPP_URL}/checklist/1

Limpieza de recursos

En los pasos anteriores, creó recursos de Azure en un grupo de recursos. Si prevé que no necesitará estos recursos en el futuro, elimine el grupo de recursos ejecutando el siguiente comando en Cloud Shell:

az group delete --name myResourceGroup

Este comando puede tardar varios segundos en ejecutarse.

Pasos siguientes

Más información acerca de la ejecución de aplicaciones de Java en App Service en Linux en la guía del desarrollador.