Membuat dua aplikasi web yang terhubung dengan aman dengan Titik Akhir Privat dan integrasi VNet

Artikel ini mengilustrasikan contoh penggunaan Titik Akhir Privat dan integrasi VNet regional untuk menghubungkan dua aplikasi web (frontend dan backend) dengan aman dengan konfigurasi Terraform berikut:

  1. Menerapkan VNet
  2. Membuat subnet pertama untuk integrasi
  3. Buat subnet kedua untuk titik akhir privat, dan nonaktifkan kebijakan jaringan subnet untuk titik akhir privat (set private_endpoint_network_policies_enabled = false)
  4. Menyebarkan satu paket App Service jenis Dasar, Standar, PremiumV2, PremiumV3, IsolatedV2, Functions Premium (kadang-kadang disebut sebagai paket Elastic Premium), diperlukan untuk fitur Titik Akhir Privat
  5. Buat aplikasi web frontend dengan pengaturan aplikasi tertentu untuk menggunakan zona DNS privat. Untuk informasi selengkapnya, lihat Zona privat Azure DNS.
  6. Menyambungkan aplikasi web frontend ke subnet integrasi
  7. Membuat aplikasi web backend
  8. Membuat zona privat DNS dengan nama zona tautan privat untuk aplikasi web (privatelink.azurewebsites.net)
  9. Tautkan zona ini ke VNet
  10. Buat titik akhir privat untuk aplikasi web backend di subnet titik akhir, dan daftarkan nama DNS (situs dan SCM) di zona privat DNS yang dibuat sebelumnya

Cara menggunakan terraform di Azure

Telusuri ke dokumentasi Azure untuk mempelajari cara menggunakan terraform dengan Azure.

File terraform lengkap

Untuk menggunakan file ini, ganti tempat penampung <unique-frontend-app-name> dan <unique-backend-app-name> (nama aplikasi digunakan untuk membentuk nama DNS unik di seluruh dunia).

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.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
  }
}

Langkah berikutnya

Pelajari selengkapnya tentang menggunakan Terraform di Azure