Private Endpoint 및 VNet 통합으로 안전하게 연결된 두 개의 웹앱 만들기
이 문서에서는 프라이빗 엔드포인트 및 지역 VNet 통합을 사용하여 다음 terraform 구성으로 두 개의 웹앱(프런트 엔드 및 백 엔드)을 안전하게 연결하는 예를 보여 줍니다.
- VNet 배포
- 통합을 위한 첫 번째 서브넷 만들기
- 프라이빗 엔드포인트에 대한 두 번째 서브넷을 만듭니다. 네트워크 정책을 사용하지 않도록 설정하려면 특정 매개 변수를 설정해야 합니다.
- 프라이빗 엔드포인트 기능에 필요한 Basic, Standard, PremiumV2, PremiumV3, IsolatedV2, Functions Premium(Elastic Premium 플랜이라고도 함) 형식의 App Service 플랜 하나를 배포합니다.
- 특정 앱 설정을 통해 프런트 엔드 웹앱을 만들어 프라이빗 DNS 영역을 사용합니다. 자세한 정보
- 프런트 엔드 웹앱을 통합 서브넷에 연결
- 백 엔드 웹앱 만들기
- 웹앱 privatelink.azurewebsites.net에 대한 프라이빗 링크 영역 이름으로 DNS 프라이빗 영역을 만듭니다.
- 이 영역을 VNet에 연결
- 엔드포인트 서브넷에 백 엔드 웹앱에 대한 프라이빗 엔드포인트를 만들고 이전에 만든 DNS 프라이빗 영역에 DNS 이름(웹 사이트 및 SCM)을 등록합니다.
Azure에서 terraform을 사용하는 방법
Azure 설명서로 이동하여 Azure에서 terraform을 사용하는 방법을 알아봅니다.
전체 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.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
}
}