共用方式為


快速入門:使用 Azure 應用程式閘道引導 Web 流量 - Terraform

在本快速入門中,您會使用 Terraform 來建立 Azure 應用程式閘道。 然後,您會測試應用程式閘道,以確定其運作正常。 此範例會使用標準 v2 SKU。

Terraform 允許對雲端基礎結構進行定義、預覽和部署。 使用 Terraform,您可以使用 HCL 語法建立組態檔。 HCL 語法可讓您指定雲端提供者,例如 Azure,以及構成雲端基礎結構的專案。 建立組態檔之後,您會建立一個 執行計劃 ,讓您在部署基礎結構變更之前先預覽這些變更。 驗證變更之後,您會套用執行計劃來部署基礎結構。

快速入門設定的概念圖。

備註

應用程式閘道前端現在支援雙堆疊IP位址(預覽)。 您現在可以建立最多四個前端 IP 位址,包括兩個 IPv4 位址 (公用和私人) 與兩個 IPv6 位址 (公用和私人)。

先決條件

實作 Terraform 程式碼

  1. 建立目錄,然後在目錄中測試範例 Terraform 程式碼,並將其設為目前的目錄。

  2. 建立名為 providers.tf 的檔案,並插入下列程序代碼:

    terraform {
      required_version = ">=1.2"
      
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~> 3.0"
        }
        random = {
          source = "hashicorp/random"
          version = "~> 3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. 建立名為 main.tf 的檔案,並插入下列程序代碼:

    resource "random_string" "rg" {
      length  = 8
      upper   = false
      special = false
    }
    
    resource "azurerm_resource_group" "rg" {
      name     = "101-application-gateway-${random_string.rg.result}"
      location = "eastus"
    }
    
    resource "azurerm_virtual_network" "vnet" {
      name                = "myVNet"
      resource_group_name = azurerm_resource_group.rg.name
      location            = azurerm_resource_group.rg.location
      address_space       = ["10.21.0.0/16"]
    }
    
    resource "azurerm_subnet" "frontend" {
      name                 = "myAGSubnet"
      resource_group_name  = azurerm_resource_group.rg.name
      virtual_network_name = azurerm_virtual_network.vnet.name
      address_prefixes     = ["10.21.0.0/24"]
    }
    
    resource "azurerm_subnet" "backend" {
      name                 = "myBackendSubnet"
      resource_group_name  = azurerm_resource_group.rg.name
      virtual_network_name = azurerm_virtual_network.vnet.name
      address_prefixes     = ["10.21.1.0/24"]
    }
    
    resource "azurerm_public_ip" "pip" {
      name                = "myAGPublicIPAddress"
      resource_group_name = azurerm_resource_group.rg.name
      location            = azurerm_resource_group.rg.location
      allocation_method   = "Static"
      sku                 = "Standard"
    }
    
    
    resource "azurerm_application_gateway" "main" {
      name                = "myAppGateway"
      resource_group_name = azurerm_resource_group.rg.name
      location            = azurerm_resource_group.rg.location
    
      sku {
        name     = "Standard_v2"
        tier     = "Standard_v2"
        capacity = 2
      }
    
      gateway_ip_configuration {
        name      = "my-gateway-ip-configuration"
        subnet_id = azurerm_subnet.frontend.id
      }
    
      frontend_port {
        name = var.frontend_port_name
        port = 80
      }
    
      frontend_ip_configuration {
        name                 = var.frontend_ip_configuration_name
        public_ip_address_id = azurerm_public_ip.pip.id
      }
    
      backend_address_pool {
        name = var.backend_address_pool_name
      }
    
      backend_http_settings {
        name                  = var.http_setting_name
        cookie_based_affinity = "Disabled"
        port                  = 80
        protocol              = "Http"
        request_timeout       = 60
      }
    
      http_listener {
        name                           = var.listener_name
        frontend_ip_configuration_name = var.frontend_ip_configuration_name
        frontend_port_name             = var.frontend_port_name
        protocol                       = "Http"
      }
    
      request_routing_rule {
        name                       = var.request_routing_rule_name
        rule_type                  = "Basic"
        http_listener_name         = var.listener_name
        backend_address_pool_name  = var.backend_address_pool_name
        backend_http_settings_name = var.http_setting_name
        priority                   = 1
      }
    }
    
    resource "azurerm_network_interface" "nic" {
      count               = 2
      name                = "nic-${count.index+1}"
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
    
      ip_configuration {
        name                          = "nic-ipconfig-${count.index+1}"
        subnet_id                     = azurerm_subnet.backend.id
        private_ip_address_allocation = "Dynamic"
      }
    }
    
    resource "azurerm_network_interface_application_gateway_backend_address_pool_association" "nic-assoc" {
      count                   = 2
      network_interface_id    = azurerm_network_interface.nic[count.index].id
      ip_configuration_name   = "nic-ipconfig-${count.index+1}"
      backend_address_pool_id = one(azurerm_application_gateway.main.backend_address_pool).id
    }
    
    resource "random_password" "password" {
      length  = 16
      special = true
      lower   = true
      upper   = true
      numeric = true
    }
    
    resource "azurerm_windows_virtual_machine" "vm" {
      count               = 2
      name                = "myVM${count.index+1}"
      resource_group_name = azurerm_resource_group.rg.name
      location            = azurerm_resource_group.rg.location
      size                = "Standard_DS1_v2"
      admin_username      = "azureadmin"
      admin_password      = random_password.password.result
    
      network_interface_ids = [
        azurerm_network_interface.nic[count.index].id,
      ]
    
      os_disk {
        caching              = "ReadWrite"
        storage_account_type = "Standard_LRS"
      }
    
    
      source_image_reference {
        publisher = "MicrosoftWindowsServer"
        offer     = "WindowsServer"
        sku       = "2019-Datacenter"
        version   = "latest"
      }
    }
    
    resource "azurerm_virtual_machine_extension" "vm-extensions" {
      count                = 2
      name                 = "vm${count.index+1}-ext"
      virtual_machine_id   = azurerm_windows_virtual_machine.vm[count.index].id
      publisher            = "Microsoft.Compute"
      type                 = "CustomScriptExtension"
      type_handler_version = "1.10"
    
      settings = <<SETTINGS
        {
            "commandToExecute": "powershell Add-WindowsFeature Web-Server; powershell Add-Content -Path \"C:\\inetpub\\wwwroot\\Default.htm\" -Value $($env:computername)"
        }
    SETTINGS
    
    }
    

小提示

您可以修改 Name 下的 Tierresource\applicationGateWay\main\sku 參數值,以使用不同的 SKU。 例如: Basic

  1. 建立名為 variables.tf 的檔案,並插入下列程序代碼:

    variable "backend_address_pool_name" {
        default = "myBackendPool"
    }
    
    variable "frontend_port_name" {
        default = "myFrontendPort"
    }
    
    variable "frontend_ip_configuration_name" {
        default = "myAGIPConfig"
    }
    
    variable "http_setting_name" {
        default = "myHTTPsetting"
    }
    
    variable "listener_name" {
        default = "myListener"
    }
    
    variable "request_routing_rule_name" {
        default = "myRoutingRule"
    }
    
  2. 建立名為 outputs.tf 的檔案,並插入下列程序代碼:

    output "gateway_frontend_ip" {
      value = "http://${azurerm_public_ip.pip.ip_address}"
    }
    

初始化 Terraform

執行 terraform init 來初始化 Terraform 部署。 此命令會下載管理 Azure 資源所需的 Azure 提供者。

terraform init -upgrade

重點:

  • -upgrade 參數會將必要的提供者外掛程式升級至符合組態版本條件約束的最新版本。

建立 Terraform 執行計劃

執行 terraform 計劃 以建立執行計劃。

terraform plan -out main.tfplan

重點:

  • terraform plan 命令會建立執行計劃,但不會執行它。 然而,它會決定哪些動作是必要的,以建立您組態檔中所指定的設定。 此模式可讓您在對實際資源進行任何變更之前,先確認執行計劃是否符合您的預期。
  • 選擇性 -out 參數可讓您指定計劃的輸出檔。 使用 -out 參數可確保您查看的計劃確切地被套用。

套用 Terraform 執行計劃

執行terraform apply指令將執行計劃套用至您的雲端基礎設施。

terraform apply main.tfplan

重點:

  • 範例 terraform apply 命令假設您先前已執行 terraform plan -out main.tfplan
  • 如果您為 -out 參數指定了不同的檔案名,請在呼叫 terraform apply時使用相同的檔案名。
  • 如果您未使用 -out 參數,請呼叫沒有任何參數的 terraform apply

確認結果

  1. 套用執行計畫時,Terraform 會顯示前端公用 IP 位址。 如果您已清除畫面,則可以使用下列 Terraform 命令擷取該值:

    echo $(terraform output -raw gateway_frontend_ip)
    
  2. 將公用 IP 位址貼到 Web 瀏覽器的網址列中。 重新載入瀏覽器以查看虛擬機器的名稱。 有效的響應會驗證已成功建立應用程式閘道,並可與後端連線。

清理資源

當您不再需要透過 Terraform 建立的資源時,請執行下列步驟:

  1. 執行 terraform 計劃 並指定 destroy 旗標。

    terraform plan -destroy -out main.destroy.tfplan
    

    重點:

    • terraform plan 命令會建立執行計劃,但不會執行它。 然而,它會決定哪些動作是必要的,以建立您組態檔中所指定的設定。 此模式可讓您在對實際資源進行任何變更之前,先確認執行計劃是否符合您的預期。
    • 選擇性 -out 參數可讓您指定計劃的輸出檔。 使用 -out 參數可確保您查看的計劃確切地被套用。
  2. 執行 terraform apply 來應用執行計劃。

    terraform apply main.destroy.tfplan
    

排除 Azure 上 Terraform 的故障

針對在 Azure 上使用 Terraform 時的常見問題進行疑難解答

後續步驟