Tutorial: Compilación de una aplicación web de Tomcat con Azure App Service en Linux y MySQL
En este tutorial se muestra cómo compilar, configurar e implementar una aplicación segura de Tomcat en Azure App Service que se conecta a una base de datos MySQL (mediante 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 de Tomcat que se ejecuta en Azure App Service en Linux.
En este tutorial, aprenderá a:
- Cree una arquitectura predeterminada segura para Azure App Service y Azure Database for MySQL.
- Protección de secretos de conexión mediante una identidad administrada y referencias de Key Vault.
- Implemente una aplicación de ejemplo de Tomcat 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 el desarrollo de Tomcat.
- (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 el desarrollo de Tomcat.
- (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-tomcat-mysql-sample-app
cd msdocs-tomcat-mysql-sample-app
azd init --template msdocs-tomcat-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:
- Inicie sesión en su cuenta de GitHub.
- Vaya a https://github.com/Azure-Samples/msdocs-tomcat-mysql-sample-app/fork.
- Anule la selección de Copiar solo la rama principal. Quiere todas las ramas.
- Seleccione Crear bifurcación.
Paso 2: en la bifurcación de GitHub:
- 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.
Paso 3: En el terminal de codespace:
- Ejecute
mvn jetty:run
. - Cuando vea la notificación
Your application running on port 80 is available.
, seleccione Abrir en explorador. Debería ver la aplicación de ejemplo en una nueva pestaña del explorador. Para detener el servidor Jetty, escribaCtrl
+C
.
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:
- Escriba "base de datos de aplicación web" en la barra de búsqueda de la parte superior de Azure Portal.
- Seleccione el elemento denominado Aplicación web + base de datos en el encabezado Marketplace. También puede ir directamente al asistente de creación.
Paso 2: In the páginaCrear aplicación web + base de datos, rellene el formulario de la siguiente manera.
- Grupo de recursos: seleccione Crear nuevo y use el nombre msdocs-tomcat-mysql-tutorial.
- Región: cualquier región de Azure cercana a usted.
- Nombre: msdocs-tomcat-mysql-XYZ, donde XYZ es de tres caracteres aleatorios.
- Pila en runtime: Java 17.
- Pila de servidores web de Java: Apache Tomcat 10.1.
- MySQL: servidor flexible está seleccionado de forma predeterminada como motor de base de datos. Si no es así, selecciónelo. Azure Database for MySQL es una base de datos MySQL como servicio totalmente administrada de Azure, compatible con las últimas ediciones de la comunidad.
- Plan de hospedaje: Básico. Cuando esté listo, puede escalar verticalmente a un plan de tarifa de producción.
- Seleccione Revisar + crear.
- Una vez completada la validación, seleccione Crear.
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.
¿Tiene problemas? Consulte la sección Solución de problemas.
3. Protección de secretos de conexión
El Asistente para la creación generó la cadena de conectividad para usted como configuración de la aplicación. Sin embargo, el procedimiento recomendado de seguridad es mantener completamente los secretos fuera de App Service. Moverá los secretos al almacén de claves y cambiará la configuración de la aplicación a una referencia de Key Vault con la ayuda de los conectores de seguridad.
Paso 1. En la página App Service:
- En el menú de la izquierda, seleccione Configuración > Variables de entorno.
- Seleccione AZURE_MYSQL_CONNECTIONSTRING. Contiene una cadena de conexión JDBC. Si agrega un valor 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 nomenclatura y directorio Java (JNDI) en el archivo context.xml del servidor Tomcat.
- En Agregar o editar configuración de aplicación, en el campo Valor, busque la parte password= al final de la cadena.
- Copie la cadena de contraseña después de Password= para usarla más adelante. Esta configuración de aplicación le permite conectarse a la base de datos MySQL protegida tras un punto de conexión privado. Sin embargo, el secreto se guarda directamente en la aplicación de App Service, que no es lo mejor. Cambiará esto.
Paso 2: Creación de un almacén de claves para la administración segura de secretos.
- En la barra de búsqueda superior, escriba "almacén de claves" y, a continuación, seleccione Marketplace>Key Vault.
- En Grupode recursos, seleccione msdocs-tomcat-mysql-tutorial.
- En Nombre del almacén de claves, escriba un nombre que consta de solo letras y números.
- En Región, establézcalo en la ubicación de ejemplo como grupo de recursos.
Paso 3:
- Seleccione la pestaña Redes.
- Anule la selección de Habilitar acceso público.
- Seleccione Crear un punto de conexión privado.
- En Grupode recursos, seleccione msdocs-tomcat-mysql-tutorial.
- En Nombre del almacén de claves, escriba un nombre que consta de solo letras y números.
- En Región, establézcalo en la ubicación de ejemplo como grupo de recursos.
- En el cuadro de diálogo, en Ubicación, seleccione la misma ubicación que la aplicación de App Service.
- En Grupode recursos, seleccione msdocs-tomcat-mysql-tutorial.
- En Nombre, escriba msdocs-tomcat-mysql-XYZVaultEndpoint.
- En Red virtual, seleccione msdocs-tomcat-mysql-XYZVnet.
- En Subred, msdocs-tomcat-mysql-XYZSubnet.
- Seleccione Aceptar.
- Seleccione Revisar y crear y, luego, Crear. Espere a que finalice la implementación del almacén de claves. Debería ver "La implementación está completa".
Paso 4:
- En la barra de búsqueda superior, escriba msdocs-tomcat-mysql y, a continuación, el recurso de App Service denominado msdocs-tomcat-mysql-XYZ.
- En la página App Service, en el menú de la izquierda, seleccione Configuración > Conector de servicio. Ya hay un conector, que el asistente para la creación de aplicaciones ha creado automáticamente.
- Active la casilla situada junto al conector y seleccione Editar.
- En la pestaña Aspectos básicos, establezca Tipo de cliente en Java.
- Seleccione la pestaña Autenticación.
- En Contraseña, pegue la contraseña que copió anteriormente.
- Seleccione Almacenar secreto en Key Vault.
- En Conexión de Key Vault, seleccione Crear nuevo. Se abre un cuadro de diálogo Crear conexión encima del cuadro de diálogo de edición.
Paso 5: En el cuadro de diálogo Crear de conexión para la conexión de Key Vault:
- En Key Vault, seleccione el almacén de claves que creó anteriormente.
- Seleccione Revisar + crear. Debería ver que Identidad administrada asignada por el sistema está establecida en Seleccionados.
- Cuando se complete la validación, seleccione Crear.
Paso 6: Vuelve al cuadro de diálogo de edición de defaultConnector.
- En la pestaña Autenticación, espere a que se cree el conector del almacén de claves. Cuando haya terminado, la lista desplegable Conexión de Key Vault la selecciona automáticamente.
- Seleccione Siguiente: Redes.
- Seleccione Guardar. Espere hasta que aparezca la Actualización correcta notificación.
Paso 7: Para comprobar los cambios:
- En el menú de la izquierda, vuelva a seleccionar Variables > de entorno Cadenas de conexión.
- Junto a AZURE_MYSQL_CONNECTIONSTRING, seleccione Mostrar valor. El valor debe ser
@Microsoft.KeyVault(...)
, lo que significa que es un referencia del almacén de claves porque el secreto ahora se administra en el almacén de claves.
¿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 la agrega como origen de datos de interfaz de nomenclatura y directorio Java (JNDI) en el archivo context.xml del servidor Tomcat. En este paso, usará la conexión SSH al contenedor de aplicaciones para comprobar el origen de datos JNDI. En el proceso, obtendrá información sobre cómo acceder al shell SSH para el contenedor de Tomcat.
Paso 1: en la página de App Service:
- En el menú de la izquierda, seleccione SSH.
- Seleccione Ir.
Paso 2: en el terminal SSH, ejecute cat /usr/local/tomcat/conf/context.xml
. Debería ver que se agregó un recurso JNDI denominado jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS
. Usará este origen de datos más adelante.
Nota:
Cuando la aplicación se reinicie, solo persisten los cambios realizados en los archivos ubicados en /home
. Por ejemplo, si edita /usr/local/tomcat/conf/server.xml
, los cambios no se conservarán después de un reinicio de la aplicación.
¿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 Tomcat, si quiere implementar en el contexto raíz de Tomcat, 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 Centro de implementación.
Paso 2: En la página Centro de implementación:
- En Origen, seleccione GitHub. De forma predeterminada, Acciones de GitHub está seleccionado como proveedor de compilación.
- Inicie sesión en su cuenta de GitHub y siga las indicaciones para autorizar a Azure.
- En Organización, seleccione su cuenta.
- En Repositorio, seleccione msdocs-tomcat-mysql-sample-app.
- 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.
- En Tipo de autenticación, seleccione Identidad asignada por el usuario.
- 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.
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.
Paso 4 (Opción 1: con GitHub Copilot):
- Inicie una nueva sesión de chat haciendo clic en la vista Chat y, a continuación, haga clic en +.
- 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
jdbc/MYSQLDS
y de cómo está configurado. - Pregunte: "@workspace quiero reemplazar el origen de datos definido en persistence.xml por un origen de datos JNDI existente en Tomcat, pero quiero hacerlo dinámicamente.". Copilot puede proporcionarle una sugerencia de código similar a la de los pasos a continuación Opción 2: sin GitHub Copilot e incluso decirle que realice el cambio en la clase ContextListener.
- Abra src/main/java/com/microsoft/azure/appservice/examples/tomcatmysql/ContextListener.java en el explorador y agregue la sugerencia de código en el método
contextInitialized
. 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?.
Paso 4 (Opción 2: sin GitHub Copilot):
- Abra src/main/java/com/microsoft/azure/appservice/examples/tomcatmysql/ContextListener.java en el explorador. Cuando se inicia la aplicación, esta clase carga la configuración de la base de datos en src/main/resources/META-INF/persistence.xml.
- En el método
contextIntialized()
, busque el código comentado (líneas 29-33) y quite los comentarios. Este código comprueba si existe el valor de la aplicaciónAZURE_MYSQL_CONNECTIONSTRING
y cambia el origen de datos ajava:comp/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS
, que es el origen de datos que encontró anteriormente en context.xml en el shell SSH.
Paso 5:
- Seleccione la extensión Control de código fuente.
- En el cuadro de texto, escriba un mensaje de confirmación, por ejemplo,
Configure Azure data source
. - Seleccione Confirmar y, a continuación, confirme con Sí.
- Seleccione Sincronización de cambios 1 y confirme con Aceptar.
Paso 6: De vuelta en la página Centro de implementación en Azure Portal:
- Seleccione Registros. Ya se ha iniciado una nueva ejecución de implementación a partir de los cambios confirmados.
- 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.
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.
¿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:
- En el menú de la izquierda, seleccione Información general.
- Seleccione la dirección URL de la aplicación.
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.
¿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:
@WebServlet(urlPatterns = "/")
public class ViewServlet extends HttpServlet {
private static Logger logger = LogManager.getLogger(ViewServlet.class.getName());
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("GET /");
EntityManagerFactory emf = (EntityManagerFactory) req.getServletContext().getAttribute("EMFactory");
Paso 1. En la página App Service:
- En el menú de la izquierda, seleccione Registros de App Service.
- En Registro de aplicaciones, seleccione Sistema de archivos.
- En el menú superior, elija Guardar.
Paso 2: En el menú de la izquierda, seleccione Flujo de registro. Verá los registros de la aplicación, incluidos los registros de plataforma y los registros de dentro del contenedor.
Para obtener más información sobre el registro de aplicaciones Java en la serie, consulte 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:
- Escriba el nombre del grupo de recursos.
- Seleccione el grupo de recursos.
Paso 2: En la página del grupo de recursos, seleccione Borrar grupo de recursos.
Paso 3:
- Para confirmar la eliminación, escriba el nombre del grupo de recursos.
- Seleccione Eliminar.
- Confirme con Eliminar de nuevo.
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).
Desde la raíz del repositorio, ejecute
azd init
.azd init --template tomcat-app-service-mysql-infra
Cuando se le solicite, proporcione las siguientes respuestas:
Pregunta Respuesta El directorio actual no está vacío. ¿Desea inicializar un proyecto aquí en "<su directorio>"? 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.Inicie sesión en Azure mediante la ejecución del comando
azd auth login
y siga la solicitud:azd auth login
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 a través de la integración de la zona DNS. 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.
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 connection strings: - AZURE_MYSQL_CONNECTIONSTRING - AZURE_REDIS_CONNECTIONSTRING - AZURE_KEYVAULT_RESOURCEENDPOINT - AZURE_KEYVAULT_SCOPE
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.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 un valor 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 nomenclatura y directorio Java (JNDI) en el archivo context.xml del servidor Tomcat.
¿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 Tomcat. En el proceso, obtendrá información sobre cómo acceder al shell SSH para el contenedor de Tomcat.
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
En el terminal de SSH, ejecute
cat /usr/local/tomcat/conf/context.xml
. Debería ver que se agregó un recurso JNDI denominadojdbc/AZURE_MYSQL_CONNECTIONSTRING_DS
. Usará este origen de datos más adelante.
Nota:
Cuando la aplicación se reinicie, solo persisten los cambios realizados en los archivos ubicados en /home
. Por ejemplo, si edita /usr/local/tomcat/conf/server.xml
, los cambios no se conservarán después de un reinicio de la aplicación.
¿Tiene problemas? Consulte la sección Solución de problemas.
5. Modificación del código de ejemplo y reimplementación
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 +.
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
jdbc/MYSQLDS
y de cómo está configurado.Pregunte: "@workspace quiero reemplazar el origen de datos definido en persistence.xml por un origen de datos JNDI existente en Tomcat, pero quiero hacerlo dinámicamente". Copilot puede proporcionarle una sugerencia de código similar a la de los pasos de la Opción 2: sin GitHub Copilot que se indican a continuación e incluso indicarle que realice el cambio en la clase ContextListener.
Abra src/main/java/com/microsoft/azure/appservice/examples/tomcatmysql/ContextListener.java en el explorador y agregue la sugerencia de código en el método
contextInitialized
.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?.
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
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/
Agregue 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.
¿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:
@WebServlet(urlPatterns = "/")
public class ViewServlet extends HttpServlet {
private static Logger logger = LogManager.getLogger(ViewServlet.class.getName());
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("GET /");
EntityManagerFactory emf = (EntityManagerFactory) req.getServletContext().getAttribute("EMFactory");
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
Para obtener más información sobre el registro de aplicaciones Java en la serie, consulte 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
- Veo muchas <Clase> escaneadas desde varias advertencias de ubicaciones con mvn jetty:run
- La vista de implementación del portal para el servidor flexible de Azure Database for MySQL muestra un estado de conflicto
- La aplicación de ejemplo implementada no muestra la aplicación de lista de tareas
- Veo un error 404 de página no encontrada en la aplicación de ejemplo implementada
Veo muchas <Clase> escaneadas desde varias advertencias de ubicaciones con mvn jetty:run
Las advertencias se pueden omitir. El complemento Maven Jetty muestra las advertencias porque el pom.xml de la aplicación contiene la dependencia de jakarta.servlet.jsp.jstl
, que el Jetty ya proporciona listo para usar. Necesita la dependencia para Tomcat.
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.
La aplicación de ejemplo implementada no muestra la aplicación de lista de tareas
Si ve una página Hey, Java developers!
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.
Veo un error 404 de página no encontrada en la aplicación de ejemplo implementada
Asegúrese de que ha realizado los cambios de código para usar el origen de datos java:comp/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS
. Si ha realizado los cambios y ha implementado el código de nuevo, es más probable que App Service siga cargando el contenedor actualizado. Espere unos minutos y actualice la página.
Preguntas más frecuentes
- ¿Cuánto cuesta esta configuración?
- ¿Cómo me conecto al servidor MySQL detrás de la red virtual con otras herramientas?
- ¿Cómo funciona el desarrollo de aplicaciones locales con Acciones de GitHub?
- No tengo permisos para crear una identidad asignada por el usuario
- ¿Qué puedo hacer con GitHub Copilot en mi codespace?
¿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 Básico y puede escalar o reducirse verticalmente. Consulte Precios de App Service.
- El servidor flexible de MySQL se crea en el nivel B1ms y puede escalar o reducirse verticalmente. Con una cuenta gratuita de Azure, el nivel B1ms es gratuito durante 12 meses, hasta los límites mensuales que se hayan fijado. 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?
- Actualmente, el contenedor de Tomcat no tiene el terminal
mysql-client
. Si lo desea, debe instalarlo manualmente. Recuerde que todo lo que instale no se conserva en los reinicios de la aplicación. - Para conectarse desde una herramienta de escritorio como MySQL Workbench, la máquina debe estar en la red virtual. Por ejemplo, podría ser una máquina virtual de Azure en una de las subredes, o una máquina de una red local que tenga una conexión VPN de sitio a sitio a la red virtual de Azure.
- También puede integrar Azure Cloud Shell en la red virtual.
¿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 main
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.