Compartir vía


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 basada en datos en Azure App Service y a conectarse a 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 con gran capacidad de escalado y aplicación automática de revisiones que puede implementar fácilmente aplicaciones en Windows o Linux. Aunque, en este tutorial, se usa una aplicación de 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.
  • Asegure los secretos de conexión utilizando una identidad administrada y referencias de Key Vault.
  • Implemente una aplicación de ejemplo ASP.NET Core 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 mediante la carga de una agrupación de migraciones.
  • Transmitir registros de diagnóstico desde Azure.
  • Administrar 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 sobre el desarrollo de ASP.NET Core.
  • (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 sobre el desarrollo de ASP.NET Core.
  • (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:

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

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-app-service-sqldb-dotnetcore/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.
  2. 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 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.

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, 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 manera 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 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. Es donde se selecciona la versión de .NET 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. Escriba "base de datos de aplicación web" en la barra de búsqueda de la parte superior de Azure Portal.
  2. Seleccione el elemento denominado Aplicación web + base de datos en el encabezado Marketplace. También puede ir directamente al asistente de creación.

Captura de pantalla que muestra cómo usar el cuadro de búsqueda de la barra de herramientas superior para encontrar el asistente de creación Aplicación web + base de datos

Paso 2: In the páginaCrear aplicación web + base de datos, rellene el formulario de la siguiente manera.

  1. Grupo de recursos: seleccione Crear nuevo y use el nombre msdocs-core-sql-tutorial.
  2. Región: cualquier región de Azure cercana a usted.
  3. Nombre: msdocs-core-sql-XYZ, donde XYZ son tres caracteres aleatorios. Este nombre debe ser único en Azure.
  4. Pila en tiempo de ejecución: .NET 8 (LTS).
  5. Motor: SQLAzure. Azure SQL Database es un motor de base de datos de plataforma como servicio (PaaS) totalmente administrado que siempre se ejecuta en la versión estable más reciente de SQL Server.
  6. ¿Agregar Azure Cache for Redis?: .
  7. Plan de hospedaje: Básico. Cuando esté listo, puede escalar verticalmente a un plan de tarifa de producción.
  8. Seleccione Revisar + crear.
  9. Una vez completada la validación, seleccione Crear.

Captura de pantalla que muestra cómo configurar una aplicación y base de datos nuevas en el asistente Crear aplicación web + base de datos

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.
  • Puntos de conexión privados: acceda a puntos de conexión para 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 desde detrás del punto de conexión privado.
  • Azure SQL Database: una base de datos y un usuario que se crean de manera automática 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.
  • Zonas DNS privado: habilitar la resolución DNS del servidor de base de datos y la caché de Redis en la red virtual.

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

3. Protección de secretos de conexión

El asistente para la creación generó la cadena de conectividad para usted ya como cadenas de conexión de .NET y la 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. En la página App Service:

  1. En el menú izquierdo, seleccione Configuración Variables > de entorno > Cadenas de conexión.
  2. Seleccione AZURE_SQL_CONNECTIONSTRING.
  3. En Agregar o editar cadena de conexión, en el campo Valor, busque la parte Password= al final de la cadena.
  4. Copie la cadena de contraseña después de Password= para usarla más adelante. Esta cadena de conexión te permite conectarte a la base de datos SQL protegida tras un punto final privado. La contraseña se guarda directamente en la aplicación App Service, lo que no es lo mejor. Del mismo modo, la cadena de conexión de Redis Cache en la pestaña Configuración de la aplicación contiene un secreto. Cambiará esto.

Captura de pantalla que muestra cómo ver el valor de una configuración de aplicación.

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 "almacén de claves" y, a continuación, seleccione Marketplace>Key Vault.
  2. En Grupode recursos, seleccione msdocs-core-sql-tutorial.
  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 ubicación de ejemplo como grupo de recursos.

Captura de pantalla que muestra cómo crear un almacén de claves.

Paso 3:

  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 Grupode recursos, seleccione msdocs-core-sql-tutorial.
  5. En Nombre del almacén de claves, escriba un nombre que consta de solo letras y números.
  6. En Región, establézcalo en la ubicación de ejemplo como grupo de recursos.
  7. En el cuadro de diálogo, en Ubicación, seleccione la misma ubicación que la aplicación de App Service.
  8. En Grupode recursos, seleccione msdocs-core-sql-tutorial.
  9. En Nombre, escriba msdocs-core-sql-XYZVvaultEndpoint.
  10. En Red virtual, seleccione msdocs-core-sql-XYZVnet.
  11. En Subred, msdocs-core-sql-XYZSubnet.
  12. Seleccione Aceptar.
  13. 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".

Captura de pantalla que muestra cómo proteger un almacén de claves con un punto de conexión privado.

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 Almacenar secreto en Key Vault.
  7. 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.

Una captura de pantalla que muestra cómo editar el conector de servicio de base de datos SQL con una conexión de bóveda de claves.

Paso 5: En el cuadro de diálogo Crear de conexión para la conexión de Key Vault:

  1. En Key Vault, seleccione el almacén de claves que creó anteriormente.
  2. Seleccione Revisar + crear. Debería ver que Identidad administrada asignada por el sistema está establecida en Seleccionados.
  3. Cuando se complete la validación, seleccione Crear.

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

Paso 6: Vuelve al cuadro de diálogo de edición de defaultConnector.

  1. 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.

Captura de pantalla que muestra la conexión del almacén de claves seleccionada en el conector del servicio SQL Database.

Paso 7: En la página Conectores de servicio:

  1. Active la casilla situada junto al conector cache for Redis y, a continuación, seleccione Editar.
  2. Seleccione la pestaña Autenticación.
  3. Seleccione Almacenar secreto en Key Vault.
  4. En Conexión de Key Vault, seleccione el almacén de claves que creó.
  5. Seleccione Siguiente: Redes.
  6. 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.
  7. Seleccione Guardar. Espere hasta que aparezca la Actualización correcta notificación.

Captura de pantalla que muestra cómo editar un conector de servicio con una conexión de almacén de claves.

Paso 8: para comprobar los cambios:

  1. En el menú de la izquierda, vuelva a seleccionar 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 un referencia del almacén de claves porque el secreto ahora se administra en el almacén de claves.
  3. Para comprobar la cadena de conexión de Redis, seleccione la pestaña Configuración de la aplicación. Siguiente a AZURE_REDIS_CONNECTIONSTRING, seleccione Mostrar valor. The value should be @Microsoft.KeyVault(...) too.

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

4. 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.

Paso 1: 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-app-service-sqldb-dotnetcore.
  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.

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 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 darle 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 denominada AZURE_SQL_CONNECTIONSTRING para la base de datos y la configuración de la aplicación denominada AZURE_REDIS_CONNECTIONSTRING*". Copilot puede proporcionarle una sugerencia de código similar a la de los pasos a continuación de la Opción 2: sin GitHub Copilot, e incluso 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 esta 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 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 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.

Captura de pantalla que muestra un espacio de código de GitHub y el archivo Program.cs abierto.

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

  1. Abra .github/workflows/starter-no-infra_msdocs-core-sql-XYZ en el explorador. El asistente para la creación de App Service creó este archivo.
  2. Resalte el paso dotnet publish y seleccione .
  3. Pregunte a Copilot: "Instale dotnet ef y cree una agrupación 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 esta 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 espacio de código?.

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

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

  1. Abra .github/workflows/starter-no-infra_msdocs-core-sql-XYZ en el explorador. El asistente para la creación de App Service creó 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 archivo ejecutable independiente que se puede ejecutar en el entorno de producción sin necesidad del SDK de .NET. El contenedor de App Service de Linux solo tiene el entorno de ejecución de .NET y no el SDK de .NET.

Captura de pantalla en la que se muestran los pasos agregados al archivo de flujo de trabajo de GitHub para el lote de migración de base de datos.

Paso 6:

  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 database and cache connections. O bien, seleccione y deje que GitHub Copilot genere un mensaje de confirmación de manera automática.
  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 7: De vuelta en la página Centro de implementación en Azure portal:

  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.

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

Paso 8: 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 Correcto. Tardará unos 5 minutos.

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

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 dotnet es mediante una sesión SSH con el contenedor de App Service.

Paso 1: Vuelva a la página de App Service, en el menú de la izquierda, seleccione Herramientas de desarrollo>SSH y, a continuación, 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 cd /home/site/wwwroot. Aquí están todos los archivos implementados.
  2. Ejecute la agrupación de migraciones que generó el flujo de trabajo de GitHub, con el comando ./migrationsbundle -- --environment Production. Si se realiza correctamente, App Service se conecta correctamente a SQL Database. Recuerde que --environment Production corresponde a los cambios de código realizados en Program.cs.

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

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 una App Service desde Azure Portal

Paso 2: Añadir algunas tareas a la lista. Ya está ejecutando una aplicación de ASP.NET Core segura orientada a datos en Azure App Service.

Captura de pantalla de la aplicación de .NET Core ejecutándose 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 de la página web muestra un tiempo mucho más rápido porque carga los datos desde la memoria caché en lugar desde la base de datos.

7. Transmisión de registros de diagnóstico

Azure App Service captura todos los mensajes registrados en la consola para ayudarle a diagnosticar problemas de la aplicación. La aplicación de ejemplo genera mensajes de registro de consola en cada uno de sus puntos de conexión para demostrar esta capacidad.

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 y, después, Guardar.

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. 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

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.
  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. Escriba el nombre del grupo de recursos para confirmar la eliminación.
  2. Seleccione Eliminar.

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, Azure SQL Database y Azure Cache for Redis.

El contenedor de desarrollo ya tiene Azure Developer CLI (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 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 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 puntos de conexión para 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 desde detrás del punto de conexión privado.
    • Azure SQL Database: una base de datos y un usuario que se crean de manera automática 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.
    • Zonas DNS privado: habilitar la resolución DNS del servidor de base 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 de SQL Database predeterminada usa la autenticación de 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 SQL Database en Azure y AZURE_REDIS_CONNECTIONSTRING contiene la cadena de conexión a Redis Cache de 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.

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

4. 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; para ello, seleccione la vista Chat y, a continuación, seleccione +.

  2. Pregunte: "@workspace ¿Cómo se conecta la aplicación a la base de datos y a la memoria caché?". Copilot puede darle 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 denominada AZURE_SQL_CONNECTIONSTRING para la base de datos y la configuración de la aplicación denominada AZURE_REDIS_CONNECTIONSTRING*". Copilot puede proporcionarle una sugerencia de código similar a la de los pasos a continuación de la Opción 2: sin GitHub Copilot, e incluso 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 esta 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 espacio de código?.

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 una agrupación 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 (consulte 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 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
     
  4. En el terminal 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.

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

  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 ASP.NET Core con SQL Database 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 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 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 más información sobre el registro de aplicaciones .NET en la serie, consulte Habilitación de OpenTelemetry de Azure Monitor 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

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 Azure Portal, 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.

En la sesión SSH en el explorador, se 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 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 de Azure SQL Database protegido tras 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 una máquina de una red local que tenga una conexión VPN de sitio a sitio a la red virtual de Azure.

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

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, las actualizaciones deseadas se insertan en 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 Acciones de GitHub?

Si se produce un error en un paso en el archivo de flujo de trabajo de GitHub generado automáticamente, intente modificar el comando con errores 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 Configuración de la implementación de Acciones de GitHub desde el centro de implementación.

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

El conector de servicio administra la cadena de conexión predeterminada a SQL Database, 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:

  • Establece el usuario como administrador de Microsoft Entra ID del servidor de SQL Database.
  • Crea una identidad administrada asignada por el sistema y le concede acceso a la base de datos.
  • Genera una cadena de conexión sin contraseña denominada 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 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 mediante la ejecución de los comandos desde una instancia de Azure Cloud Shell integrada con la red virtual si tiene la asignación de roles Propietario 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 con la autenticación de Entra ID al servidor de bases de datos. De forma predeterminada, 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 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:

  • 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:

Configure ASP.NET Core app (Configuración de una aplicación de ASP.NET Core)