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

Fala meu povo!

Mais um capitulo da nossa saga de criar módulos Terraform para no futuro construirmos nossa pipeline de entrega de bancos de dados no Azure DevOps. Desta vez vamos construir um módulo Terraform que entrega um banco de dados Azure Database for PostgreSQL. Vamos lá!

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_postgresql 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 = "English_United States.1252"
}

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/postgresql_server"
    default = {
        d = "B_Gen4_1",
        h = "B_Gen5_2",
        p = "GP_Gen5_8"
    }
}

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

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 postgresql.tf aonde iremos criar um servidor de banco de dados PostgreSQL e um banco de dados dentro deste servidor:

resource "azurerm_postgresql_server" "pgsql_server" {
  name                = "postgresql-${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_postgresql
  ssl_enforcement_enabled      = true

  tags = merge(local.tags)
}

resource "azurerm_postgresql_database" "pgsql_database" {
  name                = "pgsqldb-${var.nome_sistema}-${local.ambiente}"
  resource_group_name = azurerm_resource_group.rg.name
  server_name         = azurerm_postgresql_server.pgsql_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_pgsql_id" {
    value = azurerm_postgresql_database.pgsql_database.id
}

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

rg              = "TerraformAzurePostgreSQLdb"
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 PostgreSQL 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.

Para excluir todos esses recursos uma vez que não vamos utiliza-los agora, basta executar:

terraform destroy

E é isso por hoje gente, agradeço novamente pela atenção de vocês e no próximo post iremos construir um módulo MySQL! Não perca! Até a próxima.

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 )

Twitter picture

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

Facebook photo

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

Connecting to %s

%d bloggers like this: