Condividi tramite


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

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

  • Distribuire una rete virtuale
  • Creare la prima subnet per l'integrazione
  • Creare la seconda subnet per l'endpoint privato; è necessario impostare un parametro specifico per disabilitare i criteri di rete
  • Distribuire un piano servizio app di tipo Basic, Standard, PremiumV2, PremiumV3, IsolatedV2, Functions Premium (talvolta definito piano Elastic Premium), necessario per la funzionalità Endpoint privato
  • Creare l'app Web front-end con impostazioni specifiche dell'app per utilizzare la zona DNS privata, altri dettagli
  • Connettere l'app Web front-end alla subnet di integrazione
  • Creare l'app Web di back-end
  • Creare la zona DNS privata con il nome della zona del collegamento privato per l'app Web privatelink.azurewebsites.net
  • Collegare questa zona alla rete virtuale
  • Creare l'endpoint privato per l'app Web back-end nella subnet dell'endpoint e registrare i nomi DNS (sito Web e Gestione controllo servizi) 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.

Il 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 = true
}

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

Vedere altre informazioni sull'uso di Terraform in Azure