创建两个 Web 应用程序,通过专用终结点和 VNet 集成进行安全连接

本文演示了如何使用 专用终结点 和区域 VNet 集成 通过以下 Terraform 配置安全地连接两个 Web 应用(前端和后端):

  1. 部署 VNet
  2. 为集成创建第一个子网
  3. 为专用终结点创建第二个子网,并为专用终结点禁用子网网络策略(set private_endpoint_network_policies_enabled = false
  • 部署一个应用服务计划,类型为基本、标准、PremiumV2、IsolatedV2、或 Functions Premium(有时称为弹性高级计划),这对于专用终结点功能是必需的。
  1. 创建具有特定应用设置的前端 Web 应用以使用专用 DNS 区域。 有关详细信息,请参阅 Azure DNS 专用区域
  2. 将前端 Web 应用连接到集成子网
  3. 创建后端 Web 应用
  4. 使用与 Web 应用的专用链接区域同名的区域来创建 DNS 专用区域(privatelink.chinacloudsites.cn
  5. 将此区域链接到 VNet
  6. 在终结点子网中为后端 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 = 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.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
  }
}

后续步骤

详细了解如何在 Azure 中使用 Terraform