Back to Blog

Publicar Aplicaciones Web en App Service con Terraform

Complete tutorial about azurerm_app_service in Terraform. Learn planes de App Service, web apps, deployment slots, variables de entorno.

Publicar Aplicaciones Web en App Service con Terraform

Publicar Aplicaciones Web en App Service con Terraform

Introducción

Azure App Service es una plataforma como servicio (PaaS) que permite crear y alojar aplicaciones web de forma escalable y eficiente. Con App Service, puedes desarrollar aplicaciones en varios lenguajes de programación, como .NET, PHP, Node.js y Python, y beneficiarte de características como escalabilidad automática, autenticación integrada y gestión simplificada. Utilizar Infrastructure as Code (IaC) con Terraform para gestionar tus aplicaciones en Azure es crucial, ya que permite definir y versionar la infraestructura mediante código, facilitando la colaboración y reduciendo errores.

Los principales casos de uso de Azure App Service incluyen el desarrollo de aplicaciones web, APIs y aplicaciones móviles. Además, la funcionalidad de deployment slots permite probar nuevas versiones de una aplicación sin interrumpir el servicio.

Prerrequisitos

Antes de empezar, asegúrate de tener lo siguiente:

  1. Terraform CLI instalado en tu máquina. Puedes descargarlo desde Terraform.
  2. Una suscripción de Azure activa. Si no tienes una, puedes crear una cuenta gratuita.
  3. Azure CLI instalado y configurado. Puedes seguir esta guía para instalarlo.
  4. Un Service Principal creado en Azure para proporcionar a Terraform la autenticación necesaria. Puedes crear uno con el siguiente comando:
    az ad sp create-for-rbac --name "myTerraformSP" --role Contributor --scopes /subscriptions/{subscription-id}
    

Conceptos Fundamentales

Al trabajar con Terraform y Azure App Service, es importante familiarizarse con algunos términos clave:

  • App Service Plan: Es un conjunto de recursos que define el entorno de ejecución para tus aplicaciones. Puedes elegir entre diferentes niveles (Free, Shared, Basic, Standard, Premium) según tus necesidades.
  • Web App: Es una aplicación que se despliega en Azure App Service.
  • Deployment Slot: Permite crear versiones alternativas de tu aplicación (por ejemplo, staging y producción) para facilitar las pruebas antes de llevar cambios a producción.
  • Variables de Entorno: Son pares clave-valor que puedes utilizar para configurar tu aplicación sin codificarlas directamente en el código fuente.

Sintaxis del Recurso

El recurso principal que utilizaremos es azurerm_app_service. A continuación se muestra la sintaxis básica y una tabla con sus argumentos:

resource "azurerm_app_service" "example" {
  name                = "example-app-service"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  app_service_plan_id = azurerm_app_service_plan.example.id

  site_config {
    always_on = true
    # Otras configuraciones...
  }

  app_settings = {
    "SOME_KEY" = "some_value"
  }
}
Argumento Descripción
name Nombre único para la aplicación web.
location Ubicación en la que se desplegará el servicio.
resource_group_name Nombre del grupo de recursos donde se creará el servicio.
app_service_plan_id ID del plan de servicio asociado.
site_config Configuraciones específicas del sitio, como always_on y otros ajustes.
app_settings Variables de entorno para la aplicación.

Ejemplos Prácticos

A continuación se presentan varios ejemplos prácticos que muestran cómo crear y gestionar aplicaciones web en Azure App Service con Terraform.

Ejemplo 1: Crear un Grupo de Recursos

resource "azurerm_resource_group" "example" {
  name     = "example-rg"
  location = "East US"
}

Ejemplo 2: Crear un Plan de Servicio de App

resource "azurerm_app_service_plan" "example" {
  name                = "example-app-service-plan"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  sku {
    tier     = "Standard"
    size     = "S1"
  }
}

Ejemplo 3: Crear una Aplicación Web

resource "azurerm_app_service" "example" {
  name                = "example-web-app"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  app_service_plan_id = azurerm_app_service_plan.example.id

  app_settings = {
    "WEBSITE_RUN_FROM_PACKAGE" = "1"
  }
}

Ejemplo 4: Crear un Deployment Slot

resource "azurerm_app_service_slot" "staging" {
  name                = "staging"
  app_service_name    = azurerm_app_service.example.name
  resource_group_name = azurerm_resource_group.example.name

  app_settings = {
    "SOME_KEY" = "staging_value"
  }
}

Ejemplo 5: Desplegar desde GitHub

resource "azurerm_app_service_source_control" "example" {
  app_service_id = azurerm_app_service.example.id
  repo_url       = "https://github.com/user/repo"
  branch         = "main"
  is_manual_integration = false
}

Ejemplo 6: Actualizar Variables de Entorno

resource "azurerm_app_service" "example" {
  name                = "example-web-app"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  app_service_plan_id = azurerm_app_service_plan.example.id

  app_settings = {
    "SOME_KEY" = "updated_value"
  }
}

Ejemplo 7: Swap Deployment Slots

resource "azurerm_app_service_slot" "production" {
  name                = "production"
  app_service_name    = azurerm_app_service.example.name
  resource_group_name = azurerm_resource_group.example.name
}

resource "azurerm_app_service_slot_swap" "example" {
  app_service_id = azurerm_app_service.example.id
  source_slot_name = azurerm_app_service_slot.staging.name
  destination_slot_name = azurerm_app_service_slot.production.name
}

Ejemplo 8: Configurar un Backup Automático

resource "azurerm_app_service_backup" "example" {
  name                = "example-backup"
  app_service_id      = azurerm_app_service.example.id
  backup_schedule {
    frequency      = "Day"
    interval       = 1
    retention      = 30
  }
}

Casos de Uso del Mundo Real

Escenario 1: Despliegue de Aplicaciones Web

Utiliza el siguiente script para desplegar una aplicación web simple con un plan de servicio estándar y un slot de staging para pruebas.

resource "azurerm_resource_group" "example" {
  name     = "example-rg"
  location = "East US"
}

resource "azurerm_app_service_plan" "example" {
  name                = "example-app-service-plan"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  sku {
    tier = "Standard"
    size = "S1"
  }
}

resource "azurerm_app_service" "example" {
  name                = "example-web-app"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  app_service_plan_id = azurerm_app_service_plan.example.id
}

resource "azurerm_app_service_slot" "staging" {
  name                = "staging"
  app_service_name    = azurerm_app_service.example.name
  resource_group_name = azurerm_resource_group.example.name
}

Escenario 2: Implementación Continua con Deployment Slots

En este escenario, puedes configurar un flujo de trabajo de CI/CD donde tu aplicación se despliega en un slot de staging y se intercambia con producción una vez que las pruebas se completan exitosamente.

resource "azurerm_app_service_source_control" "example" {
  app_service_id = azurerm_app_service.example.id
  repo_url       = "https://github.com/user/repo"
  branch         = "main"
}

Escenario 3: Backup y Recuperación

Configura backups automáticos para garantizar que tus datos estén seguros y que puedas restaurar tu aplicación rápidamente en caso de fallos.

resource "azurerm_app_service_backup" "example" {
  name                = "example-backup"
  app_service_id      = azurerm_app_service.example.id
  backup_schedule {
    frequency      = "Day"
    interval       = 1
    retention      = 30
  }
}

Mejores Prácticas

  1. Gestión del Estado: Utiliza un backend remoto como Azure Storage para almacenar el estado de Terraform.
  2. Seguridad: Evita almacenar secretos en el código. Utiliza Azure Key Vault para gestionar credenciales.
  3. Módulos: Organiza tu código Terraform en módulos reutilizables para mejorar la mantenibilidad.
  4. Convenciones de Nombres: Establece convenciones claras de nombres para tus recursos, lo que facilita la identificación y gestión.
  5. Versionado de Código: Utiliza un sistema de control de versiones como Git para rastrear cambios en tu infraestructura.

Errores Comunes

  1. Error de Autenticación:

    • Mensaje: "Error: Error authenticating"
    • Causa: Credenciales incorrectas.
    • Solución: Asegúrate de que el Service Principal esté configurado correctamente.
  2. Error en el Grupo de Recursos:

    • Mensaje: "Error: Resource group not found"
    • Causa: El grupo de recursos no existe.
    • Solución: Verifica que el grupo de recursos se haya creado correctamente.
  3. Error en el Nombre de la Aplicación:

    • Mensaje: "Error: The name is already in use"
    • Causa: El nombre de la aplicación ya está en uso.
    • Solución: Cambia el nombre de la aplicación a uno único.
  4. Error de Configuración de Slots:

    • Mensaje: "Error: Slot name already exists"
    • Causa: El slot ya ha sido creado.
    • Solución: Asegúrate de que el nombre del slot sea único.

Recursos Relacionados

Recurso Enlace
Documentación de Terraform Terraform
Proveedor de Azure en Terraform azurerm Provider
Azure App Service Docs Azure App Service
Ejemplos de Terraform para Azure App Service Ejemplos de Terraform

Script de Infraestructura Completo

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = "example-rg"
  location = "East US"
}

resource "azurerm_app_service_plan" "example" {
  name                = "example-app-service-plan"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  sku {
    tier = "Standard"
    size = "S1"
  }
}

resource "azurerm_app_service" "example" {
  name                = "example-web-app"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  app_service_plan_id = azurerm_app_service_plan.example.id
}

resource "azurerm_app_service_slot" "staging" {
  name                = "staging"
  app_service_name    = azurerm_app_service.example.name
  resource_group_name = azurerm_resource_group.example.name
  app_settings = {
    "SOME_KEY" = "staging_value"
  }
}

Conclusión

Publicar aplicaciones web en Azure App Service utilizando Terraform es un proceso eficiente y eficaz. Al aprovechar la gestión de infraestructura como código, puedes automatizar el despliegue y la configuración de tus aplicaciones, mejorando la consistencia y reduciendo los errores. Te recomendamos seguir explorando Terraform y Azure para aprovechar al máximo las capacidades de la nube.

Referencias

¡Comienza a implementar tus aplicaciones web en Azure hoy mismo! 🚀