Pular para o conteúdo principal

Infraestrutura Terraform do EKB

Este artigo contém a infraestrutura como código (IaC) Terraform e Terragrunt para gerenciar a plataforma EKB no AWS EKS, com suporte preliminar para GKE, AKS e Kubernetes bare-metal. Ele inclui todas as implantações de charts Helm e templates de configuração de ambiente.


Documentação​

DocumentoDescrição
Guia de Implantação TerragruntGuia passo a passo para criar e implantar um novo ambiente
Visão Geral da Arquitetura AWSVisão geral da arquitetura, descrições dos componentes e fluxo de dados
Estratégia de Recuperação de DesastresEstratégia de DR, objetivos RTO/RPO, sistemas de backup e procedimentos de recuperação
Lista de Verificação de Pré-requisitosLista de verificação pré-implantação para completar com o cliente

Estrutura do Repositório​

ekb-terraform/
├── root.hcl # Configuração raiz do Terragrunt (estado remoto, geração de provider)
│
├── modules/ # Módulos Terraform reutilizáveis
│ ├── eks/ # Cluster AWS EKS, VPC, Karpenter, IAM, releases Helm
│ ├── aws-services/ # ElastiCache Redis, Amazon MQ RabbitMQ
│ ├── helm/ # Módulo genérico de release Helm
│ ├── state/ # Inicialização do bucket de estado S3
│ ├── aks/ # Azure AKS (preliminar)
│ ├── gke/ # Google GKE (preliminar)
│ └── baremetal/ # Kubernetes bare-metal (preliminar)
│
├── terragrunt/
│ ├── .gitignore
│ └── environments/
│ ├── STATE_MANAGEMENT_README.md
│ └── env-template-folder/ # Template para novos ambientes — copie e preencha os placeholders
│ ├── terragrunt.hcl # Configuração principal do ambiente (cluster, releases Helm, serviços AWS)
│ ├── state/
│ │ └── terragrunt.hcl # Inicialização do bucket de estado para este ambiente
│ └── values/ # Valores Helm por chart (um arquivo por chart)
│ ├── infrastructure.yaml # AWS Load Balancer Controller
│ ├── aws-ebs-csi-driver.yaml # EBS CSI Driver
│ ├── karpenter.yaml # Karpenter NodePool
│ ├── karpenter-nodeclasses.yaml# Karpenter EC2NodeClass
│ ├── karpenter-values.yaml # Valores do controlador Karpenter
│ ├── keda.yaml # Escalonador KEDA
│ ├── odin-services.yaml # Serviços de aplicação EKB
│ ├── cloudnative-pg.yaml # Operador CloudNativePG (ENABLE_CNPG)
│ ├── ha-supabase-db.yaml # Cluster HA Postgres via CNPG (ENABLE_HA_SUPABASE_DB)
│ ├── supabase.yaml # Pilha de aplicação Supabase (ENABLE_SUPABASE)
│ ├── signoz.yaml # Plataforma de observabilidade SigNoz (ENABLE_SIGNOZ)
│ └── signoz-k8s-infra.yaml # Agente de métricas k8s-infra do SigNoz (ENABLE_SIGNOZ)
│
└── helm-deployment/ # Charts Helm locais/vendored
├── infrastructure/ # Chart wrapper do ALB Controller
├── odin-services/odin-services/ # Plataforma EKB (Web, API, Celery, Automator, Ingress)
├── cloudnative-pg/ # Chart do operador CloudNativePG
├── ha-supabase-db/ # HA Supabase DB (Cluster CNPG + PgBouncer + backups barman)
├── supabase-kubernetes-ha/ # Pilha completa de aplicação Supabase
├── signoz/ # Plataforma de observabilidade SigNoz
└── k8s-infra/ # Agente de métricas do cluster k8s-infra do SigNoz

Início Rápido​

1. Instale as Ferramentas Necessárias​

Terraform

# macOS
brew install terraform

# Linux
sudo apt update && sudo apt install terraform

Terragrunt

# macOS
brew install terragrunt

# Linux / macOS (manual)
curl -Lo /usr/local/bin/terragrunt \
https://github.com/gruntwork-io/terragrunt/releases/latest/download/terragrunt_linux_amd64
chmod +x /usr/local/bin/terragrunt

kubectl e Helm

# macOS
brew install kubectl helm

# Linux
curl -LO "https://dl.k8s.io/release/$(curl -Ls https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -m 0755 kubectl /usr/local/bin/kubectl
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

Verificar instalação

terraform --version
terragrunt --version
kubectl version --client
helm version
aws sts get-caller-identity

2. Crie um Novo Ambiente​

Novos ambientes são criados copiando env-template-folder e preenchendo os placeholders.

Consulte o Guia de Implantação Terragrunt para o processo completo passo a passo. O fluxo de alto nível é:

# 1. Copie o template
cp -r terragrunt/environments/env-template-folder terragrunt/environments/nome-do-seu-ambiente

# 2. Preencha todos os placeholders <YOUR_*> em:
# - terragrunt/environments/nome-do-seu-ambiente/terragrunt.hcl
# - terragrunt/environments/nome-do-seu-ambiente/state/terragrunt.hcl
# - terragrunt/environments/nome-do-seu-ambiente/values/*.yaml

# 3. Inicialize o bucket de estado
cd terragrunt/environments/nome-do-seu-ambiente/state
terragrunt apply

# 4. Defina as variáveis de ambiente e implante
cd ../
export ENABLE_ALB_CONTROLLER=true
export WEB_DOMAIN="app.example.com"
export WEB_CERTIFICATE_ARN="arn:aws:acm:<regiao>:<conta>:certificate/<id>"
# ... (veja TERRAGRUNT_DEPLOYMENT_GUIDE.md para a lista completa de variáveis)

terragrunt apply

Flags de Habilitação/Desabilitação de Serviços​

Todos os serviços opcionais são alternados via variáveis de ambiente. Defina-as antes de executar terragrunt apply.

VariávelPadrãoServiço
ENABLE_ALB_CONTROLLERtrueAWS Load Balancer Controller
ENABLE_AWS_SERVICESfalseElastiCache Redis + Amazon MQ RabbitMQ
ENABLE_CNPGfalseOperador CloudNativePG
ENABLE_HA_SUPABASE_DBfalseCluster PostgreSQL HA (requer ENABLE_CNPG=true)
ENABLE_SUPABASEfalsePilha completa do Supabase (requer ENABLE_HA_SUPABASE_DB=true)
ENABLE_SIGNOZfalseObservabilidade SigNoz + agente k8s-infra
Informação

Ordem de Implantação do Supabase Auto-Hospedado

Os componentes do Supabase devem ser implantados em sequência:

ENABLE_CNPG=true terragrunt apply --target='helm_release.local["cloudnative-pg"]'
ENABLE_HA_SUPABASE_DB=true terragrunt apply --target='helm_release.local["ha-supabase-db"]'
ENABLE_SUPABASE=true terragrunt apply --target='helm_release.local["supabase"]'

Referência de Charts Helm​

Chart (em helm-deployment/)NamespaceHabilitado porDescrição
infrastructureinfrastructureSempreAWS Load Balancer Controller
odin-services/odin-servicesdefaultSempreWeb, FastAPI, Celery, Automator, Ingress
aws-ebs-csi-driver (upstream)kube-systemSempreDriver de volume persistente EBS
keda (upstream)kedaSempreEscalonamento automático de pods
cloudnative-pgcnpg-systemENABLE_CNPGOperador PostgreSQL
ha-supabase-dbha-supabase-dbENABLE_HA_SUPABASE_DBHA Postgres + PgBouncer + backups barman
supabase-kubernetes-hasupabaseENABLE_SUPABASEKong, Auth, Storage, Studio, Realtime
signozmonitoringENABLE_SIGNOZRastreamento distribuído, métricas, logs
k8s-infra (upstream)monitoringENABLE_SIGNOZAgente DaemonSet de métricas do cluster

Referência de Módulos​

modules/eks​

O módulo principal. Provisiona:

  • VPC com sub-redes públicas/privadas em 3 AZs
  • Cluster EKS (Kubernetes 1.33) e node group gerenciado para Karpenter
  • Controlador Karpenter + NodePool + EC2NodeClass
  • Funções IAM (cluster, node group, Karpenter, controlador ALB, EBS CSI driver)
  • Todas as releases Helm via o mapa de entrada helm_releases

modules/aws-services​

Provisiona ElastiCache Redis e Amazon MQ RabbitMQ. Somente ativo quando ENABLE_AWS_SERVICES=true.

modules/state​

Inicializa o bucket de estado S3 para um novo ambiente (versionamento, criptografia, bloqueio de acesso público).

modules/helm​

Módulo de release Helm reutilizável suportando tanto repositórios de chart upstream quanto charts locais com chart_path.


Configuração do Ambiente​

Placeholders​

Cada valor em env-template-folder que é específico do ambiente usa um placeholder <YOUR_*>. Execute o seguinte para verificar se nada foi esquecido antes de implantar:

grep -r "<YOUR_" terragrunt/environments/nome-do-seu-ambiente/

Estado Remoto​

O estado é armazenado no S3 por ambiente. O bucket é inicializado por state/terragrunt.hcl e referenciado por root.hcl. O padrão de nomenclatura é ekb-terraform-state-<nome-do-ambiente>.

Segredos​

aviso

Valores sensíveis (senhas, chaves de API, ARNs de certificados) nunca são commitados. Eles são passados como variáveis de ambiente consumidas por chamadas get_env() em terragrunt.hcl, ou como placeholders <YOUR_*> em arquivos de valores que devem ser preenchidos antes da implantação.


Solução de Problemas​

Verificar credenciais AWS

aws sts get-caller-identity

Verificar acesso ao cluster

aws eks update-kubeconfig --region <regiao> --name <nome-do-cluster>
kubectl get nodes
kubectl get pods -A

Verificar o Controlador ALB

kubectl get pods -n infrastructure | grep aws-load-balancer-controller
kubectl get ingress -A

Verificar o Karpenter

kubectl get pods -n kube-system | grep karpenter
kubectl get nodepools
kubectl get nodeclaims

Verificar lock de estado

# Desbloquear forçadamente um estado travado (use o ID do lock da mensagem de erro)
cd terragrunt/environments/nome-do-seu-ambiente
terragrunt force-unlock <lock-id>

Verificar se não há placeholders restantes

grep -r "<YOUR_" terragrunt/environments/nome-do-seu-ambiente/

Verificar status da release Helm

helm list -A
helm status <release-name> -n <namespace>
helm get values <release-name> -n <namespace>

Suporte Multi-Cloud (Planejado)​

PlataformaStatusMódulo
AWS EKSAtivomodules/eks
Azure AKSPreliminarmodules/aks
Google GKEPreliminarmodules/gke
Bare metalPreliminarmodules/baremetal