チュートリアル:Terraform を使用して Azure でハブ仮想ネットワーク アプライアンスを作成するTutorial: Create a hub virtual network appliance in Azure using Terraform

VPN デバイスは、オンプレミス ネットワークとの外部接続を実現するデバイスです。A VPN device is a device that provides external connectivity to an on-premises network. VPN デバイスには、ハードウェア デバイスとソフトウェア ソリューションとがあります。The VPN device may be a hardware device or a software solution. ソフトウェア ソリューションとしては、たとえば Windows Server 2012 のルーティングとリモート アクセス サービス (RRAS) があります。One example of a software solution is Routing and Remote Access Service (RRAS) in Windows Server 2012. VPN アプライアンスの詳細については、サイト間 VPN Gateway 接続の VPN デバイスに関するページを参照してください。For more information about VPN appliances, see About VPN devices for Site-to-Site VPN Gateway connections.

Azure では、さまざまなネットワーク仮想アプライアンスがサポートされ、その豊富な選択肢から選ぶことができます。Azure supports a broad variety of network virtual appliances from which to select. このチュートリアルでは、Ubuntu イメージを使用しています。For this tutorial, an Ubuntu image is used. Azure でサポートされる幅広いデバイス ソリューションについて詳しくは、Network Appliances のホーム ページを参照してください。To learn more about the broad variety of device solutions supported in Azure, see the Network Appliances home page.

このチュートリアルに含まれるタスクは次のとおりです。This tutorial covers the following tasks:

  • HCL (HashiCorp 言語) を使用して、ハブ スポーク トポロジでハブ VNet を実装するUse HCL (HashiCorp Language) to implement the Hub VNet in hub-spoke topology
  • Terraform を使用して、アプライアンスとして機能するハブ ネットワーク仮想マシンを作成するUse Terraform to create Hub Network Virtual Machine which acts as appliance
  • Terraform と CustomScript の拡張機能を使用してルートを有効にするUse Terraform to enable routes using CustomScript extensions
  • Terraform を使用してハブ スポーク ゲートウェイのルート テーブルを作成するUse Terraform to create Hub and Spoke gateway route tables

前提条件Prerequisites

  1. Azure で Terraform を使用して、ハブ スポーク ハイブリッド ネットワーク トポロジを作成しますCreate a hub and spoke hybrid network topology with Terraform in Azure.
  2. Azure で Terraform を使用して、オンプレミス仮想ネットワークを作成しますCreate on-premises virtual network with Terraform in Azure.
  3. Azure で Terraform を使用して、ハブ仮想ネットワークを作成しますCreate a hub virtual network with Terraform in Azure.

ディレクトリ構造を作成するCreate the directory structure

  1. Azure ポータルにアクセスします。Browse to the Azure portal.

  2. Azure Cloud Shell を開きます。Open Azure Cloud Shell. 前に環境を選択しなかった場合、環境として Bash を選択します。If you didn't select an environment previously, select Bash as your environment.

    Cloud Shell のプロンプト

  3. ディレクトリを clouddrive ディレクトリに変更します。Change directories to the clouddrive directory.

    cd clouddrive
    
  4. 新しいディレクトリに移動します。Change directories to the new directory:

    cd hub-spoke
    

ハブ ネットワーク アプライアンスを宣言するDeclare the hub network appliance

オンプレミスの仮想ネットワークを宣言する Terraform 構成ファイルを作成します。Create the Terraform configuration file that declares an on-premises virtual network.

  1. Cloud Shell で、hub-nva.tf という名前の新しいファイルを作成します。In Cloud Shell, create a new file named hub-nva.tf.

    code hub-nva.tf
    
  2. 以下のコードをエディターに貼り付けます。Paste the following code into the editor:

    locals {
      prefix-hub-nva         = "hub-nva"
      hub-nva-location       = "CentralUS"
      hub-nva-resource-group = "hub-nva-rg"
    }
    
    resource "azurerm_resource_group" "hub-nva-rg" {
      name     = "${local.prefix-hub-nva}-rg"
      location = local.hub-nva-location
    
      tags {
        environment = local.prefix-hub-nva
      }
    }
    
    resource "azurerm_network_interface" "hub-nva-nic" {
      name                 = "${local.prefix-hub-nva}-nic"
      location             = azurerm_resource_group.hub-nva-rg.location
      resource_group_name  = azurerm_resource_group.hub-nva-rg.name
      enable_ip_forwarding = true
    
      ip_configuration {
        name                          = local.prefix-hub-nva
        subnet_id                     = azurerm_subnet.hub-dmz.id
        private_ip_address_allocation = "Static"
        private_ip_address            = "10.0.0.36"
      }
    
      tags {
        environment = local.prefix-hub-nva
      }
    }
    
    resource "azurerm_virtual_machine" "hub-nva-vm" {
      name                  = "${local.prefix-hub-nva}-vm"
      location              = azurerm_resource_group.hub-nva-rg.location
      resource_group_name   = azurerm_resource_group.hub-nva-rg.name
      network_interface_ids = [azurerm_network_interface.hub-nva-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-nva}-vm"
        admin_username = var.username
        admin_password = var.password
      }
    
      os_profile_linux_config {
        disable_password_authentication = false
      }
    
      tags {
        environment = local.prefix-hub-nva
      }
    }
    
    resource "azurerm_virtual_machine_extension" "enable-routes" {
      name                 = "enable-iptables-routes"
      location             = azurerm_resource_group.hub-nva-rg.location
      resource_group_name  = azurerm_resource_group.hub-nva-rg.name
      virtual_machine_name = azurerm_virtual_machine.hub-nva-vm.name
      publisher            = "Microsoft.Azure.Extensions"
      type                 = "CustomScript"
      type_handler_version = "2.0"
    
      settings = <<SETTINGS
        {
            "fileUris": [
            "https://raw.githubusercontent.com/mspnp/reference-architectures/master/scripts/linux/enable-ip-forwarding.sh"
            ],
            "commandToExecute": "bash enable-ip-forwarding.sh"
        }
    SETTINGS
    
      tags {
        environment = local.prefix-hub-nva
      }
    }
    
    resource "azurerm_route_table" "hub-gateway-rt" {
      name                          = "hub-gateway-rt"
      location                      = azurerm_resource_group.hub-nva-rg.location
      resource_group_name           = azurerm_resource_group.hub-nva-rg.name
      disable_bgp_route_propagation = false
    
      route {
        name           = "toHub"
        address_prefix = "10.0.0.0/16"
        next_hop_type  = "VnetLocal"
      }
    
      route {
        name                   = "toSpoke1"
        address_prefix         = "10.1.0.0/16"
        next_hop_type          = "VirtualAppliance"
        next_hop_in_ip_address = "10.0.0.36"
      }
    
      route {
        name                   = "toSpoke2"
        address_prefix         = "10.2.0.0/16"
        next_hop_type          = "VirtualAppliance"
        next_hop_in_ip_address = "10.0.0.36"
      }
    
      tags {
        environment = local.prefix-hub-nva
      }
    }
    
    resource "azurerm_subnet_route_table_association" "hub-gateway-rt-hub-vnet-gateway-subnet" {
      subnet_id      = azurerm_subnet.hub-gateway-subnet.id
      route_table_id = azurerm_route_table.hub-gateway-rt.id
      depends_on = ["azurerm_subnet.hub-gateway-subnet"]
    }
    
    resource "azurerm_route_table" "spoke1-rt" {
      name                          = "spoke1-rt"
      location                      = azurerm_resource_group.hub-nva-rg.location
      resource_group_name           = azurerm_resource_group.hub-nva-rg.name
      disable_bgp_route_propagation = false
    
      route {
        name                   = "toSpoke2"
        address_prefix         = "10.2.0.0/16"
        next_hop_type          = "VirtualAppliance"
        next_hop_in_ip_address = "10.0.0.36"
      }
    
      route {
        name           = "default"
        address_prefix = "0.0.0.0/0"
        next_hop_type  = "vnetlocal"
      }
    
      tags {
        environment = local.prefix-hub-nva
      }
    }
    
    resource "azurerm_subnet_route_table_association" "spoke1-rt-spoke1-vnet-mgmt" {
      subnet_id      = azurerm_subnet.spoke1-mgmt.id
      route_table_id = azurerm_route_table.spoke1-rt.id
      depends_on = ["azurerm_subnet.spoke1-mgmt"]
    }
    
    resource "azurerm_subnet_route_table_association" "spoke1-rt-spoke1-vnet-workload" {
      subnet_id      = azurerm_subnet.spoke1-workload.id
      route_table_id = azurerm_route_table.spoke1-rt.id
      depends_on = ["azurerm_subnet.spoke1-workload"]
    }
    
    resource "azurerm_route_table" "spoke2-rt" {
      name                          = "spoke2-rt"
      location                      = azurerm_resource_group.hub-nva-rg.location
      resource_group_name           = azurerm_resource_group.hub-nva-rg.name
      disable_bgp_route_propagation = false
    
      route {
        name                   = "toSpoke1"
        address_prefix         = "10.1.0.0/16"
        next_hop_in_ip_address = "10.0.0.36"
        next_hop_type          = "VirtualAppliance"
      }
    
      route {
        name           = "default"
        address_prefix = "0.0.0.0/0"
        next_hop_type  = "vnetlocal"
      }
    
      tags {
        environment = local.prefix-hub-nva
      }
    }
    
    resource "azurerm_subnet_route_table_association" "spoke2-rt-spoke2-vnet-mgmt" {
      subnet_id      = azurerm_subnet.spoke2-mgmt.id
      route_table_id = azurerm_route_table.spoke2-rt.id
      depends_on = ["azurerm_subnet.spoke2-mgmt"]
    }
    
    resource "azurerm_subnet_route_table_association" "spoke2-rt-spoke2-vnet-workload" {
      subnet_id      = azurerm_subnet.spoke2-workload.id
      route_table_id = azurerm_route_table.spoke2-rt.id
      depends_on = ["azurerm_subnet.spoke2-workload"]
    }
    
    
  3. ファイルを保存し、エディターを終了します。Save the file and exit the editor.

次のステップNext steps