Cloud/AZURE

Terraform on Azure 정리 (7) - Azure 배포 테스트 : Firewall & UDR

BOKCH1 2025. 5. 8. 23:38

 

배포 계획

구조: Hub-Spoke 네트워크 모델
- Hub: 공통 인프라 구성 (VPN Gateway, Firewall 등)
- Spoke: 업무별 구분된 네트워크 (Web, WAS, DB 등 리소스 배치)

보안 구성
- NSG (Network Security Group): 각 Spoke VNet 및 서브넷에 할당
- VPN Gateway: Hub VNet에 배치
- Firewall: Hub VNet에 배치 및 UDR과 연동

리소스 그룹 구조
- RG-NETWORK – 가상 네트워크 및 서브넷 등 네트워크 리소스
- RG-SECURITY – NSG, Firewall, VPN 등 보안 리소스
- RG-COMPUTE – 가상 머신 등 컴퓨트 리소스
- RG-STORAGE – Storage Account 등 저장소 리소스

Tag 구성
- Key : Value 예시
- ResourceName : vm-web-prd-01 등
- ServiceType : WEB, WAS, DB 등
- Environment : PRD, QA, DEV
- DeploymentDate : 2025-05-07 등

 


 

Firewall.tf

- 리전, 리소스그룹 이름, 서브넷은 앞서 variables.tf와 network.tf에서 선언한 내용을 참조

# Firewall 공인 IP 생성
resource "azurerm_public_ip" "firewall_pip" {
  name                = "hub-fw-pip"
  location            = var.location
  resource_group_name = azurerm_resource_group.security_rg.name
  allocation_method   = "Static"
  sku                 = "Standard"  # Firewall IP는 Standard reguired

  tags = {
    ResourceName   = "hub-fw-pip"
    ServiceType    = "Firewall"
    Environment    = "PRD"
    DeploymentDate = "2025-05-07"
  }

  depends_on = [
    azurerm_resource_group.security_rg
  ] # 리소스그룹이 준비되기전에 ip를 만드려고해서 의존성 오류 발생대비
}
 


# 2. Azure Firewall 생성
resource "azurerm_firewall" "hub_fw" {
  name                = "hub-fw"
  location            = var.location
  resource_group_name = var.resource_groups.security  # variables에서 정의된 security 리소스 그룹 사용

  ip_configuration {
    name                 = "hub-fw-ipcfg"
    subnet_id            = azurerm_subnet.hub_firewall_subnet.id  # 이미 network.tf에 정의된 AzureFirewallSubnet 참조
    public_ip_address_id = azurerm_public_ip.firewall_pip.id
  }

  sku_name = "AZFW_VNet"
  sku_tier = "Standard"

  tags = {
    ResourceName   = "hub-fw"
    DeploymentDate = "2025-05-07"
  }
}

 

- az account show로 현재 구독 위치 확인
- terraform validate를 통해 설정 유효성 검사

- terraform plan을 통해 리소스 생성 계획 확인

- terraform apply로 적용 (yes 입력)

 

- 결과 확인


UDR.tf

- UDR : User Defined Route, 사용자 지정 경로

- Firewall을 통하는 inbound traffic은 DNAT으로 처리되나, VM outbound는 Firewall을 통해서 외부로 나갈 수 있도록 URD 설정을 해주어야함 

- (Spoke) PRD web VM이 Hub의 Azure Firewall을 통해 인터넷이나 외부 네트워크로 나가도록 유도하는 UDR(User Defined Route) 설정

** UDR과 VM이 동일한 RG에 존재하지 않아도 됨. UDR은 Subnet에 연결되므로, VM의 NIC가 해당 Subnet에 속해 있다면 라우팅 정책이 잘 적용됨.

# PRD Web Subnet용 Route Table 정의
resource "azurerm_route_table" "prd_web_route_table" {
  name                = "prd-web-subnet-rt"
  location            = azurerm_resource_group.network_rg.location
  resource_group_name = azurerm_resource_group.network_rg.name
  # VM이 있는 Compute RG에 둬도 되겠지만, UDR은 Subnet(NIC)에 귀속되므로 VM이 속한 RG와 다른 Network RG에 생성하여도 문제없음 

  tags = {
    ResourceName   = "prd-web-subnet-rt"
    Environment    = "PRD"
    DeploymentDate = "2025-05-07"
  }
}

# Default Route: 트래픽을 Azure Firewall로 보내기
resource "azurerm_route" "prd_web_to_fw_route" {
  name                   = "default-to-fw"
  resource_group_name    = azurerm_resource_group.network_rg.name
  route_table_name       = azurerm_route_table.prd_web_route_table.name
  address_prefix         = "0.0.0.0/0"
  next_hop_type          = "VirtualAppliance"
  next_hop_in_ip_address = azurerm_firewall.hub_fw.ip_configuration[0].private_ip_address
}

# prd-web-subnet과 Route Table 연결
resource "azurerm_subnet_route_table_association" "prd_web_subnet_association" {
  subnet_id      = azurerm_subnet.prd_subnet_web.id
  route_table_id = azurerm_route_table.prd_web_route_table.id
}

- az account show로 현재 구독 위치 확인
- terraform validate를 통해 설정 유효성 검사

- terraform plan을 통해 리소스 생성 계획 확인

- terraform apply로 적용 (yes 입력)

 

- 결과 확인

 

다음홉 '가상 어플라이언스'로 잘 지정, 다음 홉 IP도 Firewall 사설 IP로 잘 지정됨