本文以示例方式演示如何使用专用终结点和区域 VNet 集成通过以下 terraform 配置安全地连接两个 Web 应用(前端和后端):
- 部署 VNet
 - 为集成创建第一个子网
 - 为专用终结点创建第二个子网,必须设置特定参数才能禁用网络策略
 - 部署一个应用服务计划,类型为 Basic、Standard、PremiumV2、IsolatedV2、Functions 高级(有时称为弹性高级计划),这是专用终结点功能所需的
 - 使用特定应用设置创建前端 Web 应用以使用专用 DNS 区域,详细信息
 - 将前端 Web 应用连接到集成子网
 - 创建后端 Web 应用
 - 创建 DNS 专用区域,使用 Web 应用的专用链接区域的名称 privatelink.chinacloudsites.cn
 - 将此区域链接到 VNet
 - 在终结点子网中为后端 Web 应用创建专用终结点,并在之前创建的 DNS 专用区域中注册 DNS 名称(网站和 SCM)
 
如何在 Azure 中使用 Terraform
浏览 Azure 文档以了解如何将 Terraform 与 Azure 结合使用。
完整的 Terraform 文件
若要使用此文件,请替换占位符 <unique-frontend-app-name> 和 <unique-backend-app-name>(应用名称用于在全球形成独一无二的 DNS 名称)。
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.chinacloudsites.cn"
  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
  }
}