快速入门:使用 Terraform 创建实例 - Azure SQL 托管实例

文章使用以下 Terraform 和 Terraform 提供程序版本进行测试:

本文介绍如何使用 Terraform 在虚拟网络 (vNet) 和与路由表和网络安全组关联的子网中部署 Azure SQL 托管实例。

使用 Terraform 可以定义、预览和部署云基础结构。 使用 Terraform 时,请使用 HCL 语法来创建配置文件。 利用 HCL 语法,可指定 Azure 这样的云提供程序和构成云基础结构的元素。 创建配置文件后,请创建一个执行计划,利用该计划,可在部署基础结构更改之前先预览这些更改。 验证了更改后,请应用该执行计划以部署基础结构。

在本文中,学习如何:

  • 创建 SQL 托管实例可运行的所有支持服务
  • 部署 SQL 托管实例

注意

本文中的示例代码位于 Azure Terraform GitHub 存储库中。

先决条件

实现 Terraform 代码

  1. 创建用于测试和运行示例 Terraform 代码的目录,并将其设为当前目录。

  2. 创建名为 providers.tf 的文件并插入下列代码:

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = ">=3.0.0"
    }
  }
}

provider "azurerm" {
  features {}

  environment = "china"
}
  1. 创建名为 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     = var.azurerm_resource_group_name
  location = var.location
}

# Create security group
resource "azurerm_network_security_group" "example" {
  name                = var.azurerm_network_security_group_name
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
}

# Create a virtual network
resource "azurerm_virtual_network" "example" {
  name                = var.azurerm_virtual_network_name
  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                 = var.azurerm_subnet_name
  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                          = "routetable-mi-terraform"
  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
}

# Create managed instance
resource "azurerm_mssql_managed_instance" "example" {
  name                         = var.database_name
  resource_group_name          = azurerm_resource_group.example.name
  location                     = azurerm_resource_group.example.location
  subnet_id                    = azurerm_subnet.example.id
  administrator_login          = var.administrator_login
  administrator_login_password = var.administrator_login_password
  license_type                 = var.license_type
  sku_name                     = var.sku_name
  vcores                       = var.vcores
  storage_size_in_gb           = var.storage_size_in_gb
}
  1. 创建名为 variables.tf 的文件并插入下列代码:
variable "azurerm_resource_group_name" {
  type        = string
  description = "Enter the resource group name"
  default     = "terraform-database-resource-group"
}
variable "azurerm_network_security_group_name" {
  type        = string
  description = "Enter the security group name"
  default     = "mi-security-group-terraform"
}
variable "azurerm_virtual_network_name" {
  type        = string
  description = "Enter the virtual network name"
  default     = "vnet-mi-terraform"
}
variable "azurerm_subnet_name" {
  type        = string
  description = "Enter subnet name"
  default     = "subnet-mi-terraform"
}
variable "location" {
  type        = string
  description = "Enter the location where you want to deploy the resources"
  default     = "chinanorth3"
}

variable "administrator_login" {
  type        = string
  description = "Enter Administrator name for the database"
  default     = "VeryStrongAdministrator"
}

variable "administrator_login_password" {
  type        = string
  description = "Enter administrator password for the database"
  default     = "IamAVeryStrongP@ssw0rd123"
  sensitive   = true
}

variable "database_name" {
  type        = string
  description = "Enter database name"
  default     = "sql-mi-terraform"
}

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

创建 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 参数可以确保所查看的计划与所应用的计划完全一致。
  • 若要详细了解如何使执行计划和安全性持久化,请参阅安全警告一节
  1. 运行 terraform apply 以应用执行计划。

    terraform apply main.destroy.tfplan
    

Azure 上的 Terraform 故障排除

排查在 Azure 上使用 Terraform 时遇到的常见问题

后续步骤