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
- Git
- Java JDK
- Maven
- CLI de Azure versión 2.46.0 o superior.
- La extensión sin contraseña del conector de servicio de la CLI de Azure, versión 0.2.2 o posterior.
- jq
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 un recurso 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.
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>
Cree un grupo de recursos de Azure.
export RESOURCE_GROUP=<resource-group-name> export LOCATION=eastus az group create --name $RESOURCE_GROUP --location $LOCATION
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
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
Cree una identidad administrada asignada por el usuario para la autenticación de Microsoft Entra mediante el comando siguiente. 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=<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)
Pida al Administrador global o al Administrador de roles con privilegios que conceda los permisos siguientes a la nueva identidad asignada por el usuario:
User.Read.All
,GroupMember.Read.All
yApplication.Read.ALL
. Para obtener más información, consulte la sección Permisos de autenticación de Active Directory.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 comandoaz provider register --namespace Microsoft.ServiceLinker
para 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
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}
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
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
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}"
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
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.
Paso siguiente
Más información acerca de la ejecución de aplicaciones de Java en App Service en Linux en la guía del desarrollador.