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'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:
- 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
}
}