Criar rede virtual local no Azure usando o Terraform

Terraform permite a definição, visualização e implantação de infraestrutura em nuvem. Usando Terraform, você cria arquivos de configuração usando a sintaxe HCL. A sintaxe HCL permite especificar o provedor de nuvem - como o Azure - e os elementos que compõem sua infraestrutura de nuvem. Depois de criar os arquivos de configuração, você cria um plano de execução que permite visualizar as alterações na infraestrutura antes que elas sejam implantadas. Depois de verificar as alterações, você aplica o plano de execução para implantar a infraestrutura.

Este artigo mostra como implementar uma rede local no Azure. Você pode substituir a rede de exemplo por uma rede virtual privada. Para fazer isso, modifique os endereços IP da sub-rede para se adequar ao seu ambiente.

Neste artigo, vai aprender a:

  • Implementar uma VNet local na topologia hub-spoke
  • Criar recursos de dispositivo de rede de hub
  • Criar máquina virtual local
  • Criar gateway de rede virtual privada local

1. Configure seu ambiente

  • Subscrição do Azure: se não tem uma subscrição do Azure, crie uma conta gratuita antes de começar.

2. Implementar o código Terraform

  1. Faça do diretório de exemplo criado no primeiro artigo desta série o diretório atual.

  2. Crie um arquivo chamado on-prem.tf e insira o seguinte código:

    locals {
        onprem-location       = "eastus"
        onprem-resource-group = "onprem-vnet-rg"
        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 = var.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]
    
    }
    

Solucionar problemas do Terraform no Azure

Solucionar problemas comuns ao usar o Terraform no Azure

Próximos passos