Terraform 을 사용하면 클라우드 인프라의 정의, 미리 보기 및 배포가 가능합니다. Terraform을 사용하여 HCL 구문을 사용하여 구성 파일을 만듭니다. HCL 구문을 사용하면 클라우드 공급자(예: Azure)와 클라우드 인프라를 구성하는 요소를 지정할 수 있습니다. 구성 파일을 만든 후에는 인프라 변경 내용을 배포하기 전에 미리 볼 수 있는 실행 계획을 만듭니다. 변경 내용을 확인하면 실행 계획을 적용하여 인프라를 배포합니다.
이 문서에서는 Azure에서 온-프레미스 네트워크를 구현하는 방법을 보여 줍니다. 샘플 네트워크를 프라이빗 가상 네트워크로 바꿀 수 있습니다. 이렇게 하려면 사용자 환경에 맞게 서브넷 IP 주소를 수정합니다.
이 문서에서는 다음 방법을 알아봅니다.
- 허브-스포크 토폴로지에서 온-프레미스 VNet 구현
- 허브 네트워크 어플라이언스 리소스 만들기
- 온-프레미스 가상 머신 만들기
- 온-프레미스 가상 프라이빗 네트워크 게이트웨이 만들기
1. 환경 구성
- Azure 구독: Azure 구독이 없는 경우 시작하기 전에 체험 계정을 만듭니다.
Terraform 구성: 아직 구성하지 않은 경우 다음 옵션 중 하나를 사용하여 Terraform을 구성합니다.
2. Terraform 코드 구현
이 시리즈의 첫 번째 문서에서 만든 예제 디렉터리를 현재 디렉터리로 만듭니다.
on-prem.tf
라는 파일을 만들고 다음 코드를 삽입합니다.locals { onprem-location = "eastus" onprem-resource-group = "onprem-vnet-rg-${random_string.suffix.result}" prefix-onprem = "onprem" } resource "azurerm_resource_group" "onprem-vnet-rg" { name = local.onprem-resource-group location = local.onprem-location } resource "azurerm_virtual_network" "onprem-vnet" { name = "onprem-vnet" location = azurerm_resource_group.onprem-vnet-rg.location resource_group_name = azurerm_resource_group.onprem-vnet-rg.name address_space = ["192.168.0.0/16"] tags = { environment = local.prefix-onprem } } resource "azurerm_subnet" "onprem-gateway-subnet" { name = "GatewaySubnet" resource_group_name = azurerm_resource_group.onprem-vnet-rg.name virtual_network_name = azurerm_virtual_network.onprem-vnet.name address_prefixes = ["192.168.255.224/27"] } resource "azurerm_subnet" "onprem-mgmt" { name = "mgmt" resource_group_name = azurerm_resource_group.onprem-vnet-rg.name virtual_network_name = azurerm_virtual_network.onprem-vnet.name address_prefixes = ["192.168.1.128/25"] } resource "azurerm_public_ip" "onprem-pip" { name = "${local.prefix-onprem}-pip" location = azurerm_resource_group.onprem-vnet-rg.location resource_group_name = azurerm_resource_group.onprem-vnet-rg.name allocation_method = "Dynamic" tags = { environment = local.prefix-onprem } } resource "azurerm_network_interface" "onprem-nic" { name = "${local.prefix-onprem}-nic" location = azurerm_resource_group.onprem-vnet-rg.location resource_group_name = azurerm_resource_group.onprem-vnet-rg.name enable_ip_forwarding = true ip_configuration { name = local.prefix-onprem subnet_id = azurerm_subnet.onprem-mgmt.id private_ip_address_allocation = "Dynamic" public_ip_address_id = azurerm_public_ip.onprem-pip.id } } # Create Network Security Group and rule resource "azurerm_network_security_group" "onprem-nsg" { name = "${local.prefix-onprem}-nsg" location = azurerm_resource_group.onprem-vnet-rg.location resource_group_name = azurerm_resource_group.onprem-vnet-rg.name security_rule { name = "SSH" priority = 1001 direction = "Inbound" access = "Allow" protocol = "Tcp" source_port_range = "*" destination_port_range = "22" source_address_prefix = "*" destination_address_prefix = "*" } tags = { environment = "onprem" } } resource "azurerm_subnet_network_security_group_association" "mgmt-nsg-association" { subnet_id = azurerm_subnet.onprem-mgmt.id network_security_group_id = azurerm_network_security_group.onprem-nsg.id } resource "azurerm_virtual_machine" "onprem-vm" { name = "${local.prefix-onprem}-vm" location = azurerm_resource_group.onprem-vnet-rg.location resource_group_name = azurerm_resource_group.onprem-vnet-rg.name network_interface_ids = [azurerm_network_interface.onprem-nic.id] vm_size = var.vmsize storage_image_reference { publisher = "Canonical" offer = "UbuntuServer" sku = "16.04-LTS" version = "latest" } storage_os_disk { name = "myosdisk1" caching = "ReadWrite" create_option = "FromImage" managed_disk_type = "Standard_LRS" } os_profile { computer_name = "${local.prefix-onprem}-vm" admin_username = var.username admin_password = local.password } os_profile_linux_config { disable_password_authentication = false } tags = { environment = local.prefix-onprem } } resource "azurerm_public_ip" "onprem-vpn-gateway1-pip" { name = "${local.prefix-onprem}-vpn-gateway1-pip" location = azurerm_resource_group.onprem-vnet-rg.location resource_group_name = azurerm_resource_group.onprem-vnet-rg.name allocation_method = "Dynamic" } resource "azurerm_virtual_network_gateway" "onprem-vpn-gateway" { name = "onprem-vpn-gateway1" location = azurerm_resource_group.onprem-vnet-rg.location resource_group_name = azurerm_resource_group.onprem-vnet-rg.name type = "Vpn" vpn_type = "RouteBased" active_active = false enable_bgp = false sku = "VpnGw1" ip_configuration { name = "vnetGatewayConfig" public_ip_address_id = azurerm_public_ip.onprem-vpn-gateway1-pip.id private_ip_address_allocation = "Dynamic" subnet_id = azurerm_subnet.onprem-gateway-subnet.id } depends_on = [azurerm_public_ip.onprem-vpn-gateway1-pip] }
Azure에서 Terraform 문제 해결
Azure에서 Terraform을 사용할 때 발생하는 일반적인 문제 해결