¿Existe un método de redireccionamiento web o un ejemplo que use una puerta de enlace de aplicaciones usando terraform?

5 minutos de lectura

Estoy tratando de crear un servicio para la redirección web a través de la puerta de enlace de aplicaciones usando terraform.

Me gustaria autenticar el application gateway sl con el certificado gratuito (azurm_app_service_managed_certified) del azure app service plan, hay algun ejemplo?

Actualmente, pensando en la composición de la siguiente manera. Sin embargo, azurem_application_gateway exige la certificación SSL, por lo que no sé cómo funciona.

Por favor, hágamelo saber si hay una manera de resolver el problema de esa manera o de otra manera.

El problema con el siguiente script es que si desea usar https en la puerta de enlace de la aplicación, debe usar un certificado, y quiero crear y usar un certificado gratuito en el plan de servicio.

resource "azurerm_application_gateway" "app_gateway" {
  provider = azurerm.generic
    
  name                = "${local.service_name}-app-gateway"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  enable_http2        = true
    
  sku {
     name     = "Standard_Small"
     tier     = "Standard" # v1
     capacity = 2
  }
    
  gateway_ip_configuration {
     name      = "${local.service_name}-ip-config"
     subnet_id = azurerm_subnet.front_subnet.id
  }
    
  frontend_port {
     name = local.frontend_port_name
     port = 80
  }
    
  frontend_port {
     name = local.backend_port_name
     port = 443
  }
    
  frontend_ip_configuration {
     name                 = local.frontend_ip_configuration_name
     public_ip_address_id = azurerm_public_ip.pub_ip.id
  }
    
  backend_address_pool {
     name  = "${azurerm_virtual_network.vn.name}-beap"
     fqdns = [local.host_name]
  }
    
  backend_http_settings {
     name                  = local.http_setting_name
     cookie_based_affinity = "Disabled"
     port                  = 443
     protocol              = "Https"
     request_timeout       = 60
     host_name             = local.host_name
  }
    
  http_listener {
     name                           = "${local.listener_name}-http"
     frontend_ip_configuration_name = local.frontend_ip_configuration_name
     frontend_port_name             = local.frontend_port_name
     protocol                       = "Http"
  }
    
  http_listener {
     name                           = "${local.listener_name}-https"
     frontend_ip_configuration_name = local.frontend_ip_configuration_name
     frontend_port_name             = local.backend_port_name
     protocol                       = "Https"
  }
    
  request_routing_rule {
     name                       = "${local.request_routing_rule_name}-http"
     rule_type                  = "Basic"
     http_listener_name         = "${local.listener_name}-http"
     backend_address_pool_name  = local.backend_address_pool_name
     backend_http_settings_name = local.http_setting_name
  }
    
  redirect_configuration {
     name                 = local.redirect_configuration_name
     redirect_type        = "Permanent"
     include_path         = false
     include_query_string = false
     target_listener_name = "${local.listener_name}-https"
  }
    
  request_routing_rule {
     name                        = "${local.request_routing_rule_name}-https"
     rule_type                   = "Basic"
     http_listener_name          = "${local.listener_name}-https"
     redirect_configuration_name = local.redirect_configuration_name
  }
    
  lifecycle {
     ignore_changes = [
       backend_address_pool,
       backend_http_settings,
       frontend_port,
       http_listener,
       request_routing_rule,
       ssl_certificate,
       redirect_configuration
     ]
  }
}

resource "azurerm_dns_zone" "zone" {
   provider = azurerm.generic
    
   for_each            = toset(local.dns_zone_names)
   name                = each.key
   resource_group_name = azurerm_resource_group.rg.name
}
    
resource "azurerm_app_service_plan" "service_plan" {
   provider = azurerm.generic
    
   name                = "${local.service_name}-service-plan"
   location            = azurerm_resource_group.rg.location
   resource_group_name = azurerm_resource_group.rg.name
    
   sku {
     tier = "Basic"
     size = "B1"
   }
}
    
resource "azurerm_app_service" "service" {
   provider = azurerm.generic
    
   name                = "${local.service_name}-service"
   app_service_plan_id = azurerm_app_service_plan.service_plan.id
   location            = azurerm_resource_group.rg.location
   resource_group_name = azurerm_resource_group.rg.name
}
    
resource "azurerm_app_service_custom_hostname_binding" "service_host_bind" {
   provider = azurerm.generic
    
   count               = length(local.dns_zone_names)
   hostname            = "${local.dns_zone_names[count.index]}"
   app_service_name    = azurerm_app_service.service.name
   resource_group_name = azurerm_resource_group.rg.name
    
   lifecycle {
     ignore_changes = [ssl_state, thumbprint]
   }
    
   depends_on                      = [
     azurerm_app_service.service,
     azurerm_resource_group.rg
   ]
}
    
resource "azurerm_app_service_managed_certificate" "service_manage_cert" {
   provider = azurerm.generic
    
   count                       = length(local.dns_zone_names)
   custom_hostname_binding_id  = azurerm_app_service_custom_hostname_binding.service_host_bind[count.index].id
}
    
resource "azurerm_app_service_certificate_binding" "service_certi_bind" {
   provider = azurerm.generic
    
   count               = length(local.dns_zone_names)
   hostname_binding_id = azurerm_app_service_custom_hostname_binding.service_host_bind[count.index].id
   certificate_id      = azurerm_app_service_managed_certificate.service_manage_cert[count.index].id
    
   ssl_state = "SniEnabled"
}

quiero un servicio que simplemente dirija a otro sitio web a través de dns usando terraform, y si hay alguna otra forma, háganoslo saber. (incluye http a https)

Para proteger y prevenir el abuso del sitio web, nos gustaría redirigir varios dominios a un sitio web. ej: (dominio.net -> www.objetivo.comdominio.tv -> www.objetivo.combdominio.net -> www.objetivo.com)

  • Hola, gracias por reproducir XD Lo que estoy pensando ahora es obtener la certificación gratuita del plan de servicio y usarlo. ¿Es posible con un certificado de aplicación gratuita? Hasta donde yo sé, reescribo los soportes de v2, pero uso v1. Además, ¿no está bien no usar reescribir para redirigir?

    – dpa456

    30 de noviembre de 2021 a las 13:47


  • Ahora que lo pienso, no necesito un certificado SSL http, ¿verdad? Dado que no se requiere el redireccionamiento de http a https, ¿qué opina sobre el plan de servicio que solo autentica y redirecciona http al exterior?

    – dpa456

    30 de noviembre de 2021 a las 14:42


  • Los certificados están destinados a la aplicación y no al ASP (VM). La redirección es parte de System.WebServer y funciona en la aplicación después de que la negociación SSL se realice con éxito a través del protocolo HTTPS. El plan de servicio es solo un hardware y una aplicación segura con un certificado implementado en ese plan.

    – Rohit Tatiya

    30 de noviembre de 2021 a las 15:35

  • Ah… Sí, tienes razón. ¿La puerta de enlace de aplicaciones actualmente no admite la redirección http 301 (a una URL externa)?

    – dpa456

    30 de noviembre de 2021 a las 16:20

  • si, es compatible. debe utilizar la regla de reescritura en la puerta de enlace de la aplicación.learn.microsoft.com/en-us/azure/application-gateway/…

    – Rohit Tatiya

    1 de diciembre de 2021 a las 7:47

¿Ha sido útil esta solución?