Переход с Брандмауэра Azure уровня "Стандартный" на уровень"Премиум" с помощью Terraform

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

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

Вы узнаете, как выполнять следующие задачи:

  • Развертывание стандартного Брандмауэра Azure с классическими правилами с помощью Terraform
  • Импорт правил брандмауэра в политику брандмауэра уровня "Премиум"
  • Изменение файла конфигурации Terraform для переноса брандмауэра

1. Настройка среды

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

  1. Создайте каталог для тестирования примера кода Terraform и сделайте его текущим каталогом.

  2. Создайте файл с именем main.tf и вставьте следующий код:

    resource "random_pet" "prefix" {
      prefix = var.prefix
      length = 1
    }
    resource "azurerm_resource_group" "rg" {
      name     = "${random_pet.prefix.id}-rg"
      location = var.resource_group_location
    }
    
    resource "azurerm_virtual_network" "vnet" {
      name                = "${random_pet.prefix.id}-vnet"
      address_space       = ["10.0.0.0/16"]
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
    }
    
    resource "azurerm_subnet" "subnet" {
      name                 = "AzureFirewallSubnet"
      resource_group_name  = azurerm_resource_group.rg.name
      virtual_network_name = azurerm_virtual_network.vnet.name
      address_prefixes     = ["10.0.1.0/24"]
    }
    
    resource "azurerm_public_ip" "pip" {
      name                = "${random_pet.prefix.id}-pip"
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
      allocation_method   = "Static"
      sku                 = "Standard"
    }
    
    resource "azurerm_firewall" "main" {
      name                = "${random_pet.prefix.id}-fw"
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
      sku_name            = "AZFW_VNet"
      sku_tier            = "Standard"
    
      ip_configuration {
        name                 = "configuration"
        subnet_id            = azurerm_subnet.subnet.id
        public_ip_address_id = azurerm_public_ip.pip.id
      }
    }
    
    resource "azurerm_firewall_application_rule_collection" "app-rc" {
      name                = "${random_pet.prefix.id}-app-rc"
      azure_firewall_name = azurerm_firewall.main.name
      resource_group_name = azurerm_resource_group.rg.name
      priority            = 100
      action              = "Allow"
    
      rule {
        name = "testrule"
    
        source_addresses = [
          "10.0.0.0/16",
        ]
    
        target_fqdns = [
          "*.google.com",
        ]
    
        protocol {
          port = "443"
          type = "Https"
        }
      }
    }
    
    resource "azurerm_firewall_network_rule_collection" "net-rc" {
      name                = "${random_pet.prefix.id}-net-rc"
      azure_firewall_name = azurerm_firewall.main.name
      resource_group_name = azurerm_resource_group.rg.name
      priority            = 100
      action              = "Allow"
    
      rule {
        name = "dnsrule"
    
        source_addresses = [
          "10.0.0.0/16",
        ]
    
        destination_ports = [
          "53",
        ]
    
        destination_addresses = [
          "8.8.8.8",
          "8.8.4.4",
        ]
    
        protocols = [
          "TCP",
          "UDP",
        ]
      }
    }
    
  3. Создайте файл с именем variables.tf и вставьте следующий код:

    variable "resource_group_location" {
      type        = string
      default     = "eastus"
      description = "Location of the resource group."
    }
    
    variable "prefix" {
      type        = string
      default     = "firewall-standard"
      description = "Prefix of the resource name"
    }
    

3. Инициализация Terraform

Запустите terraform init, чтобы инициализировать развертывание Terraform. Эта команда скачивает поставщик Azure, необходимый для управления ресурсами Azure.

terraform init -upgrade

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

  • Параметр -upgrade обновляет необходимые подключаемые модули поставщика до последней версии, которая соответствует ограничениям версии конфигурации.

4. Создание плана выполнения Terraform

Чтобы создать план выполнения, выполните terraform plan.

terraform plan -out main.tfplan

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

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

5. Применение плана выполнения Terraform

Выполните terraform apply, чтобы применить план выполнения к вашей облачной инфраструктуре.

terraform apply main.tfplan

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

  • В примере terraform apply команды предполагается, что вы ранее выполнили.terraform plan -out main.tfplan
  • Если для параметра -out указано другое имя файла, используйте то же имя в вызове к terraform apply.
  • Если вы не использовали параметр -out, вызовите terraform apply без параметров.

6. Импортируйте правила брандмауэра в политику брандмауэра уровня "Премиум".

Теперь у вас есть стандартный брандмауэр с классическими правилами. Создайте политику брандмауэра уровня "Премиум" и импортируйте правила из брандмауэра.

  1. На портале Azure выберите Создать ресурс.
  2. Найдите политику брандмауэра и выберите ее.
  3. Нажмите кнопку создания.
  4. Для параметра "Группа ресурсов" выберите test-resources.
  5. В поле "Имя" введите prem-pol.
  6. В поле "Регион" выберите Восточная часть США.
  7. В качестве уровня политики выберите Премиум.
  8. Выберите Далее: Параметры DNS и продолжайте, пока не откроется страница "Правила".
  9. На странице правила выберите Импорт правил из Брандмауэра Azure.
  10. Выберите testfirewall, а затем нажмите кнопку Импорт.
  11. Выберите Review + create (Просмотреть и создать).
  12. Нажмите кнопку создания.

7. Измените файл конфигурации Terraform для переноса брандмауэра.

Откройте файл main.tf и внесите в него следующие изменения.

  1. Добавьте следующий раздел data:

    data "azurerm_firewall_policy" "prem-pol" {
      name                 = "prem-pol"
      resource_group_name  = azurerm_resource_group.rg.name
    }
    
  2. Измените ресурс брандмауэра:

     resource "azurerm_firewall" "fw" {
         name                = "testfirewall"
         location            = azurerm_resource_group.rg.location
         resource_group_name = azurerm_resource_group.rg.name
         firewall_policy_id  = data.azurerm_firewall_policy.prem-pol.id
         sku_tier            = "Premium"
    
     ip_configuration {
         name                 = "configuration"
         subnet_id            = azurerm_subnet.subnet.id
         public_ip_address_id = azurerm_public_ip.pip.id
     }
    }
    
  3. Удалите коллекции классических правил:

    resource "azurerm_firewall_application_rule_collection" "app-rc" {
      name                = "apptestcollection"
      azure_firewall_name = azurerm_firewall.fw.name
      resource_group_name = azurerm_resource_group.rg.name
      priority            = 100
      action              = "Allow"
    
      rule {
        name = "testrule"
    
        source_addresses = [
          "10.0.0.0/16",
        ]
    
        target_fqdns = [
          "*.google.com",
        ]
    
        protocol {
          port = "443"
          type = "Https"
        }
      }
    }
    
    resource "azurerm_firewall_network_rule_collection" "net-rc" {
      name                = "nettestcollection"
      azure_firewall_name = azurerm_firewall.fw.name
      resource_group_name = azurerm_resource_group.rg.name
      priority            = 100
      action              = "Allow"
    
      rule {
        name = "dnsrule"
    
        source_addresses = [
          "10.0.0.0/16",
        ]
    
        destination_ports = [
          "53",
        ]
    
        destination_addresses = [
          "8.8.8.8",
          "8.8.4.4",
        ]
    
        protocols = [
          "TCP",
          "UDP",
        ]
      }
    }
    

8. Примените измененный план выполнения Terraform.

  1. terraform plan -out main.tfplan
  2. terraform apply main.tfplan

9. Проверьте результаты.

  1. Выберите группу ресурсов test-resources.
  2. Выберите ресурс testfirewall.
  3. Убедитесь, что номер SKU брандмауэра — Премиум.
  4. Убедитесь, что брандмауэр использует политику брандмауэра prem-pol. Брандмауэр Azure уровня

10. Очистите ресурсы.

Если вам больше не нужны ресурсы, созданные через 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

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