Dela via


Snabbstart: Skapa instans med Terraform – Azure SQL Managed Instance

Artikel testad med följande Terraform- och Terraform-providerversioner:

Den här artikeln visar hur du distribuerar en Azure SQL Managed Instance i ett virtuellt nätverk (vNet) och ett undernät som är associerat med en routningstabell och en nätverkssäkerhetsgrupp med hjälp av Terraform.

Terraform möjliggör definition, förhandsversion och distribution av molninfrastruktur. Med Terraform skapar du konfigurationsfiler med hjälp av HCL-syntax. Med HCL-syntaxen kan du ange molnleverantören – till exempel Azure – och de element som utgör din molninfrastruktur. När du har skapat konfigurationsfilerna skapar du en körningsplan som gör att du kan förhandsgranska ändringarna i infrastrukturen innan de distribueras. När du har verifierat ändringarna använder du exekveringsplanen för att distribuera infrastrukturen.

I den här artikeln lär du dig att:

  • Skapa alla stödtjänster för SQL Managed Instance som ska köras på
  • Distribuera SQL Managed Instance

Förutsättningar

  • Azure-prenumeration: Om du inte har en Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.

Implementera Terraform-koden

  1. Skapa en katalog där du kan testa och köra Terraform-exempelkoden och göra den till den aktuella katalogen.

  2. Skapa en fil med namnet providers.tf och infoga följande kod:

    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. Skapa en fil med namnet main.tf och infoga följande kod:

    # 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. Skapa en fil med namnet variables.tf och infoga följande kod:

    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
    }
    

Initiera Terraform

Kör terraform init för att initiera Terraform-distributionen. Det här kommandot laddar ned den Azure-provider som krävs för att hantera dina Azure-resurser.

terraform init -upgrade

Viktiga punkter:

  • Parametern -upgrade uppgraderar nödvändiga provider-plugin-program till den senaste versionen som uppfyller konfigurationens versionsbegränsningar.

Skapa en Terraform-körningsplan

Kör terraform plan för att generera en körningsplan.

terraform plan -out main.tfplan

Viktiga punkter:

  • Kommandot terraform plan skapar en körningsplan, men kör den inte. I stället avgör den vilka åtgärder som krävs för att skapa den konfiguration som anges i konfigurationsfilerna. Med det här mönstret kan du kontrollera om utförandeplanen matchar dina förväntningar innan du gör några ändringar i verkliga resurser.
  • Med den valfria parametern -out kan du ange en utdatafil för planen. Med hjälp av parametern -out ser du till att den plan som du har granskat är exakt vad som tillämpas.

Tillämpa en Terraform-körningsplan

Kör terraform apply för att tillämpa körningsplanen på din molninfrastruktur.

terraform apply main.tfplan

Viktiga punkter:

  • Exemplet terraform apply kommandot förutsätter att du tidigare körde terraform plan -out main.tfplan.
  • Om du har angett ett annat filnamn för parametern -out använder du samma filnamn i anropet för att terraform apply.
  • Om du inte använde parametern -out anropar du terraform apply utan några parametrar.

Verifiera resultatet

Om du vill verifiera resultaten i Azure-portalen bläddrar du till den nya resursgruppen. Den nya instansen kommer att finnas i den nya resursgruppen när den har distribuerats. Om du vill se distributionsförloppet håller du PowerShell öppet eller navigerar till Azure-portalen genom att söka efter SQL Managed Instance och sedan filtrera alla instanser efter status).

Rensa resurser

Gör följande när du inte längre behöver de resurser som skapats via Terraform:

  1. Kör terraform plan och specificera flaggan destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Viktiga punkter:

    • Kommandot terraform plan skapar en körningsplan, men kör den inte. I stället avgör den vilka åtgärder som krävs för att skapa den konfiguration som anges i konfigurationsfilerna. Med det här mönstret kan du kontrollera om utförandeplanen matchar dina förväntningar innan du gör några ändringar i faktiska resurser.
    • Med den valfria parametern -out kan du ange en utdatafil för planen. Med hjälp av parametern -out ser du till att den plan som du har granskat är exakt vad som tillämpas.
  2. Kör terraform apply för att tillämpa exekveringsplanen.

    terraform apply main.destroy.tfplan
    

Felsöka Terraform i Azure

Felsöka vanliga problem när du använder Terraform i Azure

Nästa steg