[Série][DBRE] Pipeline de IaC para provisionamento de bancos de dados no Azure – Criando Módulo Terraform para Azure Database for MySQL

Fala meu poves!

De volta com essa série maravilinda para mais um episódio de criação de módulo Terraform para entregar um banco de dados MySQL desta vez, vocês verão que a estrutura é muito parecida com o módulo de PostgreSQL, mudando apenas algumas coisas relativas a própria engine do MySQL.

Para quem ainda não viu os posts anteriores sobre o projeto e a criação dos repositórios git, aconselho ver os seguintes posts:

Crie o repositório pipeline_iac_azure_db_mysql e dentro dele crie os seguintes arquivos:

1 – Vamos criar o arquivo rg.tf que será responsável por provisionar nosso resource group:

resource "azurerm_resource_group" "rg" {
  name     = var.rg
  location = var.regiao
}

2 – Agora crie o arquivo variables.tf aonde iremos declarar nossas variáveis dinâmicas que serão utilizadas posteriormente para criar os recursos de bancos de dados e o próprio resource group:

variable "rg" {
    description = "Resource Group que será criado|utilizado na criação dos recursos de banco de dados"
}

variable "regiao" {
    description = "Região ao qual os recursos serão criados"
}

variable "ambiente" {
    type = map
    default = {
        d = "dev",
        h = "hml",
        p = "prd"
    }
}

variable "env" {
    default = "d"

    validation {
        condition = contains(["d","h","p"],var.env)
        error_message = "Argument 'env' must be either 'd' (dev), 'h' (hml) or 'p' (prd)"
    }
}

variable "nome_sistema" {
    description = "Nome do sistema ao qual os recursos serão destinados"
}

variable "storage_account_tier" {
    description = "Tipo de Storage Account que pode ser Standard ou Premium. Por padrão será Standard"
    default = "Standard"
}

variable "storage_account_repl_type" {
    description = "Tipo de Replicação de Storage Account que pode ser LRS, GRS, RAGRS, ZRS, GZRS and RAGZRS. Por padrão será LRS"
    default = "LRS"
}

variable "admin_user_login" {
    description = "Usuario para logar no servidor e banco de dados"
    default = "admindb"
}

variable "admin_user_passwd" {
    description = "Senha do usuario para logar no servidor e banco de dados"
    sensitive = true
}

variable "db_collation" {
    description = "Collation do banco de dados."
    default = "utf8_unicode_ci"
}

variable "db_charset" {
    description = "Conjunto de caracteres do banco de dados. Por padrão será UTF8"
    default = "utf8"
}

variable "db_storage_max_size_mb" {
    description = "Tamanho máximo do banco de dados em Megabytes. Por padrão 5120MB"
    default = 5120
}

variable "db_storage_auto_grow" {
    description = "Habilita crescimento automatico de storage."
    default = false
}

variable "tamanho_servidor" {
    description = "Especifica o tipo de perfil do servidor de banco de dados que será criado. https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/mysql_server"
    default = {
        d = "B_Gen4_1",
        h = "B_Gen5_2",
        p = "GP_Gen5_8"
    }
}

variable "versao_mysql" {
    description = "Versão do MySQL que será utilizado, por padrão será a mais recente disponivel neste momento: 8.0"
    default = "8.0"
}

variable "dias_retencao_backup" {
    description = "Quantidade de dias que o backup ficará disponível para ser restaurado. Por padrão 7 dias"
    default = 7
}

variable "reundancia_regiao_backup" {
    description = "Ativa a redundancia de backup para outras região para casos de DR."
    default = false
}

3 – Depois disso vamos criar o arquivo locals.tf onde algumas variáveis serão trabalhadas com base em tomadas de decisão, principalmente focada no ambiente produtivo, aonde precisamos ter ambientes mais robustos e redundantes:

locals {
    ambiente                = lookup(var.ambiente,var.env)
    server_sku_name         = lookup(var.tamanho_servidor,var.env)
    reundancia_regiao_backup = var.env == "p" ? true : var.reundancia_regiao_backup
    db_storage_auto_grow    = var.env == "p" ? true : var.db_storage_auto_grow

    tags = {
        env         = var.env
        ambiente    = local.ambiente
        sistema     = var.nome_sistema
    }
}

4 – Agora vamos criar nossos recursos de bancos de dados, crie um arquivo mysql.tf aonde iremos criar um servidor de banco de dados MySQL e um banco de dados dentro deste servidor:

resource "azurerm_mysql_server" "mysql_server" {
  name                = "mysqlserver-${var.nome_sistema}-${local.ambiente}"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

  sku_name = local.server_sku_name

  storage_mb                   = var.db_storage_max_size_mb
  backup_retention_days        = var.dias_retencao_backup
  geo_redundant_backup_enabled = local.reundancia_regiao_backup
  auto_grow_enabled            = local.db_storage_auto_grow

  administrator_login          = var.admin_user_login
  administrator_login_password = var.admin_user_passwd
  version                      = var.versao_mysql
  ssl_enforcement_enabled      = true

  tags = merge(local.tags)
}

resource "azurerm_mysql_database" "mysql_database" {
  name                = "mysqldb-${var.nome_sistema}-${local.ambiente}"
  resource_group_name = azurerm_resource_group.rg.name
  server_name         = azurerm_mysql_server.mysql_server.name
  charset             = var.db_charset
  collation           = var.db_collation
}

5 – Quase acabando, vamos criar um arquivo output.tf para sabermos qual é o ID do banco de dados que estamos provisionando:

output "azure_db_mysql_id" {
    value = azurerm_mysql_database.mysql_database.id
}

6 – Por fim, vamos declarar os valores das nossas variáveis no arquivo terraform.tfvars:

rg              = "TerraformAzureMySQLdb"
regiao          = "eastus"
env             = "p"
nome_sistema    = "pagamentos"
admin_user_passwd = "P@ssW0dComPl3x"

Uma vez criado todos os componentes do nosso módulo Terraform, vamos agora executa-lo para verificar se esta tudo funcionando como esperado:

terraform init
terraform validate
terraform plan
terraform apply --auto-approve

Vamos ver como estão nossos recursos na console do Azure:

Como podemos ver na tela acima, versão do MySQL esta conforme declaramos e o sizing do servidor foi baseado na variavel env o qual escolhemos um ambiente produtivo, logo, com um sizing maior dentre outras melhorias, isso pode ser confirmado nas tags também.

Agora podemos excluir todos os recursos executando:

terraform destroy

Vamos agora mandar todo esse código para o Github? Só executar:

git add .
git commit -m "Modulo Terraform Azure Database for MySQL"
git push

É isso galera! Mais um módulo pronto, no próximo post faremos nosso ultimo módulo Terraform e depois partiremos para a construção das pipelines! Então fiquem ligades galera!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: