Créer deux applications web connectées en toute sécurité avec un point de terminaison privé et une intégration au réseau virtuel
Cet article présente un exemple d’utilisation d’un point de terminaison privé et d’une intégration au réseau virtuel régional pour connecter deux applications web (frontale et principale) en toute sécurité avec la configuration Terraform suivante :
- Déployer un réseau virtuel.
- Créer le premier sous-réseau pour l’intégration.
- Créer le deuxième sous-réseau pour le point de terminaison privé. Vous devez définir un paramètre spécifique pour désactiver les stratégies réseau.
- Déployer un plan App Service de type Basic, Standard, PremiumV2, PremiumV3, IsolatedV2, Functions Premium (parfois appelé plan Elastic Premium), requis pour la fonctionnalité de point de terminaison privé
- Créer l’application web frontale avec des paramètres d’application spécifiques pour utiliser la zone DNS privée. En savoir plus.
- Connecter l’application web frontale au sous-réseau d’intégration.
- Créer l’application web principale.
- Créer la zone DNS privée avec le nom de la zone de liaison privée pour l’application web privatelink.azurewebsites.net.
- Lier cette zone au réseau virtuel.
- Créer le point de terminaison privé pour l’application web principale dans le sous-réseau du point de terminaison, puis enregistrer les noms DNS (site web et SCM) dans la zone privée DNS créée précédemment.
Comment utiliser Terraform dans Azure
Pour savoir comment utiliser Terraform avec Azure, consultez la documentation d’Azure.
Fichier Terraform complet
Pour utiliser ce fichier, remplacez les espaces réservés <unique-frontend-app-name> et <unique-backend-app-name> (le nom de l’application est utilisé pour former un nom DNS unique dans le monde entier).
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
}
}