Criar dois aplicativos Web conectados com segurança por meio da Integração VNET e do ponto de extremidade privado

Este artigo ilustra um exemplo de uso do ponto de extremidade privado e da Integração VNET regional para conectar dois aplicativos Web (front-end e back-end) com segurança seguindo estas etapas:

  • Implantar uma VNET
  • Criar a primeira sub-rede para a integração
  • Criar a segunda sub-rede para o ponto de extremidade privado; é necessário definir um parâmetro específico para desabilitar as políticas de rede
  • Implantar um Plano do Serviço de Aplicativo do tipo PremiumV2 ou PremiumV3, necessário para o recurso de Ponto de extremidade privado
  • Criar o aplicativo Web front-end com algumas configurações de aplicativo específicas para consumir a zona DNS privada; mais detalhes
  • Conectar o aplicativo Web front-end à sub-rede de integração
  • Criar o aplicativo Web de back-end
  • Criar a zona privada DNS com o nome da zona de link privado para o aplicativo Web privatelink.azurewebsites.net
  • Vincular essa zona à VNET
  • Criar o ponto de extremidade privado para o aplicativo Web de back-end na sub-rede do ponto de extremidade e registrar nomes DNS (site e SCM) na zona privada DNS criada anteriormente

Como usar o Terraform no Azure

Acesse a documentação do Azure para saber como usar o Terraform com o Azure.

O arquivo completo do Terraform

Para usar esse arquivo, é necessário alterar a propriedade de nome para os recursos frontwebapp e backwebapp (o nome do aplicativo Web precisa ser um nome DNS exclusivo em todo o mundo).

provider "azurerm" {
  version = "~>2.0"
  features {}
}

resource "azurerm_resource_group" "rg" {
  name     = "appservice-rg"
  location = "francecentral"
}

resource "azurerm_virtual_network" "vnet" {
  name                = "vnet"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  address_space       = ["10.0.0.0/16"]
}

resource "azurerm_subnet" "integrationsubnet" {
  name                 = "integrationsubnet"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefixes     = ["10.0.1.0/24"]
  delegation {
    name = "delegation"
    service_delegation {
      name = "Microsoft.Web/serverFarms"
    }
  }
}

resource "azurerm_subnet" "endpointsubnet" {
  name                 = "endpointsubnet"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefixes     = ["10.0.2.0/24"]
  enforce_private_link_endpoint_network_policies = true
}

resource "azurerm_app_service_plan" "appserviceplan" {
  name                = "appserviceplan"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

  sku {
    tier = "Premiumv2"
    size = "P1v2"
  }
}

resource "azurerm_app_service" "frontwebapp" {
  name                = "frontwebapp20200810"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  app_service_plan_id = azurerm_app_service_plan.appserviceplan.id

  app_settings = {
    "WEBSITE_DNS_SERVER": "168.63.129.16",
    "WEBSITE_VNET_ROUTE_ALL": "1"
  }
}

resource "azurerm_app_service_virtual_network_swift_connection" "vnetintegrationconnection" {
  app_service_id  = azurerm_app_service.frontwebapp.id
  subnet_id       = azurerm_subnet.integrationsubnet.id
}

resource "azurerm_app_service" "backwebapp" {
  name                = "backwebapp20200810"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  app_service_plan_id = azurerm_app_service_plan.appserviceplan.id
}

resource "azurerm_private_dns_zone" "dnsprivatezone" {
  name                = "privatelink.azurewebsites.net"
  resource_group_name = azurerm_resource_group.rg.name
}

resource "azurerm_private_dns_zone_virtual_network_link" "dnszonelink" {
  name = "dnszonelink"
  resource_group_name = azurerm_resource_group.rg.name
  private_dns_zone_name = azurerm_private_dns_zone.dnsprivatezone.name
  virtual_network_id = azurerm_virtual_network.vnet.id
}

resource "azurerm_private_endpoint" "privateendpoint" {
  name                = "backwebappprivateendpoint"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  subnet_id           = azurerm_subnet.endpointsubnet.id

  private_dns_zone_group {
    name = "privatednszonegroup"
    private_dns_zone_ids = [azurerm_private_dns_zone.dnsprivatezone.id]
  }

  private_service_connection {
    name = "privateendpointconnection"
    private_connection_resource_id = azurerm_app_service.backwebapp.id
    subresource_names = ["sites"]
    is_manual_connection = false
  }
}

Próximas etapas

Saiba mais sobre como usar o Terraform no Azure