Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.ServiceLinkeryMicrosoft.DBforMySQLregistrados en la suscripción de Azure. Puede ejecutaraz 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 JDKInstaladoMaven instalado
jqInstaladoCliente MySQL instalado
CLI de Azure 2.46.0 o posterior instalado. Para comprobar la versión, ejecute
az --version. Para actualizar, ejecuteaz upgrade.Si estás ejecutando localmente:
- Inicie sesión en Azure mediante
az loginy siga las indicaciones. - 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.
- Inicie sesión en Azure mediante
Configuración del entorno
Instale las extensiones de la CLI de Azure siguientes:
az extension add --name serviceconnector-passwordless --upgrade az extension add --name rdbms-connectEjecute 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/Defina las siguientes variables de entorno para el tutorial, reemplazando el
<region>marcador de posición por un valor válido.LOCATIONdebe 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"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.
Ejecute el comando siguiente para crear un servidor Azure Database for MySQL. El nombre
MYSQL_HOSTdebe 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 32Cree una base de datos denominada
checklistpara 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_NAMEAbra 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}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.sqlElimine 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_CONNECTIONSTRINGa 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
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}"Compile la aplicación mediante el archivo pom.xml en la aplicación de ejemplo para generar el archivo WAR.
mvn clean package -DskipTestsImplemente 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
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/itemSi 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}/1Cloud 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
/checklisto/checklist/1al final de la dirección URL en el explorador, por ejemplohttps://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.