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.