Поделиться через


Краткое руководство. Создание экземпляра с помощью Terraform — Управляемый экземпляр SQL Azure

Статья протестирована со следующими версиями Terraform и провайдера Terraform:

В этой статье показано, как развернуть управляемый экземпляр Azure SQL в виртуальной сети (vNet) и подсети, связанной с таблицей маршрутов и группой безопасности сети, с помощью Terraform.

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

В этой статье описано, как:

  • Создать все вспомогательные службы для управляемого экземпляра SQL для работы на
  • Развертывание управляемого экземпляра SQL

Необходимые условия

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

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

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

    terraform {
      required_version = ">= 1.0"
    
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = ">= 3.0, < 4.0"
        }
        random = {
          source  = "hashicorp/random"
          version = ">= 3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {
        resource_group {
          prevent_deletion_if_contains_resources = false
        }
      }
    }
    
  3. Создайте файл с именем main.tf и вставьте следующий код:

    # TODO set the variables below either enter them in plain text after = sign, or change them in variables.tf
    #  (var.xyz will take the default value from variables.tf if you don't change it)
    
    # Create resource group
    resource "azurerm_resource_group" "example" {
      name     = "${random_pet.prefix.id}-rg"
      location = var.location
    }
    
    # Create security group
    resource "azurerm_network_security_group" "example" {
      name                = "${random_pet.prefix.id}-nsg"
      location            = azurerm_resource_group.example.location
      resource_group_name = azurerm_resource_group.example.name
    }
    
    # Create a virtual network
    resource "azurerm_virtual_network" "example" {
      name                = "${random_pet.prefix.id}-vnet"
      resource_group_name = azurerm_resource_group.example.name
      address_space       = ["10.0.0.0/24"]
      location            = azurerm_resource_group.example.location
    }
    
    # Create a subnet
    resource "azurerm_subnet" "example" {
      name                 = "${random_pet.prefix.id}-subnet"
      resource_group_name  = azurerm_resource_group.example.name
      virtual_network_name = azurerm_virtual_network.example.name
      address_prefixes     = ["10.0.0.0/27"]
    
      delegation {
        name = "managedinstancedelegation"
    
        service_delegation {
          name = "Microsoft.Sql/managedInstances"
          actions = [
            "Microsoft.Network/virtualNetworks/subnets/join/action",
            "Microsoft.Network/virtualNetworks/subnets/prepareNetworkPolicies/action",
            "Microsoft.Network/virtualNetworks/subnets/unprepareNetworkPolicies/action"
          ]
        }
      }
    }
    
    # Associate subnet and the security group
    resource "azurerm_subnet_network_security_group_association" "example" {
      subnet_id                 = azurerm_subnet.example.id
      network_security_group_id = azurerm_network_security_group.example.id
    }
    
    # Create a route table
    resource "azurerm_route_table" "example" {
      name                          = "${random_pet.prefix.id}-rt"
      location                      = azurerm_resource_group.example.location
      resource_group_name           = azurerm_resource_group.example.name
      disable_bgp_route_propagation = false
    }
    
    # Associate subnet and the route table
    resource "azurerm_subnet_route_table_association" "example" {
      subnet_id      = azurerm_subnet.example.id
      route_table_id = azurerm_route_table.example.id
    
      depends_on = [azurerm_subnet_network_security_group_association.example]
    }
    
    # Create managed instance
    resource "azurerm_mssql_managed_instance" "main" {
      name                         = "${random_pet.prefix.id}-mssql"
      resource_group_name          = azurerm_resource_group.example.name
      location                     = azurerm_resource_group.example.location
      subnet_id                    = azurerm_subnet.example.id
      administrator_login          = "${replace(random_pet.prefix.id, "-", "")}admin"
      administrator_login_password = random_password.password.result
      license_type                 = var.license_type
      sku_name                     = var.sku_name
      vcores                       = var.vcores
      storage_size_in_gb           = var.storage_size_in_gb
    
      depends_on = [azurerm_subnet_route_table_association.example]
    }
    
    resource "random_password" "password" {
      length      = 20
      min_lower   = 1
      min_upper   = 1
      min_numeric = 1
      min_special = 1
      special     = true
    }
    
    resource "random_pet" "prefix" {
      prefix = var.prefix
      length = 1
    }
    
  4. Создайте файл с именем variables.tf и вставьте следующий код:

    variable "prefix" {
      type        = string
      default     = "mi"
      description = "Prefix of the resource name"
    }
    
    variable "location" {
      type        = string
      description = "Enter the location where you want to deploy the resources"
      default     = "eastus"
    }
    
    variable "sku_name" {
      type        = string
      description = "Enter SKU"
      default     = "GP_Gen5"
    }
    
    variable "license_type" {
      type        = string
      description = "Enter license type"
      default     = "BasePrice"
    }
    
    variable "vcores" {
      type        = number
      description = "Enter number of vCores you want to deploy"
      default     = 8
    }
    
    variable "storage_size_in_gb" {
      type        = number
      description = "Enter storage size in GB"
      default     = 32
    }
    

Инициализация 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 без параметров.

Проверка результатов

Чтобы проверить результаты на портале Azure, перейдите к новой группе ресурсов. Новый экземпляр будет находиться в новой группе ресурсов после его развертывания. Чтобы просмотреть ход развертывания, откройте PowerShell или перейдите на портал Azure, найдите управляемый экземпляр SQL и отфильтруйте все экземпляры по состоянию).

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

Если ресурсы, созданные с помощью 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

Дальнейшие действия