Skip to content

038. Implementa Terraform para gerenciar o Postgres

Filipe Deschamps edited this page Mar 25, 2022 · 1 revision

07/03/2022

Esse momento do projeto foi muito massaaaaa. Fiz um sprint de estudo no Terraform e apliquei isso nesse PR. Com ele, nós subimos duas instâncias de Postgres, uma no ambiente de staging, e outra em production, onde tudo isso é organizado pelos arquivos de declaração do Terraform.

O massa é que foi usado módulos e eles encapsulam vários serviços e maluquisses de configuração da AWS, para por exemplo para subir um Postgres que seja público. Nesse caso, não é somente subir uma instância do RDS... você precisa criar subets, subnet groups, fazer associações nas route tables, é cheio de detalhes, e encapsular tudo isso num módulo é muito importante para você ter a mesma "topologia" entre os ambientes.

Então para cada ambiente, basta declarar qual serviço que você quer usar (por enquanto VPC e RDS) e o Terraform respeita e sobe tudo. Fiquei super seguro durante o processo, porque tive que destruir os ambientes diversas vezes ao longo dos testes.

Outro benefício de ter a abstração por módulos foi, por exemplo, poder usar toda a mesma topologia mas customizar os requisitos para cada ambiente, então para o ambiente de staging podemos escolher um banco mais fraco, numa região mais barata e sem backups. Já para produção, o contrário. Olha que massa

Staging:

module "database" {
  source         = "../modules/database"
  environment    = var.environment
  vpc_id         = module.vpc.vpc_id
  vpc_cidr_block = module.vpc.vpc_cidr_block
  route_table_id = module.vpc.route_table_id

  // As customizações começam aqui:
  engine_version           = "14.1"
  instance_class           = "db.t4g.micro"
  allocated_storage        = 20
  max_allocated_storage    = 21
  backup_retention_period  = 0
  skip_final_snapshot      = true
  deletion_protection      = false
  delete_automated_backups = true
}

Produção:

module "database" {
  source         = "../modules/database"
  environment    = var.environment
  vpc_id         = module.vpc.vpc_id
  vpc_cidr_block = module.vpc.vpc_cidr_block
  route_table_id = module.vpc.route_table_id

  // As customizações começam aqui:
  engine_version           = "14.1"
  instance_class           = "db.t4g.micro"
  allocated_storage        = 20
  max_allocated_storage    = 100
  backup_retention_period  = 7
  skip_final_snapshot      = false
  deletion_protection      = true
  delete_automated_backups = false
}