Tutorial: Implementación de una aplicación de ASP.NET Core y Azure SQL Database en Azure App Service

En este tutorial, aprenderá a implementar una aplicación de ASP.NET Core controlada por datos para Azure App Service y conectarse a un Azure SQL Database. También implementará un Azure Cache for Redis para habilitar el código de almacenamiento en caché en la aplicación. Azure App Service es un servicio de hospedaje web altamente escalable y autoaplicado que puede implementar fácilmente aplicaciones en Windows o Linux. Aunque en este tutorial se usa una aplicación ASP.NET Core 8.0, el proceso es el mismo para otras versiones de ASP.NET Core.

En este tutorial, aprenderá a:

  • Cree una arquitectura de App Service, SQL Database y Redis Cache segura de forma predeterminada.
  • Proteger secretos de conexión mediante una identidad administrada y referencias de Key Vault.
  • Implemente una aplicación de ASP.NET Core de ejemplo en App Service desde un repositorio de GitHub.
  • Acceda a las cadenas de conexión de App Service y a la configuración de la aplicación en el código de la aplicación.
  • Realice actualizaciones y vuelva a implementar el código de la aplicación.
  • Genere el esquema de base de datos subiendo un paquete de migraciones.
  • Transmita registros de diagnóstico desde Azure.
  • Administre la aplicación en el portal de Azure.
  • Aprovisione la misma arquitectura e implemente mediante Azure CLI para desarrolladores.
  • Optimice el 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 crear una gratuita.
  • Una cuenta de GitHub. También puede obtener uno gratis.
  • Conocimientos de desarrollo de ASP.NET Core.
  • (Optional) 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 crear una gratuita.
  • Azure CLI para desarrolladores instalado. Puede seguir los pasos con el Azure Cloud Shell porque ya tiene instalada la CLI para desarrolladores de Azure.
  • Conocimientos de desarrollo de ASP.NET Core.
  • (Optional) Para probar GitHub Copilot, una cuenta de GitHub Copilot. Hay disponible una evaluación gratuita de 30 días.

Ir al final

Si solo quiere ejecutar los siguientes comandos en el Azure Cloud Shell para ver la aplicación de ejemplo de este tutorial que se ejecuta en Azure, y siga las instrucciones.

dotnet tool install --global dotnet-ef
mkdir msdocs-app-service-sqldb-dotnetcore
cd msdocs-app-service-sqldb-dotnetcore
azd init --template msdocs-app-service-sqldb-dotnetcore
azd up

1. Ejecución del ejemplo

Primero, configuras un ejemplo de aplicación impulsada por datos como punto de partida. Para mayor comodidad, el repositorio de muestras incluye una configuración del 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 se puede ejecutar en un GitHub codespace, 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-app-service-sqldb-dotnetcore/fork.
  3. Anule la selección de Copiar solo la rama principal. Quieres todas las ramas.
  4. Seleccione Crear bifurcación.

Step 2: En el fork de GitHub:

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

captura de pantalla A que muestra cómo crear un espacio de código en GitHub.

Paso 3: En el terminal de codespace:

  1. Ejecute las migraciones de la base de datos con dotnet ef database update.
  2. Ejecute la aplicación con dotnet run.
  3. Cuando vea la notificación Your application running on port 5093 is available., seleccione Abrir en explorador. Debería ver la aplicación de ejemplo en una nueva pestaña del explorador. Para detener la aplicación, escriba Ctrl+C.

Una captura de pantalla que muestra cómo ejecutar la aplicación de ejemplo dentro del Codespace de GitHub.

Sugerencia

Puede preguntar a GitHub Copilot acerca de 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, base de datos y caché

En este paso, creará los recursos de Azure. Los pasos que se usan en este tutorial crean un conjunto de recursos seguros de forma predeterminada que incluyen App Service, Azure SQL Database y Azure Cache. En el proceso de creación especificará lo siguiente:

  • El Nombre de la aplicación web. Se usa como parte del nombre DNS de la aplicación.
  • 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. Es donde seleccionas la versión de .NET que se 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 le permite agrupar (en un contenedor lógico) todos los recursos Azure necesarios para la aplicación.

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

Step 1: En el portal de 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.

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

  1. Nombre: msdocs-core-sql-XYZ. Se generará un grupo de recursos denominado msdocs-core-sql-XYZ_group .
  2. Runtime stack: .NET 8 (LTS).
  3. Sistema operativo: Linux.
  4. Región: su región preferida.
  5. Plan de Linux: cree nuevo y use el nombre msdocs-core-sql-XYZ.
  6. Plan de precios: Basic B1. Cuando esté listo, puede escalar verticalmente a un plan de tarifa distinto.

Paso 3:

  1. Seleccione la pestaña Base de datos .
  2. Seleccione Crear una base de datos.
  3. En Motor, seleccione SQLAzure.
  4. Seleccione Crear un almacenamiento en caché de Azure para Redis.
  5. En Nombre (en Caché), escriba un nombre para la memoria caché.
  6. En SKU, seleccione Basic (Básico).

Paso 4:

  1. Seleccione la pestaña Implementación .
  2. Habilite la implementación continua.
  3. En Organization, seleccione el alias de GitHub.
  4. En Repositorio, seleccione msdocs-app-service-sqldb-dotnetcore.
  5. En Rama, seleccione starter-no-infra.
  6. Asegúrese de que la autenticación básica está deshabilitada.
  7. Seleccione Revisar + crear.
  8. Una vez completada la validación, seleccione Crear.

Paso 5: 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.
  • Puntos de conexión privados: Acceda a los puntos de conexión para el almacén de claves, el servidor de bases de datos y Redis Cache en la red virtual.
  • Interfaces de red: representa direcciones IP privadas, una para cada uno de los puntos de conexión privados.
  • servidor de Azure SQL Database: accesible solo a través de su punto de conexión privado.
  • Azure SQL Database: se crea una base de datos y un usuario en el servidor.
  • Azure Cache for Redis: accesible solo desde detrás de su punto de conexión privado.
  • Almacén de claves: accesible solo desde detrás de su punto de conexión privado. Se usa para administrar secretos para la aplicación de App Service.
  • Private DNS zones: Habilita la resolución DNS del almacén de claves, el servidor de bases de datos y la caché de Redis en la red virtual.

3. Protección de secretos de conexión

El asistente de creación ya ha generado la variable de conectividad como cadenas de conexión .NET y 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 a un almacén de claves y cambiará la configuración de la aplicación a referencias de Key Vault con la ayuda de Service Connectors.

Sugerencia

Para usar la autenticación sin contraseña, consulte ¿Cómo puedo cambiar la conexión de SQL Database para usar una identidad administrada en su lugar?

Paso 1: Recuperar la cadena de conexión existente

  1. En el menú de la izquierda de la página App Service, seleccione Configuración > Variables de entorno > Cadenas de conexión.
  2. Seleccione AZURE_SQL_CONNECTIONSTRING.
  3. En Agregar/Editar cadena de conexión, en el campo Value, busque la parte de Password= al final de la cadena.
  4. Copie la cadena de contraseña después de Password= para usarla más adelante. Este connection string le permite conectarse a la base de datos SQL protegida detrás de un punto de conexión privado. Sin embargo, los secretos se guardan directamente en la aplicación de App Service, que no es lo mejor. Del mismo modo, la cadena de conexión de caché de Redis en la pestaña de configuración de App contiene un secreto. Cambiarás esto.

Paso 2: Creación de un almacén de claves para la administración segura de secretos

  1. En la barra de búsqueda superior, escriba "key vault", seleccione Marketplace>Key Vault.
  2. En Grupo de recursos, seleccione msdocs-core-sql-XYZ_group.
  3. En Nombre del almacén de claves, escriba un nombre que consta de solo letras y números.
  4. En Región, establézcalo en la misma ubicación que el grupo de recursos.

Paso 3: Protección del almacén de claves con un punto de conexión privado

  1. Seleccione la pestaña Redes.
  2. Anule la selección de Habilitar acceso público.
  3. Seleccione Crear un punto de conexión privado.
  4. En Grupo de recursos, seleccione msdocs-core-sql-XYZ_group.
  5. En el cuadro de diálogo, en Ubicación, seleccione la misma ubicación que la aplicación de App Service.
  6. En Nombre, escriba msdocs-core-sql-XYZVvaultEndpoint.
  7. En Red virtual, seleccione la red virtual en el grupo msdocs-core-sql-XYZ_group .
  8. En Subred, seleccione la subred compatible disponible. El Asistente para aplicaciones web lo creó para su comodidad.
  9. Seleccione Aceptar.
  10. Seleccione Revisar y crear y, luego, Crear. Espere a que finalice la implementación del almacén de claves. Deberías ver "Tu implementación ha sido completada".

Paso 4:

  1. En la barra de búsqueda superior, escriba msdocs-core-sqly, a continuación, el recurso de App Service denominado msdocs-core-sql-XYZ.
  2. En la página App Service, en el menú de la izquierda, seleccione Configuración > Conector de servicio. Ya hay dos conectores, que el asistente para la creación de aplicaciones ha creado automáticamente.
  3. Active la casilla situada junto al Conector de bases de datos SQL y seleccione Editar.
  4. Seleccione la pestaña Autenticación.
  5. En Contraseña, pegue la contraseña que copió anteriormente.
  6. Seleccione Store Secret en Key Vault.
  7. En Key Vault Connection, seleccione Crear nuevo. Se abre un cuadro de diálogo Crear conexión encima del cuadro de diálogo de edición.

Step 5: Establecer la conexión de Key Vault

  1. En el cuadro de diálogo Crear conexión para la conexión de Key Vault, en Key Vault, seleccione el key vault que creó anteriormente.
  2. Seleccione Revisar + crear.
  3. Cuando se complete la validación, seleccione Crear.

Una captura de pantalla que muestra cómo crear un conector de servicio de Key Vault.

Paso 6: Finalización de la configuración del conector de SQL Database

  1. 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.
  2. Seleccione Siguiente: Redes.
  3. Seleccione Configurar reglas de firewall para habilitar el acceso al servicio de destino. El Asistente para la creación de aplicaciones ya ha protegido la base de datos SQL con un punto de conexión privado.
  4. Seleccione Guardar. Espere hasta que aparezca la Actualización correcta notificación.

Step 7: Configure el conector de Redis para usar secretos de Key Vault

  1. En la página Conector de servicio, active la casilla situada junto al conector de Cache for Redis y, a continuación, seleccione Editar.
  2. Seleccione la pestaña Autenticación.
  3. Seleccione Store Secret en Key Vault.
  4. En Key Vault Connection, seleccione el key vault que creó.
  5. Seleccione Siguiente: Redes.
  6. Seleccione Configurar reglas de firewall para habilitar el acceso al servicio de destino.
  7. Seleccione Guardar. Espere hasta que aparezca la Actualización correcta notificación.

Step 8: Compruebe la integración de Key Vault

  1. En el menú izquierdo, vuelva a seleccionar Configuración > Variables de entorno > Cadenas de conexión.
  2. Siguiente a AZURE_SQL_CONNECTIONSTRING, seleccione Mostrar valor. El valor debe ser @Microsoft.KeyVault(...), lo que significa que es una referencia a la bóveda de claves porque el secreto ahora se administra en la bóveda de claves.
  3. Para verificar la cadena de conexión de Redis, seleccione la pestaña Configuración de la aplicación. Junto a AZURE_REDIS_CONNECTIONSTRING, seleccione Mostrar valor. El valor debe ser @Microsoft.KeyVault(...) también.

captura de pantalla que muestra cómo ver el valor de la cadena de conexión .NET en Azure.

En resumen, el proceso para proteger los secretos de conexión implica:

  • Recuperación de los secretos de conexión de las variables de entorno de la aplicación de App Service.
  • Creación de un almacén de claves.
  • Crear una conexión Key Vault con la identidad administrada asignada por el sistema.
  • Actualizar los conectores de servicio para almacenar los secretos en el almacén de claves.

4. Implantación del código de ejemplo

En este paso, configuras el despliegue en GitHub mediante *GitHub Actions*. 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 git push en el repositorio de GitHub inicia la acción de compilación e implementación.

Step 1: Volver al espacio de código de GitHub de su fork de ejemplo, ejecute git pull origin starter-no-infra. Esto extrae el archivo de flujo de trabajo recién confirmado en el codespace.

Captura de pantalla que muestra git pull dentro de un espacio de código de GitHub.

Step 2 (Opción 1: con GitHub Copilot):

  1. Inicie una nueva sesión de chat al seleccionar la vista Chat y, después, seleccionar +.
  2. Pregunte: "@workspace ¿Cómo se conecta la aplicación a la base de datos y a la memoria caché?" Copilot puede dar una explicación sobre la clase MyDatabaseContext y cómo está configurada en Program.cs.
  3. Pregunta: "En modo de producción, quiero que la aplicación use la cadena de conexión llamada AZURE_SQL_CONNECTIONSTRING para la base de datos y la configuración de la aplicación denominada AZURE_REDIS_CONNECTIONSTRING". Copilot puede proporcionar una sugerencia de código similar a la de la Opción 2: sin GitHub Copilot seguida por los pasos, e incluso decirle que realice el cambio en el archivo Program.cs.
  4. Abra Program.cs en el explorador y agregue la sugerencia de código. GitHub Copilot no proporciona la misma respuesta cada vez y no siempre es correcta. Es posible que tenga que formular más preguntas para ajustar su respuesta. Para obtener sugerencias, consulte ¿Qué puedo hacer con GitHub Copilot en mi codespace?.

captura de pantalla A que muestra cómo formular una pregunta en una nueva sesión de chat de GitHub Copilot.

Step 2 (Opción 2: sin GitHub Copilot):

  1. Abra Program.cs en el explorador.
  2. Busque el código comentado (líneas 12-21) y quite los comentarios. Este código se conecta a la base de datos mediante AZURE_SQL_CONNECTIONSTRING y se conecta a Redis Cache mediante la configuración AZURE_REDIS_CONNECTIONSTRING de la aplicación.

Step 3 (Opción 1: con GitHub Copilot):

  1. Abra .github/workflows/starter-no-infra_msdocs-core-sql-XYZ en el explorador. El asistente de creación de "App Service" creó este archivo.
  2. Resalte el paso dotnet publish y seleccione .
  3. Ask Copilot, "Instala dotnet ef y luego crea un paquete de migraciones en la misma carpeta de salida."
  4. Si la sugerencia es aceptable, seleccione Aceptar. GitHub Copilot no proporciona la misma respuesta cada vez y no siempre es correcta. Es posible que tenga que formular más preguntas para ajustar su respuesta. Para obtener sugerencias, consulte ¿Qué puedo hacer con GitHub Copilot en mi codespace?.

Una captura de pantalla que muestra el uso de GitHub Copilot en un archivo de flujo de trabajo de GitHub.

Step 3 (Opción 2: sin GitHub Copilot):

  1. Abra .github/workflows/starter-no-infra_msdocs-core-sql-XYZ en el explorador. El asistente de creación de App Service ha creado este archivo
  2. En el paso dotnet publish, agregue un paso para instalar la herramienta Entity Framework Core con el comando dotnet tool install -g dotnet-ef --version 8.*.
  3. En el nuevo paso, agregue otro paso para generar un lote de migración de base de datos en el paquete de implementación: dotnet ef migrations bundle --runtime linux-x64 -o ${{env.DOTNET_ROOT}}/myapp/migrationsbundle. El paquete de migración es un ejecutable autónomo que se puede ejecutar en el entorno de producción sin necesidad del .NET SDK. El contenedor linux de App Service solo tiene el entorno de ejecución de .NET y no el SDK de .NET.

Paso 4:

  1. Seleccione la extensión Control de código fuente.
  2. En el cuadro de texto, escriba un mensaje de confirmación como Configure Azure database and cache connections. O bien, seleccione y deje que GitHub Copilot genere un mensaje de confirmación automáticamente.
  3. Seleccione Confirmar y, a continuación, confirme con .
  4. Seleccione Sincronización de cambios 1 y confirme con Aceptar.

Una captura de pantalla que muestra cómo se confirman y se envían los cambios a GitHub.

Step 5: Regrese a la página Centro de implementación en el portal de Azure:

  1. Seleccione la pestaña Registros y, a continuación, seleccione Actualizar para ver la nueva ejecución de implementación.
  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.

Paso 6: 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 en GitHub muestre un estado de Éxito. Tardará unos 5 minutos.

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

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

5. Generar esquema de base de datos

Con la instancia de SQL Database protegida por la red virtual, la manera más fácil de ejecutar migraciones de base de datos de .NET es mediante una sesión SSH con el contenedor de Linux en App Service.

Paso 1: De vuelta en la página App Service, en el menú de la izquierda,

  1. Seleccione Herramientas de desarrollo>SSH.
  2. Seleccione Ir. (El inicio tarda unos minutos).

Captura de pantalla que muestra cómo abrir el shell SSH para tu aplicación desde el portal de Azure.

Paso 2: En la sesión SSH:

  1. Ejecute cd /home/site/wwwroot. Aquí están todos los archivos implementados.
  2. Ejecute el paquete de migración que generó el flujo de trabajo de GitHub, con el comando ./migrationsbundle -- --environment Production. Si tiene éxito, App Service se conecta con éxito a la base de datos SQL. Recuerde que --environment Production corresponde a los cambios de código realizados en Program.cs.

En la sesión SSH, solo los cambios en los archivos de /home pueden persistir más allá de los reinicios de la aplicación. Los cambios efectuados fuera de /home no se conservan.

¿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. Seleccione la dirección URL de la aplicación.

Captura de pantalla que muestra cómo iniciar un App Service desde el portal de Azure.

Paso 2: Añadir algunas tareas a la lista. Enhorabuena, está ejecutando una aplicación web en Azure App Service, con conectividad segura a Azure SQL Database.

Una captura de pantalla de la aplicación .NET Core que se ejecuta en App Service.

Sugerencia

La aplicación de ejemplo implementa el patrón cache-aside. Cuando visita una vista de datos por segunda vez o vuelve a cargar la misma página después de realizar cambios en los datos, el tiempo de procesamiento en la página web muestra un tiempo más rápido porque carga los datos desde la memoria caché en lugar de la base de datos.

7. Transmisión de registros de diagnóstico

Azure App Service captura todos los registros de consola para ayudarle a diagnosticar problemas con la aplicación. La aplicación de ejemplo incluye el código de registro en cada uno de sus puntos de conexión para demostrar esta funcionalidad.

Paso 1. En la página App Service:

  1. En el menú de la izquierda, seleccione Supervisión>Registros de App Service.
  2. En Registro de aplicaciones, seleccione Sistema de archivos.
  3. En el menú superior, elija Guardar.

captura de pantalla Captura de pantalla que muestra cómo habilitar los registros nativos en App Service en Azure Portal

Paso 2: En el menú de la izquierda, seleccione Flujo de registro. Puedes ver los registros de tu aplicación, incluidos los registros de plataforma y los registros de dentro del contenedor.

Captura de pantalla que muestra cómo ver el flujo de registros en el portal de Azure.

8. Limpieza de recursos

Cuando haya terminado, puede eliminar todos los recursos de la suscripción de Azure eliminando el grupo de recursos.

Step 1: En la barra de búsqueda de la parte superior del portal de Azure:

  1. Escriba el nombre del grupo de recursos.
  2. Seleccione el grupo de recursos.

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 el portal de Azure.

Paso 3:

  1. Escriba el nombre del grupo de recursos para confirmar la eliminación.
  2. Seleccione Eliminar.

Una captura de pantalla del cuadro de diálogo de confirmación para eliminar un grupo de recursos en el portal de Azure.

2. Creación de recursos 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 on Linux. Los pasos que se usan en este tutorial crean un conjunto de recursos seguros de forma predeterminada que incluyen App Service, Azure SQL Database y Azure Cache for Redis.

El contenedor de desarrollo ya tiene la CLI para desarrolladores de Azure (AZD).

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

    azd init --template dotnet-app-service-sqldb-infra
    
  2. 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.
  3. Inicie sesión en Azure ejecutando el comando azd auth login y siga las instrucciones.

    azd auth login
    
  4. Cree los recursos Azure necesarios e implemente el código de la aplicación con el comando azd up. Siga el mensaje 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 generan una arquitectura segura de forma predeterminada con los siguientes recursos 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 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.
    • Puntos de conexión privados: Acceda a los puntos de conexión para el almacén de claves, el servidor de bases de datos y Redis Cache en la red virtual.
    • Interfaces de red: representa direcciones IP privadas, una para cada uno de los puntos de conexión privados.
    • servidor de Azure SQL Database: accesible solo a través de su punto de conexión privado.
    • Azure SQL Database: se crea una base de datos y un usuario en el servidor.
    • Azure Cache for Redis: accesible solo desde detrás de su punto de conexión privado.
    • Almacén de claves: accesible solo desde detrás de su punto de conexión privado. Se usa para administrar secretos para la aplicación de App Service.
    • Private DNS zones: Habilita la resolución DNS del almacén de claves, el servidor de bases de datos y la caché de Redis en la red virtual.

    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

Sugerencia

La cadena de conexión predeterminada de la base de datos SQL usa la autenticación SQL. Para obtener una autenticación sin contraseña más segura, consulte ¿Cómo puedo cambiar la conexión de SQL Database para usar una identidad administrada en su lugar?

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 los valores AZURE_SQL_CONNECTIONSTRING y AZURE_REDIS_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_SQL_CONNECTIONSTRING
         - AZURE_REDIS_CONNECTIONSTRING
         - AZURE_KEYVAULT_RESOURCEENDPOINT
         - AZURE_KEYVAULT_SCOPE
     

    AZURE_SQL_CONNECTIONSTRING contiene la cadena de conexión a la Base de Datos de SQL en Azure y AZURE_REDIS_CONNECTIONSTRING contiene la cadena de conexión a la caché de Azure Redis. 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.

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

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

  1. En el GitHub codespace, inicie una nueva sesión de chat seleccionando la vista Chat y, a continuación, seleccionando +.

  2. Pregunte: "@workspace ¿Cómo se conecta la aplicación a la base de datos y a la memoria caché?" Copilot puede dar una explicación sobre la clase MyDatabaseContext y cómo está configurada en Program.cs.

  3. Pregunte: "En modo de producción, quiero que la aplicación use la cadena de conexión llamada AZURE_SQL_CONNECTIONSTRING para la base de datos y la configuración de la aplicación denominada AZURE_REDIS_CONNECTIONSTRING*". Copilot puede proporcionar una sugerencia de código similar a la del paso Opción 2: sin GitHub Copilot en los pasos que siguen e incluso puede indicarle que realice el cambio en el archivo Program.cs.

  4. Abra Program.cs en el explorador y agregue la sugerencia de código.

    GitHub Copilot no proporciona la misma respuesta cada vez y no siempre es correcta. Es posible que tenga que formular más preguntas para ajustar su respuesta. Para obtener sugerencias, consulte ¿Qué puedo hacer con GitHub Copilot en mi codespace?.

Antes de implementar estos cambios, debe generar una agrupación de migraciones.

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

5. Generar esquema de base de datos

Con la instancia de SQL Database protegida por la red virtual, la manera más fácil de ejecutar migraciones de base de datos es en una sesión SSH con el contenedor de App Service. Sin embargo, los contenedores de Linux de App Service no tienen el SDK de .NET, por lo que la manera más fácil de ejecutar migraciones de base de datos es cargar un paquete de migraciones autocontenida.

  1. Genere una agrupación de migraciones para el proyecto con el siguiente comando:

    dotnet ef migrations bundle --runtime linux-x64 -o migrationsbundle
    

    Sugerencia

    La aplicación de ejemplo (vea DotNetCoreSqlDb.csproj) está configurada para incluir este archivo migrationsbundle. Durante la fase azd package, se agregará migrationsbundle al paquete de implementación.

  2. Implemente todos los cambios con azd up.

    azd up
    
  3. 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: <URL>
     
  4. En la sesión de SSH, ejecute los siguientes comandos:

    cd /home/site/wwwroot
    ./migrationsbundle -- --environment Production
    

    Si se realiza correctamente, App Service se conecta a la base de datos. Recuerde que --environment Production corresponde a los cambios de código realizados en Program.cs.

    Nota:

    Cuando la aplicación se reinicie, solo persisten los cambios realizados en los archivos ubicados en /home. Los cambios efectuados fuera de /home no se conservan.

¿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: <URL>
     
  2. Agregue algunas tareas a la lista.

    Una captura de pantalla de la aplicación web de ASP.NET Core con SQL Database que se ejecuta en Azure mostrando tareas.

    Enhorabuena, está ejecutando una aplicación web en Azure App Service, con conectividad segura a Azure SQL Database.

¿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 estándar para demostrar esta funcionalidad, como se muestra en el siguiente fragmento de código:

public async Task<IActionResult> Index()
{
    var todoItems = await _cache.GetAsync(_TodoItemsCacheKey);
    if (todoItems != null)
    {
        _logger.LogInformation("Data from cache.");
        var todoList = JsonConvert.DeserializeObject<List<Todo>>(Encoding.UTF8.GetString(todoItems));
        return View(todoList);
    }
    else
    {
        _logger.LogInformation("Data from database.");
        var todoList = await _context.Todo.ToListAsync();
        var serializedTodoList = JsonConvert.SerializeObject(todoList);
        await _cache.SetAsync(_TodoItemsCacheKey, Encoding.UTF8.GetBytes(serializedTodoList));
        return View(todoList);
    }
}

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 se ve así en la salida de AZD:

Stream App Service logs at: <URL>

Obtenga más información sobre el registro en aplicaciones .NET en la serie sobre Habilitar Azure Monitor OpenTelemetry para aplicaciones .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

La vista de implementación del portal para Azure SQL Database 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 de Azure SQL Database para que sea Conflict, con el siguiente mensaje en Detalles de la operación:

Location '<region>' is not accepting creation of new Windows Azure SQL Database servers at this time.

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.

En el portal de Azure, la interfaz de usuario del flujo de registro de la aplicación web muestra errores de red.

Puede ver este error:

Unable to open a connection to your app. This may be due to any network security groups or IP restriction rules that you have placed on your app. To use log streaming, please make sure you are able to access your app directly from your current network.

Este suele ser un error transitorio cuando se inicia la aplicación por primera vez. Espere unos minutos y compruebe otra vez.

La sesión SSH en el explorador muestra SSH CONN CLOSED

El contenedor de Linux tarda unos minutos en iniciarse. Espere unos minutos y compruebe otra vez.

En la página de flujo de registro del portal, se muestra Connected! pero sin registros

Después de configurar los registros de diagnóstico, se reinicia la aplicación. Es posible que tenga que actualizar la página para que los cambios surtan efecto en el explorador.

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 Básico y puede escalar o reducirse verticalmente. Consulte Precios de App Service.
  • La instancia de Azure SQL Database se crea en el nivel sin servidor de uso general en el hardware de la serie Estándar con el número mínimo de núcleos. Hay un pequeño costo y se puede distribuir a otras regiones. Puede minimizar el costo aún más reduciendo su tamaño máximo, o puede escalar verticalmente ajustando el nivel de servicio, el nivel de proceso, la configuración de hardware, el número de núcleos, el tamaño de la base de datos y la redundancia de zona. Consulte precios de Azure SQL Database.
  • El Azure Cache for Redis se crea en la capa Basic 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. Consulte los precios de Azure Virtual Network.
  • La zona DNS privada conlleva un pequeño cargo. Consulte precios de Azure DNS.

¿Cómo puedo conectarme al servidor de Azure SQL Database protegido detrás de la red virtual con otras herramientas?

  • Para tener un acceso básico desde una herramienta de línea de comandos, puede ejecutar sqlcmd desde el terminal de SSH de la aplicación. El contenedor de la aplicación no incluye sqlcmd, por lo que debe instalarlo manualmente. Recuerde que el cliente instalado no persiste en los reinicios de la aplicación.
  • Para conectarse desde un cliente de SQL Server Management Studio o desde Visual Studio, la máquina debe estar dentro de la red virtual. Por ejemplo, podría ser una máquina virtual de Azure conectada a una de las subredes o a una máquina de una red local que tenga una VPN VPN de sitio a sitio con la red virtual Azure.

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

Tome 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, realizas las actualizaciones deseadas y las subes a GitHub. Por ejemplo:

git add .
git commit -m "<some-message>"
git push origin main

¿Cómo se depuran los errores durante la implementación de GitHub Actions?

Si se produce un error en un paso del archivo de flujo de trabajo de GitHub generado automáticamente, intente modificar el comando que falló para generar una salida más detallada. Por ejemplo, puede obtener más resultados de cualquiera de los comandos dotnet agregando la opción -v. Confirme e inserte los cambios para desencadenar otra implementación en App Service.

No tengo permisos para crear una identidad asignada por el usuario

Consulte la implementación de GitHub Actions desde el Centro de implementación.

¿Cómo puedo cambiar la conexión de SQL Database para usar una identidad administrada en su lugar?

Service Connector administra el connection string predeterminado en la base de datos SQL, con el nombre defaultConnector y usa la autenticación SQL. Para reemplazarlo por una conexión que use una identidad administrada, ejecute los siguientes comandos en Cloud Shell después de reemplazar los marcadores de posición:

az extension add --name serviceconnector-passwordless --upgrade
az sql server update --enable-public-network true
az webapp connection delete sql --connection defaultConnector --resource-group <group-name> --name <app-name>
az webapp connection create sql --connection defaultConnector --resource-group <group-name> --name <app-name> --target-resource-group <group-name> --server <database-server-name> --database <database-name> --client-type dotnet --system-identity --config-connstr true
az sql server update --enable-public-network false

De forma predeterminada, el comando az webapp connection create sql --client-type dotnet --system-identity --config-connstr hace lo siguiente:

  • Configura tu usuario como el administrador de Microsoft Entra ID del servidor SQL Database.
  • Crea una identidad administrada asignada por el sistema y le concede acceso a la base de datos.
  • Genera un connection string sin contraseña denominado AZURE_SQL_CONNECTIONGSTRING, que la aplicación ya usa al final del tutorial.

La aplicación ahora debe tener conectividad con la instancia de SQL Database. Para obtener más información, consulte Tutorial: Conexión a bases de datos de Azure desde App Service sin secretos mediante una identidad administrada.

Sugerencia

¿No quiere habilitar la conexión de red pública? Puede omitir az sql server update --enable-public-network true ejecutando los comandos desde un Azure Cloud Shell integrado con la red virtual si tiene la asignación de rol Owner en la suscripción.

Para conceder a la identidad el acceso necesario a la base de datos protegida por la red virtual, az webapp connection create sql necesita conectividad directa mediante la autenticación de Entra ID con el servidor de bases de datos. De forma predeterminada, el Azure cloud Shell no tiene este acceso a la base de datos protegida por red.

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

Es posible que haya observado 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 ti cuando hablas 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 tengan 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 indicar dónde realizarlos, pero no tiene permitido efectuar los cambios. Es necesario agregar los cambios sugeridos y probarlos.

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

  • Quiero que este código solo se ejecute en modo de producción.
  • Quiero que este código solo se ejecute en Azure App Service y no localmente.
  • El parámetro --output-path parece no ser compatible.

Pase al tutorial siguiente para aprender a proteger la aplicación con un dominio personalizado y un certificado.

O bien, eche un vistazo a otros recursos: