Compartilhar via


Início Rápido: Criar uma instância com o Terraform – Instância Gerenciada de SQL do Azure

Artigo testado com as seguintes versões do Terraform e do provedor do Terraform:

Este artigo mostra como implantar uma Instância Gerenciada de SQL do Azure em uma VNet (rede virtual), em uma sub-rede associada a uma tabela de rotas e em um grupo de segurança de rede usando o Terraform.

O Terraform permite a definição, a visualização e a implantação da infraestrutura de nuvem. Usando o Terraform, você cria arquivos de configuração usando sintaxe de HCL. A sintaxe da HCL permite que você especifique o provedor de nuvem, como o Azure, e os elementos que compõem sua infraestrutura de nuvem. Depois de criar os arquivos de configuração, você cria um plano de execução que permite visualizar as alterações de infraestrutura antes de serem implantadas. Depois de verificar as alterações, aplique o plano de execução para implantar a infraestrutura.

Neste artigo, você aprenderá como:

  • Criar todos os serviços de suporte para a execução da Instância Gerenciada de SQL
  • Implantar a Instância Gerenciada de SQL

Pré-requisitos

  • Assinatura do Azure: Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.

Implementar o código do Terraform

  1. Crie um diretório no qual testar e executar o código de exemplo do Terraform e faça dele o diretório atual.

  2. Crie um arquivo chamado providers.tf e insira o seguinte código:

    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. Crie um arquivo chamado main.tf e insira o seguinte código:

    # 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. Crie um arquivo chamado variables.tf e insira o seguinte código:

    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
    }
    

Inicializar Terraform

Execute terraform init para inicializar a implantação do Terraform. Esse comando baixa o provedor do Azure necessário para gerenciar seus recursos do Azure.

terraform init -upgrade

Pontos principais:

  • O parâmetro -upgrade atualiza os plug-ins do provedor necessários para a versão mais recente que esteja em conformidade com as restrições de versão da configuração.

Criar um plano de execução Terraform

Execute o comando terraform plan para criar um plano de execução.

terraform plan -out main.tfplan

Pontos principais:

  • O comando terraform plan cria um plano de execução, mas não o executa. Em vez disso, ele determina quais ações são necessárias para criar a configuração especificada em seus arquivos de configuração. Esse padrão permite que você verifique se o plano de execução corresponde às suas expectativas antes de fazer qualquer alteração nos recursos reais.
  • O parâmetro opcional -out permite que você especifique um arquivo de saída para o plano. Usar o parâmetro -out garante que o plano que você examinou seja exatamente o que é aplicado.

Aplicar um plano de execução do Terraform

Execute terraform apply para aplicar o plano de execução à sua infraestrutura de nuvem.

terraform apply main.tfplan

Pontos principais:

  • O exemplo de comando do terraform apply pressupõe que você executou o terraform plan -out main.tfplan anteriormente.
  • Se você especificou um nome de arquivo diferente para o parâmetro -out, use esse mesmo nome de arquivo na chamada para terraform apply.
  • Se você não usou o parâmetro -out, chame terraform apply sem nenhum parâmetro.

Verifique os resultados

Para verificar os resultados dentro do portal do Azure, navegue até o novo grupo de recursos. A nova instância estará no novo grupo de recursos depois de ter sido implantada. Para ver o progresso da implantação, mantenha o PowerShell aberto ou acesse o portal do Azure, pesquise “Instância Gerenciada de SQL” e filtre todas as instâncias por status.

Limpar os recursos

Quando você não precisar mais dos recursos criados por meio o Terraform, execute as seguintes etapas:

  1. Execute terraform plan e especifique o sinalizador destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Pontos principais:

    • O comando terraform plan cria um plano de execução, mas não o executa. Em vez disso, ele determina quais ações são necessárias para criar a configuração especificada em seus arquivos de configuração. Esse padrão permite que você verifique se o plano de execução corresponde às suas expectativas antes de fazer qualquer alteração nos recursos reais.
    • O parâmetro opcional -out permite que você especifique um arquivo de saída para o plano. Usar o parâmetro -out garante que o plano que você examinou seja exatamente o que é aplicado.
  2. Execute a aplicação do Terraform para aplicar o plano de execução.

    terraform apply main.destroy.tfplan
    

Solucionar problemas do Terraform no Azure

Solucionar problemas comuns ao usar o Terraform no Azure

Próximas etapas