Compartir vía


Tutorial: Compilación de una aplicación web de JBoss con Azure App Service en Linux y MySQL

En este tutorial se muestra cómo compilar, configurar e implementar una aplicación segura de JBoss en Azure App Service que se conecta a una base de datos MySQL (con Azure Database for MySQL). Azure App Service es un servicio de hospedaje web con gran capacidad de escalado y aplicación automática de revisiones que puede implementar fácilmente aplicaciones en Windows o Linux. Cuando haya terminado, tendrá una aplicación JBoss que se ejecuta en Azure App Service en Linux.

Recorte de pantalla de una aplicación JBoss que almacena datos en MySQL.

En este tutorial, aprenderá a:

  • Cree una arquitectura que sea segura de forma predeterminada para Azure App Service y un servidor flexible de Azure Database for MySQL.
  • Proteja la conectividad de las bases de datos con una cadena de conexión sin contraseña.
  • Compruebe los orígenes de datos de JBoss en App Service mediante la CLI de JBoss.
  • Implemente una aplicación de ejemplo de JBoss en App Service desde un repositorio de GitHub.
  • Acceda a la configuración de la aplicación de App Service en el código de la aplicación.
  • Realice actualizaciones y vuelva a implementar el código de la aplicación.
  • Transmita los registros de diagnóstico desde App Service.
  • Administre la aplicación en Azure Portal.
  • Aprovisione la misma arquitectura e impleméntela usando Azure Developer CLI.
  • Optimice su flujo de trabajo de desarrollo con GitHub Codespaces y GitHub Copilot.

Requisitos previos

  • Una cuenta de Azure con una suscripción activa. Si no tiene una cuenta de Azure, puede crearla gratis.
  • Una cuenta de GitHub. También puede obtener una gratis.
  • Conocimientos de Java con desarrollo de JBoss.
  • (Opcional) Para probar GitHub Copilot, una cuenta de GitHub Copilot. Hay disponible una evaluación gratuita de 30 días.
  • Una cuenta de Azure con una suscripción activa. Si no tiene una cuenta de Azure, puede crearla gratis.
  • Azure Developer CLI instalado. Puede seguir los pasos con Azure Cloud Shell porque ya tiene instalado Azure Developer CLI.
  • Conocimientos de Java con desarrollo de JBoss.
  • (Opcional) Para probar GitHub Copilot, una cuenta de GitHub Copilot. Hay disponible una evaluación gratuita de 30 días.

Ir al final

Puede implementar rápidamente la aplicación de ejemplo en este tutorial y verla en ejecución en Azure. Solo tiene que ejecutar los siguientes comandos en Azure Cloud Shell y seguir la solicitud:

mkdir msdocs-jboss-mysql-sample-app
cd msdocs-jboss-mysql-sample-app
azd init --template msdocs-jboss-mysql-sample-app
azd up

1. Ejecución del ejemplo

En primer lugar, configurará una aplicación controlada por datos de ejemplo como punto inicial. Para lograr mayor comodidad, el repositorio de ejemplo incluye una configuración de contenedor de desarrollo. El contenedor de desarrollo tiene todo lo que necesita para desarrollar una aplicación, incluida la base de datos, la caché y todas las variables de entorno necesarias para la aplicación de ejemplo. El contenedor de desarrollo puede ejecutarse en un codespace de GitHub, lo que significa que puede ejecutar el ejemplo en cualquier equipo con un explorador web.

Paso 1: En una nueva ventana del navegador:

  1. Inicie sesión en su cuenta de GitHub.
  2. Vaya a https://github.com/Azure-Samples/msdocs-jboss-mysql-sample-app/fork.
  3. Anule la selección de Copiar solo la rama principal. Quiere todas las ramas.
  4. Seleccione Crear bifurcación.

Captura de pantalla que muestra cómo crear una bifurcación del repositorio de GitHub de ejemplo

Paso 2: en la bifurcación de GitHub:

  1. Seleccione Principal>starter-no-infra para la rama de inicio. Esta rama contiene solo el proyecto de ejemplo y ninguna configuración ni archivo relacionados con Azure. Seleccione Código>Crear codespace on starter-no-infra. El codespace tarda unos minutos en configurarse.

Captura de pantalla que muestra cómo crear un codespace en GitHub.

Paso 3: En el terminal de codespace:

  1. Ejecute mvn clean wildfly:run.
  2. Cuando vea la notificación Your application running on port 8080 is available., espere unos segundos más para que el servidor WildFly termine de cargar la aplicación. A continuación, seleccione Abrir en el explorador. Debería ver la aplicación de ejemplo en una nueva pestaña del explorador. Para detener el servidor WildFly, escriba Ctrl+C.

Captura de pantalla que muestra cómo ejecutar la aplicación de ejemplo dentro del codespace de GitHub.

Sugerencia

Puede preguntar a GitHub Copilot sobre este repositorio. Por ejemplo:

  • @workspace ¿Qué hace este proyecto?
  • @workspace ¿Qué hace la carpeta .devcontainer?

¿Tiene problemas? Consulte la sección Solución de problemas.

2. Creación de App Service y MySQL

En primer lugar, creará los recursos de Azure. Los pasos que se usan en este tutorial crean un conjunto de recursos seguros de manera predeterminada que incluyen App Service y Azure DB for MySQL. En el proceso de creación, especifique lo siguiente:

  • El Nombre de la aplicación web. Se usa como parte del nombre DNS de la aplicación en forma de https://<app-name>-<hash>.<region>.azurewebsites.net.
  • La región para ejecutar la aplicación físicamente en el mundo. También se usa como parte del nombre DNS de la aplicación.
  • La pila en tiempo de ejecución para la aplicación. Aquí es donde selecciona la versión de Java que se va a usar para la aplicación.
  • El plan de hospedaje para la aplicación. Es el plan de tarifa que incluye el conjunto de características y la capacidad de escalado de la aplicación.
  • El Grupo de recursos de la aplicación. Un grupo de recursos permite agrupar (en un contenedor lógico) todos los recursos de Azure necesarios para la aplicación.

Inicie sesión en Azure Portal y siga estos pasos para crear los recursos de Azure App Service.

Paso 1: En el portal Azure:

  1. En la barra de búsqueda superior, escriba app service.
  2. Seleccione el elemento con la etiqueta App Service en el encabezado Servicios.
  3. Seleccione Crear>Aplicación web. También puede ir directamente al asistente de creación.

Recorte de pantalla que muestra cómo usar el cuadro de búsqueda de la barra de herramientas superior a fin de encontrar el asistente para creación de aplicaciones web.

Paso 2: En la página Crear aplicación web, rellene el formulario de la siguiente forma.

  1. Nombre: msdocs-jboss-mysql. Se generará un grupo de recursos denominado msdocs-jboss-mysql_group.
  2. Pila en runtime: Java 17.
  3. Pila de servidores web de Java: Red Hat JBoss EAP 8. Si ya ha configurado la suscripción de Red Hat con Azure, seleccione Licencia de Red Hat JBoss EAP 8 BYO.
  4. Región: cualquier región de Azure cercana a usted.
  5. Plan de Linux: cree uno nuevo y use el nombre msdocs-jboss-mysql.
  6. Plan de precios: Premium V3 P0V3. Cuando esté listo, puede escalar verticalmente a un plan de tarifa distinto.
  7. Implementación con la aplicación: seleccione Base de datos. Azure Database for MySQL: Servidor flexible se ha seleccionado automáticamente de forma predeterminada. Es una base de datos MySQL como servicio totalmente administrada de Azure, compatible con las últimas ediciones de la comunidad.
  8. Seleccione Revisar + crear.
  9. Una vez completada la validación, seleccione Crear.

Recorte de pantalla que muestra cómo configurar una aplicación y base de datos nuevas en el asistente para aplicaciones web.

Step 3:La implementación tarda unos minutos en completarse. Una vez completada la implementación, seleccione el botón Ir al recurso. Se le dirigirá directamente a la aplicación App Service, pero se crean los siguientes recursos:

  • Grupo de recursos: contenedor para todos los recursos creados.
  • Plan de App Service: define los recursos de proceso de App Service. Se crea un plan de Linux en el nivel Básico.
  • App Service: representa su aplicación y se ejecuta en el plan de App Service.
  • Red virtual: se integra con la aplicación App Service y aísla el tráfico de back-end.
  • Servidor flexible de Azure Database for MySQL: accesible solo desde la red virtual. Una base de datos y un usuario se crean automáticamente en el servidor.
  • Zonas DNS privadas: habilita la resolución DNS del servidor de bases de datos en la red virtual.
  • Puntos de conexión privados: puntos de conexión de acceso para el servidor de bases de datos de la red virtual.

Captura de pantalla en la que se muestra el proceso completo de la implementación.

¿Tiene problemas? Consulte la sección Solución de problemas.

3. Creación de una conexión sin contraseña

En este paso, generará una conexión de servicio basada en identidad administrada, que posteriormente puede usar para crear un origen de datos en el servidor de JBoss. Al usar una identidad administrada para conectarse a la base de datos de MySQL, el código está protegido frente a la pérdida accidental de secretos.

Paso 1: Cree una identidad administrada.

  1. En la barra de búsqueda superior, escriba identidad administrada.
  2. Seleccione el elemento con la etiqueta Identidades administradas en el encabezado Servicios.
  3. Seleccione Crear.
  4. En Grupo de recursos, seleccione msdocs-jboss-mysql_group.
  5. En Región, seleccione la misma región que haya usado para la aplicación web.
  6. En Nombre, escriba msdocs-jboss-mysql-server-identity.
  7. Seleccione Revisar + crear.
  8. Seleccione Crear.

Recorte de pantalla que muestra cómo configurar una nueva identidad administrada.

Paso 2: Habilite la autenticación de Microsoft Entra en el servidor MySQL.

  1. En la barra de búsqueda superior, escriba msdocs-jboss-mysql-server.
  2. Seleccione el recurso de servidor flexible de Azure Database for MySQL denominado msdocs-jboss-mysql-server.
  3. En el menú de la izquierda, seleccione Seguridad>Autenticación.
  4. En Asignar acceso a, seleccione Únicamente autenticación de Microsoft Entra.
  5. En Identidad administrada asignada por el usuario, elija Seleccionar.
  6. Seleccione msdocs-jboss-mysql-server-identity y, a continuación, Agregar. La identidad tarda un momento en asignarse al servidor MySQL.
  7. En Nombre de administrador de Microsoft Entra, elija Seleccionar.
  8. Busque su cuenta de Azure, selecciónela y, a continuación, elija Seleccionar.
  9. Haga clic en Guardar y espere a que finalice la operación.

Recorte de pantalla que muestra cómo configurar la autenticación de Microsoft Entra para un servidor flexible de Azure Database for MySQL.

Paso 3: Agregue un conector de servicio basado en identidad administrada.

  1. En la barra de búsqueda superior, escriba msdocs-jboss-mysql.
  2. Seleccione el recurso de App Service denominado msdocs-jboss-mysql.
  3. En la página App Service, en el menú de la izquierda, seleccione Configuración > Conector de servicio.
  4. Seleccione Crear.
  5. En la pestaña Básica:
  6. Establezca Tipo de servicio en DB for MySQL: servidor flexible.
  7. Establezca Servidor flexible de MySQL en msdocs-jboss-mysql-server.
  8. Establezca Base de datos MySQL en msdocs-jboss-mysql-database.
  9. Establezca Tipo de cliente en Java.
  10. Seleccione la pestaña Autenticación.
  11. Seleccione Identidad administrada asignada por el sistema.
  12. Seleccione la pestaña Revisar y crear.
  13. Cuando se complete la validación, seleccione Crear en Cloud Shell y espere a que la operación se complete en este.
  14. Cuando vea el JSON de salida, puede cerrar Cloud Shell. Cierre también el cuadro de diálogo Crear conexión.
  15. Seleccione Actualizar para mostrar el nuevo conector de servicio.

Recorte de pantalla que muestra un conector de servicio completamente configurado, listo para crearse con Cloud Shell.

Paso 4: Agregue complementos de autenticación a la cadena de conexión.

  1. En el menú de la izquierda, seleccione Variables de entorno.
  2. Seleccione AZURE_MYSQL_CONNECTIONSTRING. El campo Valor debe contener un valor user, pero no password. El usuario es una identidad administrada.
  3. El servidor de JBoss en la aplicación de App Service hace que los complementos de autenticación se encarguen de autenticar la identidad administrada, pero todavía debe agregarla a la cadena de conexión. Desplácese hasta el final del valor y anexe &defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin.
  4. Seleccione Aplicar.
  5. Seleccione Aplicar y, después, Confirmar.

Recorte de pantalla que muestra cómo cambiar el valor de la variable de entorno de MySQL en Azure.

¿Tiene problemas? Consulte la sección Solución de problemas.

4. Confirmación del origen de datos JNDI

Si agrega un valor de aplicación que contiene una cadena de conexión JDBC válida para Oracle, SQL Server, PostgreSQL o MySQL, App Service agrega un origen de datos de interfaz de denominación y directorio Java (JNDI) para este en el servidor de JBoss. En este paso, usará la conexión SSH al contenedor de aplicaciones para comprobar el origen de datos JNDI. En el proceso, aprenderá cómo acceder al shell de SSH y ejecutar la CLI de JBoss.

Paso 1: en la página de App Service:

  1. En el menú de la izquierda, seleccione Herramientas de desarrollo > SSH.
  2. Seleccione Ir.

Captura de pantalla que muestra cómo abrir el shell de SSH de la aplicación desde Azure Portal

Paso 2: En el terminal SSH:

  1. Ejecute $JBOSS_HOME/bin/jboss-cli.sh --connect.
  2. En la conexión de la CLI de JBoss, ejecute ls subsystem=datasources/data-source. Debería ver el origen de datos generado de forma automática denominado AZURE_MYSQL_CONNECTIONSTRING_DS.
  3. Obtenga el nombre de JNDI del origen de datos con /subsystem=datasources/data-source=AZURE_MYSQL_CONNECTIONSTRING_DS:read-attribute(name=jndi-name). Ahora tiene un nombre de JNDI java:jboss/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS, que puede usar en el código de la aplicación más adelante.

Recorte de pantalla que muestra los comandos de la CLI de JBoss que se ejecutan en el shell de SSH y su salida.

Nota:

Cuando la aplicación se reinicie, solo persisten los cambios realizados en los archivos ubicados en /home. Por ejemplo, si edita /opt/eap/standalone/configuration/standalone.xml o cambia la configuración del servidor en la CLI de JBoss, los cambios no se conservarán después de reiniciar la aplicación. Para conservar los cambios, use un script de inicio, como se muestra en Configuración de orígenes de datos para una aplicación Tomcat, JBoss o Java SE en Azure App Service.

¿Tiene problemas? Consulte la sección Solución de problemas.

5. Implantación del código de ejemplo

En este paso, configurará la implementación de GitHub mediante Acciones de GitHub. Es solo una de las muchas maneras de implementar en App Service, pero también una excelente manera de disponer de integración continua en el proceso de implementación. De forma predeterminada, cada uno de los repositorios git push de GitHub inicia la acción de compilación e implementación.

Al igual que la convención de JBoss, si quiere implementar en el contexto raíz de JBoss, asigne al artefacto creado el nombre ROOT.war.

Paso 1: De nuevo en la página App Service, en el menú de la izquierda, seleccione Implementación > Centro de implementación.

Captura de pantalla que muestra cómo abrir el centro de implementación de App Service

Paso 2: En la página Centro de implementación:

  1. En Origen, seleccione GitHub. De forma predeterminada, Acciones de GitHub está seleccionado como proveedor de compilación.
  2. Inicie sesión en su cuenta de GitHub y siga las indicaciones para autorizar a Azure.
  3. En Organización, seleccione su cuenta.
  4. En Repositorio, seleccione msdocs-jboss-mysql-sample-app.
  5. En Rama, seleccione starter-no-infra. Esta es la misma rama en la que ha trabajado con la aplicación de ejemplo, sin archivos ni configuraciones relacionados con Azure.
  6. En Tipo de autenticación, seleccione Identidad asignada por el usuario.
  7. En el menú superior, elija Guardar. App Service confirma un archivo de flujo de trabajo en el repositorio de GitHub escogido, en el directorio .github/workflows. De manera predeterminada, el centro de implementación crea una identidad asignada por el usuario para que el flujo de trabajo se autentique mediante Microsoft Entra (autenticación OIDC). Para obtener opciones de autenticación alternativas, consulte Implementación en App Service mediante Acciones de GitHub.

Captura de pantalla que muestra cómo configurar la CI/CD mediante Acciones de GitHub

Paso 3: De nuevo en el codespace de GitHub de la bifurcación de ejemplo, ejecute git pull origin starter-no-infra. Esto extrae el archivo de flujo de trabajo recién confirmado en el codespace. Puede modificarlo según sus necesidades en .github/workflows/starter-no-infra_msdocs-jboss-mysql.yml.

Captura de pantalla que muestra la extracción de Git dentro de un codespace de GitHub.

Paso 4 (Opción 1: con GitHub Copilot):

  1. Inicie una nueva sesión de chat haciendo clic en la vista Chat y, a continuación, haga clic en +.
  2. Pregunte: "@workspace ¿Cómo se conecta la aplicación a la base de datos?" Copilot puede darle una explicación sobre el origen de datos de java:jboss/MySQLDS y de cómo está configurado.
  3. Es decir, "El origen de datos de JBoss en Azure usa el nombre de JNDI java:jboss/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS." Copilot puede proporcionarle una sugerencia de código similar a la de los pasos en Opción 2: sin GitHub Copilot a continuación e incluso indicarle que realice el cambio en la clase. GitHub Copilot no proporciona la misma respuesta cada vez y es posible que tenga que hacer preguntas adicionales para ajustar su respuesta. Para obtener sugerencias, consulte ¿Qué puedo hacer con GitHub Copilot en mi espacio de código?.

Captura de pantalla que muestra cómo hacer una pregunta en una nueva sesión de chat de GitHub Copilot.

Paso 4 (Opción 2: sin GitHub Copilot):

  1. Abra src/main/resources/META-INF/persistence.xml en el explorador. Cuando se inicia la aplicación, esta carga la configuración de la base de datos en este archivo.
  2. Cambie el valor de <jta-data-source> de java:jboss/MySQLDS a java:jboss/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS, que es el origen de datos que encontró con la CLI de JBoss anteriormente en el shell SSH.

Captura de pantalla que muestra un codespace de GitHub y el archivo ContextListener.java abierto.

Paso 5:

  1. Seleccione la extensión Control de código fuente.
  2. En el cuadro de texto, escriba un mensaje de confirmación, por ejemplo, Configure Azure JNDI name.
  3. Seleccione Confirmar y, a continuación, confirme con .
  4. Seleccione Sincronización de cambios 1 y confirme con Aceptar.

Captura de pantalla en la que se muestran los cambios que se confirman y se insertan en GitHub.

Paso 6: De vuelta en la página Centro de implementación en Azure Portal:

  1. Seleccione Registros. Ya se ha iniciado una nueva ejecución de implementación a partir de los cambios confirmados.
  2. En el elemento de registro de la ejecución de implementación, seleccione la entrada Registros de compilación/implementación con la marca de tiempo más reciente.

Captura de pantalla que muestra cómo abrir registros de implementación en el centro de implementación

Paso 7: Se le llevará al repositorio de GitHub, donde ve que la acción de GitHub se está ejecutando. El archivo de flujo de trabajo define dos fases independientes: compilación e implementación. Espere a que la ejecución de GitHub muestre el estado Completado. Tardará unos 5 minutos.

Captura de pantalla que muestra una ejecución de GitHub en curso.

¿Tiene problemas? Consulte la sección Solución de problemas.

6. Navegación hasta la aplicación

Paso 1. En la página App Service:

  1. En el menú de la izquierda, seleccione Información general.
  2. En Dominio predeterminado, seleccione la dirección URL de la aplicación.

Captura de pantalla que muestra cómo iniciar una App Service desde Azure Portal

Paso 2: Añadir algunas tareas a la lista. Enhorabuena, ya está ejecutando una aplicación web en Azure App Service, con conectividad protegida a Azure DB for MySQL.

Recorte de pantalla de la aplicación web de JBoss con MySQL que se ejecuta en Azure.

¿Tiene problemas? Consulte la sección Solución de problemas.

7. Transmisión de registros de diagnóstico

Azure App Service captura toda la salida de mensajes hacia la consola, para ayudarle a diagnosticar problemas de la aplicación. La aplicación de ejemplo incluye instrucciones de registro Log4j estándar para demostrar esta funcionalidad, como se muestra en el siguiente fragmento de código:

private static final Logger logger = Logger.getLogger(MethodHandles.lookup().lookupClass().getName());

@PersistenceContext
private EntityManager entityManager;

public List<Task> getAllTasks() {
    logger.log(Level.INFO, "Finding all tasks. ");

    return this.entityManager.createNamedQuery("findAllTasks", Task.class).getResultList();
}

En la página App Service, en el menú de la izquierda, seleccione Secuencia del registro. Verá los registros de la aplicación, incluidos los registros de plataforma y los registros de dentro del contenedor.

Captura de pantalla que muestra cómo ver la secuencia de registro en Azure Portal

Más información sobre el registro de aplicaciones Java en la serie sobre Habilitación de Azure Monitor OpenTelemetry para aplicaciones de .NET, Node.js, Python y Java.

¿Tiene problemas? Consulte la sección Solución de problemas.

8. Limpieza de recursos

Cuando acabe, puede eliminar todos los recursos de la suscripción de Azure mediante la eliminación del grupo de recursos.

Paso 1:En la barra de búsqueda de la parte superior de Azure Portal:

  1. Escriba el nombre del grupo de recursos msdocs-jboss-mysql_group.
  2. Seleccione el grupo de recursos.

Captura de pantalla que muestra cómo localizar un grupo de recursos y navegar hasta él en Azure Portal

Paso 2: En la página del grupo de recursos, seleccione Borrar grupo de recursos.

Captura de pantalla que muestra la ubicación del botón **Eliminar grupo de recursos** en Azure Portal.

Paso 3:

  1. Para confirmar la eliminación, escriba el nombre del grupo de recursos.
  2. Seleccione Eliminar.
  3. Confirme con Eliminar de nuevo.

Captura de pantalla del diálogo de confirmación para eliminar un grupo de recursos en Azure Portal.

2. Creación de recursos de Azure e implementación de una aplicación de ejemplo

En este paso, creará los recursos de Azure e implementará una aplicación de ejemplo en App Service en Linux. Los pasos que se usan en este tutorial crean un conjunto de recursos seguros de manera predeterminada que incluyen App Service y Azure DB for MySQL.

El contenedor de desarrollo ya tiene Azure Developer CLI (AZD).

  1. Desde la raíz del repositorio, ejecute azd init.

    azd init --template jboss-app-service-mysql-infra
    
  2. Cuando se le solicite, proporcione las siguientes respuestas:

    Pregunta Respuesta
    ¿Continúa inicializando una aplicación en "<your-directory>"? Y
    ¿Qué quiere hacer con estos archivos? Mantener mis archivos existentes sin cambios
    Escribir un nuevo nombre de entorno Escriba un nombre único. La plantilla de AZD usa este nombre como parte del nombre DNS de la aplicación web en Azure (<app-name>-<hash>.azurewebsites.net). Se permiten caracteres alfanuméricos y guiones.
  3. Inicie sesión en Azure mediante la ejecución del comando azd auth login y siga la solicitud:

    azd auth login
    
  4. Cree los recursos de Azure necesarios e implemente el código de la aplicación con el comando azd up. Siga la solicitud para seleccionar la suscripción y la ubicación deseadas para los recursos de Azure.

    azd up
    

    El comando azd up tarda unos 15 minutos en completarse (la Redis Cache tarda más tiempo). También compila e implementa el código de la aplicación, pero modificará el código más adelante para trabajar con App Service. Mientras se ejecuta, el comando proporciona mensajes sobre el proceso de aprovisionamiento e implementación, incluido un vínculo a la implementación en Azure. Cuando termina, el comando también muestra un vínculo a la aplicación implementada.

    Esta plantilla de AZD contiene archivos (azure.yaml y el directorio infra) que generarán una arquitectura segura de manera predeterminada con los siguientes recursos de Azure:

    • Grupo de recursos: contenedor para todos los recursos creados.
    • Plan de App Service: define los recursos de proceso de App Service. Se crea un plan de Linux en el nivel B1.
    • App Service: representa su aplicación y se ejecuta en el plan de App Service.
    • Red virtual: se integra con la aplicación App Service y aísla el tráfico de back-end.
    • Servidor flexible de Azure Database for MySQL: accesible solo desde la red virtual. Se crea una base de datos automáticamente en el servidor.
    • Azure Cache for Redis: accesible solo desde la red virtual.
    • Puntos de conexión privados: acceda a puntos de conexión para el almacén de claves y Redis Cache en la red virtual.
    • Zonas DNS privado: habilitar la resolución DNS del servidor de base de datos y la caché de Redis en la red virtual.
    • Área de trabajo de Log Analytics: actúa como contenedor de destino para que su aplicación envíe sus registros, donde también puede consultar los registros.
    • Almacén de claves: se usa para mantener la contraseña de la base de datos igual al volver a implementar con AZD.

    Una vez que el comando termina de crear recursos e implementar el código de la aplicación la primera vez, la aplicación de ejemplo implementada aún no funciona porque debe realizar pequeños cambios para conectarse a la base de datos en Azure.

¿Tiene problemas? Consulte la sección Solución de problemas.

3. Comprobación de cadenas de conexión

La plantilla de AZD que usa ya ha generado las variables de conectividad como valores de la aplicación y las envía al terminal para mayor comodidad. La configuración de la aplicación es una forma de mantener los secretos de conexión fuera del repositorio de código.

  1. En la salida de AZD, busque el valor de la aplicación AZURE_MYSQL_CONNECTIONSTRING. Solo se muestran los nombres de configuración. Tienen este aspecto en la salida de AZD:

     App Service app has the following app settings:
             - AZURE_KEYVAULT_RESOURCEENDPOINT
             - AZURE_KEYVAULT_SCOPE
             - AZURE_MYSQL_CONNECTIONSTRING
             - AZURE_REDIS_CONNECTIONSTRING
     

    AZURE_MYSQL_CONNECTIONSTRING contiene la cadena de conexión a la base de datos MySQL en Azure. Debe usarla en el código más adelante.

  2. Para mayor comodidad, la plantilla de AZD muestra el vínculo directo a la página de configuración de la aplicación. Busque el vínculo y ábralo en una nueva pestaña del explorador.

    Si agrega una configuración de aplicación que contiene una cadena de conexión válida de Oracle, SQL Server, PostgreSQL o MySQL, App Service la agrega como origen de datos de interfaz de directorio y nomenclatura de Java (JNDI) en el archivo context.xml del servidor JBoss.

¿Tiene problemas? Consulte la sección Solución de problemas.

4. Confirmación del origen de datos JNDI

En este paso, usará la conexión SSH al contenedor de aplicaciones para comprobar el origen de datos JNDI en el servidor JBoss. En el proceso, aprenderá a acceder al shell SSH para el contenedor de JBoss.

  1. En la salida de AZD, busque la dirección URL de la sesión SSH y vaya a ella en el explorador. Se parece a esto en la salida:

     Open SSH session to App Service container at: https://<app-name>-<hash>.scm.azurewebsites.net/webssh/host
     
  2. En el terminal de SSH, ejecute $JBOSS_HOME/bin/jboss-cli.sh --connect.

  3. En la conexión de la CLI de JBoss, ejecute ls subsystem=datasources/data-source. Debería ver el origen de datos generado de forma automática denominado AZURE_MYSQL_CONNECTIONSTRING_DS.

  4. Obtenga el nombre de JNDI del origen de datos con /subsystem=datasources/data-source=AZURE_MYSQL_CONNECTIONSTRING_DS:read-attribute(name=jndi-name). Ahora tiene un nombre de JNDI java:jboss/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS, que puede usar en el código de la aplicación más adelante.

    Captura de pantalla que muestra los comandos que se ejecutan en el shell de SSH y su salida correspondiente

Nota:

Cuando la aplicación se reinicie, solo persisten los cambios realizados en los archivos ubicados en /home. Por ejemplo, si edita /opt/eap/standalone/configuration/standalone.xml o cambia la configuración del servidor en la CLI de JBoss, los cambios no se conservarán después de reiniciar la aplicación. Para conservar los cambios, use un script de inicio, como se muestra en Configuración de orígenes de datos para una aplicación Tomcat, JBoss o Java SE en Azure App Service.

¿Tiene problemas? Consulte la sección Solución de problemas.

5. Modificación del código de ejemplo y reimplementación

  1. En el espacio de código de GitHub, inicie una nueva sesión de chat haciendo clic en la vista Chat y, a continuación, haga clic en +.

  2. Pregunte: "@workspace ¿Cómo se conecta la aplicación a la base de datos?" Copilot puede darle una explicación sobre el origen de datos de java:jboss/MySQLDS y de cómo está configurado.

  3. Pregunte: "@workspace quiero reemplazar el origen de datos definido en persistence.xml por un origen de datos JNDI existente en JBoss." Copilot puede proporcionarle una sugerencia de código similar a la de la Opción 2: sin GitHub Copilot pasos a continuación e incluso avisarle que realice el cambio en el archivo persistence.xml.

  4. Abra src/main/resources/META-INF/persistence.xml en el explorador y realice el cambio de JNDI sugerido.

    GitHub Copilot no proporciona la misma respuesta cada vez, es posible que tenga que formular otras preguntas para ajustar su respuesta. Para obtener sugerencias, consulte ¿Qué puedo hacer con GitHub Copilot en mi espacio de código?.

  5. En el terminal de codespace, ejecute azd deploy.

    azd deploy
    

Sugerencia

También puede usar siempre azd up, que hace todas las azd package, azd provision, y azd deploy.

Para averiguar cómo se empaqueta el archivo War, puede ejecutarse azd package --debug por sí mismo.

¿Tiene problemas? Consulte la sección Solución de problemas.

6. Navegación hasta la aplicación

  1. En la salida de AZD, busque la dirección URL de la aplicación y vaya a ella en el explorador. La dirección URL tiene este aspecto en la salida de AZD:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: https://<app-name>-<hash>.azurewebsites.net/
     
  2. Agregue algunas tareas a la lista.

    Captura de pantalla de la aplicación web JBoss con MySQL que se ejecuta en Azure en la que se muestran las tareas.

    Enhorabuena, ya está ejecutando una aplicación web en Azure App Service, con conectividad protegida a Azure DB for MySQL.

¿Tiene problemas? Consulte la sección Solución de problemas.

7. Transmisión de registros de diagnóstico

Azure App Service puede capturar registros de consola para ayudarle a diagnosticar problemas con la aplicación. Para mayor comodidad, la plantilla de AZD ya ha habilitado el registro en el sistema de archivos local y está enviando los registros a un área de trabajo de Log Analytics.

La aplicación de ejemplo incluye instrucciones de registro Log4j estándar para demostrar esta funcionalidad, como se muestra en el siguiente fragmento de código:

private static final Logger logger = Logger.getLogger(MethodHandles.lookup().lookupClass().getName());

@PersistenceContext
private EntityManager entityManager;

public List<Task> getAllTasks() {
    logger.log(Level.INFO, "Finding all tasks. ");

    return this.entityManager.createNamedQuery("findAllTasks", Task.class).getResultList();
}

En la salida de AZD, busque el vínculo para transmitir registros de App Service y vaya a él en el explorador. El vínculo tiene este aspecto en la salida de AZD:

Stream App Service logs at: https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream

Más información sobre el registro de aplicaciones Java en la serie sobre Habilitación de Azure Monitor OpenTelemetry para aplicaciones de .NET, Node.js, Python y Java.

¿Tiene problemas? Consulte la sección Solución de problemas.

8. Limpieza de recursos

Para eliminar todos los recursos de Azure en el entorno de implementación actual, ejecute azd down y siga las indicaciones.

azd down

Solución de problemas

Aparece el error "no autorizado para usar la característica Traiga su propia licencia" en el asistente para la creación.

Si aparece el error The subscription '701ea799-fb46-4407-bb67-9cbcf289f1c7' is not entitled to use the Bring Your Own License feature when creating the application, significa que ha seleccionado Licencia de Red Hat JBoss EAP 7/8 BYO en Pila de servidor web Java, pero no ha configurado la cuenta de Azure en Red Hat Cloud Access o bien no tiene una licencia de JBoss EAP activa en Red Hat Cloud Access.

La vista de implementación del portal para el servidor flexible de Azure Database for MySQL muestra un estado de conflicto.

Según la suscripción y la región que seleccione, es posible que vea el estado de implementación del servidor flexible de Azure Database for MySQL para que sea Conflict, con el siguiente mensaje en Detalles de la operación:

InternalServerError: An unexpected error occured while processing the request.

Este error es más probable que se deba a un límite en la suscripción para la región que seleccionó. Pruebe a elegir otra región para la implementación.

El cuadro de diálogo Crear conexión muestra un botón Crear en Cloud Shell, pero no está habilitado.

También puede ver un mensaje de error en el cuadro de diálogo: The database server is in Virtual Network and Cloud Shell can't connect to it. Please copy the commands and execute on an environment which can connect to the database server in Virtual Network.

La automatización del conector de servicio necesita acceso de red al servidor MySQL. Busque en la configuración de red del recurso del servidor MySQL y asegúrese de que se haya seleccionado como mínimo Permitir el acceso público a este recurso a través de Internet mediante una dirección IP pública. El conector de servicio puede encargarse a partir de ahí.

Si la casilla no aparece, es posible que haya creado la implementación mediante el asistente para aplicaciones web y bases de datos y, en su lugar, la implementación bloquea todo acceso a la red pública para el servidor MySQL. No hay ninguna forma de modificar la configuración. Dado que el contenedor Linux de la aplicación puede acceder a MySQL a través de la integración de la red virtual, puede instalar la CLI de Azure en la sesión SSH de la aplicación y ejecutar ahí los comandos de Cloud Shell proporcionados.

La aplicación de ejemplo implementada no muestra la aplicación de lista de tareas.

Si ve una página de presentación de JBoss en lugar de la aplicación de lista de tareas, es más probable que App Service siga cargando el contenedor actualizado desde la implementación de código más reciente. Espere unos minutos y actualice la página.

Mi aplicación no se ha podido iniciar y en los registros aparece el mensaje "Acceso denegado para el usuario... (uso de contraseña: NO)".

Probablemente este error se deba a que no ha agregado el complemento de autenticación sin contraseña a la cadena de conexión (consulte el código de ejemplo de Java para Integración de Azure Database for MySQL con Service Connector). Siga las instrucciones indicadas en 3. Creación de una conexión sin contraseña para cambiar la cadena de conexión de MySQL.

Aparece el error "Ya existe la tabla 'Task'" en los registros de diagnóstico.

Puede ignorar este error de Hibernate porque indica que el código de la aplicación está conectado a la base de datos MySQL. La aplicación está configurada para crear las tablas necesarias cuando se inicia (consulte src/main/resources/META-INF/persistence.xml). Cuando la aplicación se inicia por primera vez, debe crear las tablas correctamente, pero en los reinicios posteriores este error aparecerá porque las tablas ya existen.

Preguntas más frecuentes

¿Cuánto cuesta esta configuración?

Los precios por los recursos creados son los siguientes:

  • El plan de App Service se crea en el nivel P0v3 y puede escalar o reducirse verticalmente. Consulte Precios de App Service.
  • El servidor flexible de MySQL se crea en el nivel D2ds y puede escalar o reducirse verticalmente. Consulte Precios de Azure Database for MySQL.
  • El Azure Cache for Redis se crea en el nivel Básico con el tamaño mínimo de caché. Hay un pequeño costo asociado a este nivel. Puede escalar verticalmente a niveles de rendimiento superiores para una mayor disponibilidad, agrupación en clústeres y otras características. Consulte Precios de Azure Cache for Redis.
  • La red virtual no incurre en cargo alguno, a menos que se configure alguna funcionalidad extra, como, por ejemplo, el emparejamiento. Vea Precios de Azure Virtual Network.
  • La zona DNS privada conlleva un pequeño cargo. Vea Precios de Azure DNS.

¿Cómo me conecto al servidor MySQL detrás de la red virtual con otras herramientas?

En este tutorial, la aplicación de App Service ya tiene conectividad de red con el servidor MySQL y puede autenticarse con Microsoft Entra mediante su identidad administrada asignada por el sistema. Para conectarse a MySQL directamente desde el contenedor de aplicaciones, ejecute los siguientes comandos en la sesión SSH (obtenga los valores de <server>, <user>y <database> de la configuración de la aplicación AZURE_MYSQL_CONNECTIONSTRING):

apt-get update
apt-get install curl less mysql-client jq -y
mysql -h <server> --user <user> --database <database> --enable-cleartext-plugin --password=`curl "${IDENTITY_ENDPOINT}?resource=https://ossrdbms-aad.database.windows.net&api-version=2019-08-01" -H "X-IDENTITY-HEADER: $IDENTITY_HEADER" -s | jq -r '.access_token'`

Algunas consideraciones:

  • Las herramientas que instale en la sesión SSH no se conservan en los reinicios de la aplicación.
  • Si ha seguido los pasos del portal y ha configurado MySQL con el usuario de Microsoft Entra como administrador, puede conectarse a MySQL mediante el usuario de Microsoft Entra.
  • Para conectarse desde una herramienta de escritorio como MySQL Workbench, la máquina debe estar dentro de la red virtual, como una máquina virtual de Azure implementada en la misma red virtual. También debe configurar la autenticación por separado, ya sea con una identidad administrada o con un usuario de Microsoft Entra.
  • Para conectarse desde una máquina de una red local que tenga una VPN de sitio a sitio conexión con la red virtual de Azure, no puede configurar la autenticación con una identidad administrada, pero puede configurar la autenticación mediante un usuario de Microsoft Entra.
  • También puede integrar Azure Cloud Shell y conectarse mediante la CLI de Azure o la CLI de MySQL. Para autenticarse, puede configurar un usuario de Microsoft Entra.

¿Cómo obtengo un token de acceso válido para la conexión mySQL mediante la autenticación de Microsoft Entra?

Para un usuario de Microsoft Entra, una identidad administrada asignada por el sistema o una identidad administrada asignada por el usuario autorizada para acceder a la base de datos MySQL, la CLI de Azure puede ayudarle a generar un token de acceso. En el caso de una identidad administrada, la identidad debe configurarse en la aplicación o máquina virtual de App Service donde ejecute la CLI de Azure.

# Sign in as a Microsoft Entra user
az login
# Sign in as the system-assigned managed identity
az login --identity
# Sign in as a user-assigned managed identity
az login --identity --username <client-id-of-user-assigned-identity>

# Get an access token
az account get-access-token --resource-type oss-rdbms

Si lo desea, también puede utilizar el comando CLI de Azure az mysql flexible-server connect para conectarse a MySQL. Cuando se le solicite, use el token de acceso como contraseña.

az mysql flexible-server connect -n <server-name-only> -u <user> -d <database> --interactive

Para más información, vea:

¿Cómo funciona el desarrollo de aplicaciones locales con Acciones de GitHub?

Tomando como ejemplo el archivo de flujo de trabajo generado automáticamente de App Service: cada git push inicia una nueva ejecución de compilación e implementación. Desde un clon local del repositorio de GitHub, realiza las actualizaciones deseadas y las inserta en GitHub. Por ejemplo:

git add .
git commit -m "<some-message>"
git push origin starter-no-infra

No tengo permisos para crear una identidad asignada por el usuario

Consulte Configuración de la implementación de Acciones de GitHub desde el centro de implementación.

¿Qué puedo hacer con GitHub Copilot en mi codespace?

Es posible que observe que la vista de chat de GitHub Copilot ya estaba allí cuando creó el codespace. Para mayor comodidad, incluimos la extensión de chat de GitHub Copilot en la definición del contenedor (consulte .devcontainer/devcontainer.json). Sin embargo, necesita una cuenta de GitHub Copilot (versión de prueba gratuita de 30 días disponible).

Algunas sugerencias para usted al hablar con GitHub Copilot:

  • En una sola sesión de chat, las preguntas y respuestas se basan entre sí y puede ajustar sus preguntas para ajustar la respuesta que obtenga.
  • De forma predeterminada, GitHub Copilot no tiene acceso a ningún archivo del repositorio. Para formular preguntas sobre un archivo, abra primero el archivo en el editor.
  • Para permitir que GitHub Copilot tenga acceso a todos los archivos del repositorio al preparar sus respuestas, comience la pregunta con @workspace. Para obtener más información, vea Use the @workspace agent.
  • En la sesión de chat, GitHub Copilot puede sugerir cambios y (con @workspace) incluso donde realizar los cambios, pero no se permite realizar los cambios automáticamente. Es necesario agregar los cambios sugeridos y probarlos.

Estas son algunas otras cosas que puede decir para ajustar la respuesta que obtiene:

  • Cambie este código para usar el origen de datos jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS.
  • Algunas importaciones del código usan javax, pero tengo una aplicación de Jakarta.
  • Quiero que este código se ejecute solo si se establece la variable de entorno AZURE_MYSQL_CONNECTIONSTRING.
  • Quiero que este código solo se ejecute en Azure App Service y no localmente.

Pasos siguientes

Para obtener más información sobre la ejecución de aplicaciones Java en App Service, consulte la guía del desarrollador.

Obtenga información sobre cómo proteger la aplicación con un dominio personalizado y un certificado.