Partilhar via


Início Rápido: Criar instância com o Terraform - Azure SQL Managed Instance

Artigo testado com as seguintes versões de fornecedor do Terraform e terraform:

Este artigo mostra como implementar um Azure SQL Managed Instance numa rede virtual (vNet) e numa sub-rede associada a uma tabela de rotas e a um grupo de segurança de rede com o Terraform.

O Terraform permite a definição, pré-visualização e implementação da infraestrutura de cloud. Com o Terraform, pode criar ficheiros de configuração com a sintaxe HCL. A sintaxe HCL permite-lhe especificar o fornecedor de cloud ( como o Azure) e os elementos que compõem a sua infraestrutura de cloud. Depois de criar os seus ficheiros de configuração, cria um plano de execução que lhe permite pré-visualizar as alterações da infraestrutura antes de serem implementados. Depois de verificar as alterações, aplique o plano de execução para implementar a infraestrutura.

Neste artigo, vai aprender a:

  • Criar todos os serviços de suporte para SQL Managed Instance a executar
  • Implementar SQL Managed Instance

Pré-requisitos

  • Subscrição do Azure: se não tem uma subscrição do Azure, crie uma conta gratuita antes de começar.

Implementar o código terraform

  1. Crie um diretório para testar e executar o código terraform de exemplo e torná-lo no diretório atual.

  2. Crie um ficheiro com o nome 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 ficheiro com o nome 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 ficheiro com o nome 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 o Terraform

Execute o init do terraform para inicializar a implementação do Terraform. Este comando transfere o fornecedor do Azure necessário para gerir os recursos do Azure.

terraform init -upgrade

Pontos-chave:

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

Criar um plano de execução do Terraform

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

terraform plan -out main.tfplan

Pontos-chave:

  • O terraform plan comando cria um plano de execução, mas não o executa. Em vez disso, determina que ações são necessárias para criar a configuração especificada nos seus ficheiros de configuração. Este padrão permite-lhe verificar se o plano de execução corresponde às suas expetativas antes de efetuar alterações aos recursos reais.
  • O parâmetro opcional -out permite-lhe especificar um ficheiro de saída para o plano. A utilização do -out parâmetro garante que o plano que reviu é exatamente o que é aplicado.
  • Para ler mais sobre os planos de execução persistentes e a segurança, consulte a secção de aviso de segurança.

Aplicar um plano de execução do Terraform

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

terraform apply main.tfplan

Pontos-chave:

  • O comando de exemplo terraform apply pressupõe que executou terraform plan -out main.tfplananteriormente .
  • Se tiver especificado um nome de ficheiro diferente para o -out parâmetro , utilize o mesmo nome de ficheiro na chamada para terraform apply.
  • Se não utilizou o -out parâmetro , chame terraform apply sem parâmetros.

Verificar os resultados

Para verificar os resultados no portal do Azure, navegue para o novo grupo de recursos. A nova instância estará no novo grupo de recursos depois de ter sido implementada. Para ver o progresso da implementação, mantenha o PowerShell aberto ou navegue para o portal do Azure, procure SQL Managed Instance e, em seguida, filtre todas as instâncias por estado).

Limpar os recursos

Quando já não precisar dos recursos criados através do Terraform, siga os seguintes passos:

  1. Execute o plano terraform e especifique o destroy sinalizador.

    terraform plan -destroy -out main.destroy.tfplan
    

    Pontos-chave:

    • O terraform plan comando cria um plano de execução, mas não o executa. Em vez disso, determina que ações são necessárias para criar a configuração especificada nos seus ficheiros de configuração. Este padrão permite-lhe verificar se o plano de execução corresponde às suas expetativas antes de efetuar alterações aos recursos reais.
    • O parâmetro opcional -out permite-lhe especificar um ficheiro de saída para o plano. A utilização do -out parâmetro garante que o plano que reviu é exatamente o que é aplicado.
    • Para ler mais sobre os planos de execução persistentes e a segurança, consulte a secção de aviso de segurança.
  2. Execute terraform apply para aplicar o plano de execução.

    terraform apply main.destroy.tfplan
    

Resolver problemas do Terraform no Azure

Resolver problemas comuns ao utilizar o Terraform no Azure

Passos seguintes