Краткое руководство. Прямой веб-трафик с Шлюз приложений Azure — Terraform

В этом кратком руководстве вы используете Terraform для создания Шлюз приложений Azure. Затем вы проверите шлюз приложений, чтобы убедиться, что он правильно работает.

Terraform поддерживает определение, предварительный просмотр и развертывание облачной инфраструктуры. С помощью Terraform можно создавать файлы конфигурации с применением синтаксиса HCL. Синтаксис HCL позволяет указать поставщика облачных служб, например Azure, и элементы, составляющие облачную инфраструктуру. После создания файлов конфигурации создается план выполнения, который позволяет предварительно просматривать изменения инфраструктуры до их развертывания. После проверки изменений примените план выполнения для развертывания инфраструктуры.

Концептуальная схема настройки быстрого запуска.

Необходимые компоненты

Реализация кода Terraform

Примечание.

Пример кода для этой статьи находится в репозитории Azure Terraform GitHub. Вы можете просмотреть файл журнала, содержащий результаты теста из текущих и предыдущих версий Terraform.

См. другие статьи и примеры кода, в которых показано, как использовать Terraform для управления ресурсами Azure.

  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
    
    }
    
  4. Создайте файл с именем 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"
    }
    
  5. Создайте файл с именем 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 plan.

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-адрес в адресную строку веб-браузера. Обновите браузер, чтобы просмотреть имя виртуальной машины. Допустимый ответ проверяет успешное создание шлюза приложений и может подключаться к серверной части.

Очистка ресурсов

Если вам больше не нужны ресурсы, созданные через Terraform, выполните следующие действия:

  1. Выполните команду terraform plan и укажите флаг destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Основные моменты:

    • Команда terraform plan создает план выполнения, но не выполняет его. Вместо этого она определяет, какие действия необходимы для создания конфигурации, заданной в файлах конфигурации. Этот шаблон позволяет проверить, соответствует ли план выполнения вашим ожиданиям, прежде чем вы начнете вносить изменения в фактические ресурсы.
    • Необязательный параметр -out позволяет указать выходной файл для плана. Использование параметра -out гарантирует, что проверяемый план полностью соответствует применяемому.
  2. Выполните команду terraform apply, чтобы применить план выполнения.

    terraform apply main.destroy.tfplan
    

Устранение неполадок с Terraform в Azure

Устранение распространенных проблем при использовании Terraform в Azure

Следующие шаги