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!