Início Rápido: Criar uma instância do Banco de Dados do Azure para MySQL – Servidor Flexível usando o Terraform

APLICA-SE A: Banco de Dados do Azure para MySQL - Servidor flexível

Este início rápido foi testado usando as seguintes versões de provedor Terraform e Terraform:

O Servidor Flexível do Banco de Dados do Azure para MySQL é um serviço gerenciado usado para executar, gerenciar e escalar bancos de dados MySQL altamente disponíveis na nuvem. Você pode usar um modelo do Azure Resource Manager (modelo do ARM) para provisionar o Banco de Dados do Azure para MySQL - Servidor Flexível para implantar vários servidores ou implantar vários bancos de dados em um servidor.

Este artigo mostra como usar o Terraform para implantar uma instância do Banco de Dados do Azure para MySQL – Servidor Flexível e um banco de dados em uma rede virtual.

Neste artigo, você aprenderá como:

Observação

O código de exemplo deste artigo está localizado no repositório do GitHub do Azure Terraform.

Pré-requisitos

Implementar o código do Terraform

  1. Crie um diretório que você pode usar para testar o código terraform de exemplo. Torne o diretório Terraform 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"
        }
    
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. Crie um arquivo chamado main.tf e insira o seguinte código:

    # Generate random resource group name
    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    resource "azurerm_resource_group" "rg" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    # Generate random value for the name
    resource "random_string" "name" {
      length  = 8
      lower   = true
      numeric = false
      special = false
      upper   = false
    }
    
    # Generate random value for the login password
    resource "random_password" "password" {
      length           = 8
      lower            = true
      min_lower        = 1
      min_numeric      = 1
      min_special      = 1
      min_upper        = 1
      numeric          = true
      override_special = "_"
      special          = true
      upper            = true
    }
    
    # Manages the Virtual Network
    resource "azurerm_virtual_network" "default" {
      address_space       = ["10.0.0.0/16"]
      location            = azurerm_resource_group.rg.location
      name                = "vnet-${random_string.name.result}"
      resource_group_name = azurerm_resource_group.rg.name
    }
    
    # Manages the Subnet
    resource "azurerm_subnet" "default" {
      address_prefixes     = ["10.0.2.0/24"]
      name                 = "subnet-${random_string.name.result}"
      resource_group_name  = azurerm_resource_group.rg.name
      virtual_network_name = azurerm_virtual_network.default.name
      service_endpoints    = ["Microsoft.Storage"]
    
      delegation {
        name = "fs"
    
        service_delegation {
          name = "Microsoft.DBforMySQL/flexibleServers"
          actions = [
            "Microsoft.Network/virtualNetworks/subnets/join/action",
          ]
        }
      }
    }
    
    # Enables you to manage Private DNS zones within Azure DNS
    resource "azurerm_private_dns_zone" "default" {
      name                = "${random_string.name.result}.mysql.database.azure.com"
      resource_group_name = azurerm_resource_group.rg.name
    }
    
    # Enables you to manage Private DNS zone Virtual Network Links
    resource "azurerm_private_dns_zone_virtual_network_link" "default" {
      name                  = "mysqlfsVnetZone${random_string.name.result}.com"
      private_dns_zone_name = azurerm_private_dns_zone.default.name
      resource_group_name   = azurerm_resource_group.rg.name
      virtual_network_id    = azurerm_virtual_network.default.id
    
      depends_on = [azurerm_subnet.default]
    }
    
    # Manages the MySQL Flexible Server
    resource "azurerm_mysql_flexible_server" "default" {
      location                     = azurerm_resource_group.rg.location
      name                         = "mysqlfs-${random_string.name.result}"
      resource_group_name          = azurerm_resource_group.rg.name
      administrator_login          = random_string.name.result
      administrator_password       = random_password.password.result
      backup_retention_days        = 7
      delegated_subnet_id          = azurerm_subnet.default.id
      geo_redundant_backup_enabled = false
      private_dns_zone_id          = azurerm_private_dns_zone.default.id
      sku_name                     = "GP_Standard_D2ds_v4"
      version                      = "8.0.21"
    
      high_availability {
        mode                      = "SameZone"
      }
      maintenance_window {
        day_of_week  = 0
        start_hour   = 8
        start_minute = 0
      }
      storage {
        iops    = 360
        size_gb = 20
      }
    
      depends_on = [azurerm_private_dns_zone_virtual_network_link.default]
    }
    
  4. Crie um arquivo chamado mysql-fs-db.tf e insira o seguinte código:

    # Manages the MySQL Flexible Server Database
    resource "azurerm_mysql_flexible_database" "main" {
      charset             = "utf8mb4"
      collation           = "utf8mb4_unicode_ci"
      name                = "mysqlfsdb_${random_string.name.result}"
      resource_group_name = azurerm_resource_group.rg.name
      server_name         = azurerm_mysql_flexible_server.default.name
    }
    
  5. Crie um arquivo chamado variables.tf e insira o seguinte código:

    variable "resource_group_location" {
      type        = string
      default     = "westeurope"
      description = "Location of the resource group."
    }
    
    variable "resource_group_name_prefix" {
      type        = string
      default     = "mysql-fs-db-rg"
      description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
    }
    
  6. Crie um arquivo chamado outputs.tf e insira o seguinte código:

    output "azurerm_mysql_flexible_server" {
      value = azurerm_mysql_flexible_server.default.name
    }
    
    output "admin_login" {
      value = azurerm_mysql_flexible_server.default.administrator_login
    }
    
    output "admin_password" {
      sensitive = true
      value     = azurerm_mysql_flexible_server.default.administrator_password
    }
    
    output "mysql_flexible_server_database_name" {
      value = azurerm_mysql_flexible_database.main.name
    }
    
    output "resource_group_name" {
      value = azurerm_resource_group.rg.name
    }
    

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

Crie um servidor flexível do Banco de Dados do Azure para MySQL usando o comando az mysql flexible-server create:

az mysql flexible-server db show \
    --resource-group <resource_group_name> \
    --server-name <azurerm_mysql_flexible_server> \
    --database-name <mysql_flexible_server_database_name>

Considere os seguintes pontos-chave:

  • Os valores de <resource_group_name>, <azurerm_mysql_flexible_server> e <mysql_flexible_server_database_name> são exibidos na saída terraform apply. Você também pode executar o comando de saída do terraform para exibir esses valores.

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

Explore como solucionar problemas comuns para usar o Terraform no Azure.

Próxima etapa