Creación de una red virtual de centro de conectividad en Azure mediante Terraform

Terraform habilita la definición, vista previa e implementación de la infraestructura en la nube. Con Terraform, se crean archivos de configuración mediante la sintaxis de HCL. La sintaxis de HCL permite especificar el proveedor de la nube, como Azure, y los elementos que componen la infraestructura de la nube. Después de crear los archivos de configuración, se crea un plan de ejecución que permite obtener una vista previa de los cambios de infraestructura antes de implementarlos. Una vez que compruebe los cambios, aplique el plan de ejecución para implementar la infraestructura.

La red virtual del centro de conectividad sirve como punto central de conectividad con la red local. La red virtual hospeda los servicios compartidos que consumen las cargas de trabajo hospedadas en las redes virtuales de radio. En este artículo no se implementan servicios compartidos con fines de demostración.

En este artículo aprenderá a:

  • Implementar la red virtual de centro de conectividad en una topología de red de tipo hub-and-spoke.
  • Crear una máquina virtual Jumpbox de centro de conectividad.
  • Crear una puerta de enlace de red privada virtual de centro de conectividad.
  • Crear conexiones de puerta de enlace locales y de centro de conectividad.

1. Configurar su entorno

  • Suscripción de Azure: si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

2. Implementación del código de Terraform

La red de concentrador consta de estos componentes:

  • Una red virtual del centro de conectividad
  • Una puerta de enlace de red virtual del centro de conectividad
  • Conexiones de puerta de enlace de concentrador
  1. Haga que el directorio de ejemplo creado en el primer artículo de esta serie sea el directorio actual.

  2. En el directorio de ejemplo, cree un archivo llamado hub-vnet.tf.

  3. Inserte el siguiente código:

    locals {
        prefix-hub         = "hub"
        hub-location       = "eastus"
        hub-resource-group = "hub-vnet-rg"
        shared-key         = "4-v3ry-53cr37-1p53c-5h4r3d-k3y"
    }
    
    resource "azurerm_resource_group" "hub-vnet-rg" {
        name     = local.hub-resource-group
        location = local.hub-location
    }
    
    resource "azurerm_virtual_network" "hub-vnet" {
        name                = "${local.prefix-hub}-vnet"
        location            = azurerm_resource_group.hub-vnet-rg.location
        resource_group_name = azurerm_resource_group.hub-vnet-rg.name
        address_space       = ["10.0.0.0/16"]
    
        tags = {
        environment = "hub-spoke"
        }
    }
    
    resource "azurerm_subnet" "hub-gateway-subnet" {
        name                 = "GatewaySubnet"
        resource_group_name  = azurerm_resource_group.hub-vnet-rg.name
        virtual_network_name = azurerm_virtual_network.hub-vnet.name
        address_prefixes     = ["10.0.255.224/27"]
    }
    
    resource "azurerm_subnet" "hub-mgmt" {
        name                 = "mgmt"
        resource_group_name  = azurerm_resource_group.hub-vnet-rg.name
        virtual_network_name = azurerm_virtual_network.hub-vnet.name
        address_prefixes       = ["10.0.0.64/27"]
    }
    
    resource "azurerm_subnet" "hub-dmz" {
        name                 = "dmz"
        resource_group_name  = azurerm_resource_group.hub-vnet-rg.name
        virtual_network_name = azurerm_virtual_network.hub-vnet.name
        address_prefixes       = ["10.0.0.32/27"]
    }
    
    resource "azurerm_network_interface" "hub-nic" {
        name                 = "${local.prefix-hub}-nic"
        location             = azurerm_resource_group.hub-vnet-rg.location
        resource_group_name  = azurerm_resource_group.hub-vnet-rg.name
        enable_ip_forwarding = true
    
        ip_configuration {
        name                          = local.prefix-hub
        subnet_id                     = azurerm_subnet.hub-mgmt.id
        private_ip_address_allocation = "Dynamic"
        }
    
        tags = {
        environment = local.prefix-hub
        }
    }
    
    #Virtual Machine
    resource "azurerm_virtual_machine" "hub-vm" {
        name                  = "${local.prefix-hub}-vm"
        location              = azurerm_resource_group.hub-vnet-rg.location
        resource_group_name   = azurerm_resource_group.hub-vnet-rg.name
        network_interface_ids = [azurerm_network_interface.hub-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-hub}-vm"
        admin_username = var.username
        admin_password = var.password
        }
    
        os_profile_linux_config {
        disable_password_authentication = false
        }
    
        tags = {
        environment = local.prefix-hub
        }
    }
    
    # Virtual Network Gateway
    resource "azurerm_public_ip" "hub-vpn-gateway1-pip" {
        name                = "hub-vpn-gateway1-pip"
        location            = azurerm_resource_group.hub-vnet-rg.location
        resource_group_name = azurerm_resource_group.hub-vnet-rg.name
    
        allocation_method = "Dynamic"
    }
    
    resource "azurerm_virtual_network_gateway" "hub-vnet-gateway" {
        name                = "hub-vpn-gateway1"
        location            = azurerm_resource_group.hub-vnet-rg.location
        resource_group_name = azurerm_resource_group.hub-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.hub-vpn-gateway1-pip.id
        private_ip_address_allocation = "Dynamic"
        subnet_id                     = azurerm_subnet.hub-gateway-subnet.id
        }
        depends_on = [azurerm_public_ip.hub-vpn-gateway1-pip]
    }
    
    resource "azurerm_virtual_network_gateway_connection" "hub-onprem-conn" {
        name                = "hub-onprem-conn"
        location            = azurerm_resource_group.hub-vnet-rg.location
        resource_group_name = azurerm_resource_group.hub-vnet-rg.name
    
        type           = "Vnet2Vnet"
        routing_weight = 1
    
        virtual_network_gateway_id      = azurerm_virtual_network_gateway.hub-vnet-gateway.id
        peer_virtual_network_gateway_id = azurerm_virtual_network_gateway.onprem-vpn-gateway.id
    
        shared_key = local.shared-key
    }
    
    resource "azurerm_virtual_network_gateway_connection" "onprem-hub-conn" {
        name                = "onprem-hub-conn"
        location            = azurerm_resource_group.onprem-vnet-rg.location
        resource_group_name = azurerm_resource_group.onprem-vnet-rg.name
        type                            = "Vnet2Vnet"
        routing_weight = 1
        virtual_network_gateway_id      = azurerm_virtual_network_gateway.onprem-vpn-gateway.id
        peer_virtual_network_gateway_id = azurerm_virtual_network_gateway.hub-vnet-gateway.id
    
        shared_key = local.shared-key
    }
    

Solución de problemas de Terraform en Azure

Solución de problemas comunes al usar Terraform en Azure

Pasos siguientes