Condividi tramite


Creare due app Web connesse in modo sicuro con l'endpoint privato e l'integrazione della rete virtuale

Questo articolo illustra un esempio di uso dell'endpoint privato e dell'integrazione della rete virtuale a livello di area per connettere in modo sicuro due app Web (front-end e back-end) con la configurazione terraform seguente:

  1. Distribuire una rete virtuale
  2. Creare la prima subnet per l'integrazione
  3. Creare la seconda subnet per l'endpoint privato e disabilitare i criteri di rete della subnet per gli endpoint privati (set private_endpoint_network_policies_enabled = false)
  4. Distribuire un piano di servizio app di tipo Basic, Standard, PremiumV2, PremiumV3, IsolatedV2, Functions Premium (talvolta definito piano Elastic Premium), necessario per la funzionalità Endpoint privato
  5. Creare l'app Web front-end con impostazioni dell'app specifiche per usare la zona DNS privata. Per altre informazioni, vedere Zone private dns di Azure.
  6. Connettere l'app Web front-end alla subnet di integrazione
  7. Creare l'applicazione di back-end Web
  8. Creare la zona privata DNS con il nome dell'area di collegamento privato per le app Web (privatelink.azurewebsites.net)
  9. Collegare questa zona alla rete virtuale
  10. Creare l'endpoint privato per l'applicazione web back-end nella subnet dell'endpoint e registrare i nomi DNS (sito e SCM) nella zona DNS privata creata in precedenza

Come usare terraform in Azure

Passare alla documentazione di Azure per informazioni su come usare terraform con Azure.

File terraform completo

Per usare questo file, sostituire i segnaposto <unique-frontend-app-name> e <unique-backend-app-name> (il nome dell'app viene usato per formare un nome DNS univoco in tutto il mondo).

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.0"
    }
  }
}

provider "azurerm" {
  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"]

  private_endpoint_network_policies_enabled = false
}

resource "azurerm_service_plan" "appserviceplan" {
  name                = "appserviceplan"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  os_type             = "Windows"
  sku_name            = "P1v2"
}

resource "azurerm_windows_web_app" "frontwebapp" {
  name                = "<unique-frontend-app-name>"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  service_plan_id     = azurerm_service_plan.appserviceplan.id

  site_config {}

  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_windows_web_app.frontwebapp.id
  subnet_id      = azurerm_subnet.integrationsubnet.id
}

resource "azurerm_windows_web_app" "backwebapp" {
  name                = "<unique-backend-app-name>"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  service_plan_id     = azurerm_service_plan.appserviceplan.id

  site_config {}
}

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_windows_web_app.backwebapp.id
    subresource_names              = ["sites"]
    is_manual_connection           = false
  }
}

Passaggi successivi

Altre informazioni sull'uso di Terraform in Azure