devfactory-iac
Terraform Infrastructure-as-Code for the Dev Factory platform on AWS: 4 EKS
Estrutura
README
devfactory-iac
Terraform Infrastructure-as-Code for the Dev Factory platform on AWS: 4 EKS (Fargate) clusters, one per environment tier. Layered layout, S3 backend.
- AWS account:
992151248006(Dev Factory —AWSAdministratorAccessvia SSO) - Region:
us-east-1 - Tenant:
devfactory· tenant version:v1 - Naming:
eks-{env}-df-{tier}viacluster_slug(e.g.eks-devqa-df-plat) — - Existing VPC:
vpc-0f5b75c7bdfd5a8ed(10.214.8.0/22), private subnets
spec em environment-and-names.md (repo devfactory)
subnet-00c25c532b92b2d1e / subnet-0427f77a0413f8603 / subnet-04a39c36a4abd7544 (us-east-1a/b/c). Surfaced as variables (vpc_id, app_private_subnet_ids, …) so they can change.
No credentials are committed. Locally they come from the SSO profile / env; in CI from
repo secrets; in-cluster from the application IRSA role.
O que o Terraform NÃO gerencia (fronteira — ADR-0027)
Decisão de arquitetura, não gap. Não importar para o Terraform:
| fora do Terraform | quem gerencia | onde está documentado |
|---|---|---|
| Bucket de state, ALBs, stores (DocumentDB/RDS/Redis) | receita manual | scripts/receita/ |
| Access entries e deploy-roles por projeto, recursos de projeto (S3/ECR/DynamoDB/KB) | control plane em runtime (apis-aws) | bloco ADR-0027 no repo devfactory |
| Target groups, listeners e rules dos Ingresses | AWS Load Balancer Controller in-cluster | k8/ |
ECRs de plataforma (ecr-{env}-df-plat-*) | CI dos repos de plataforma | workflows docker-* de cada repo |
Roles IAM de app/CI (devfactory-eks-apis-aws, brokers, runners) | CLI, espelhadas neste repo | iam/ |
| metrics-server add-on | instalado out-of-band em 2026-07-31; código gated até o import | terraform/20_cluster/modules/2_eks/metrics_server.tf |
Layer tree
terraform/
├── 0_environments/ # plat-nonprod / plat-prod / apps-nonprod / apps-prod
├── 0_backend_configs/ # <env>-<layer>.hcl (S3 backend per env+layer)
├── 10_endpoints/ # VPC endpoints — hoje desligado (egress via GWLB; ver README da camada)
└── 20_cluster/ # EKS 1.36 Fargate + OIDC + profiles + LBC + fargate logging
└── modules/2_eks/
k8/ # manifests reconciliados com o vivo (fonte de deploy)
├── cluster/ # CoreDNS Fargate patch note
├── kube-system/ # LBC ServiceAccount gen-1 (DEPRECATED — hoje via Helm)
├── plat-devqa/ plat-prod/ # plataforma, um dir por cluster (deployments/svc/ingress)
│ └── plat-prod/gitlab-runner/ # fonte-de-verdade do runner do CI (eks-prd-df-plat)
├── apps-devqa/ apps-prod/ # clusters de aplicações (edge, ingress-nginx, coredns)
└── argo/ # NÃO instalado — ver k8/argo/README.md
iam/ # espelhos versionados das policies vivas (CLI-managed)
bedrock/ cloudwatch/ # configs out-of-band espelhadas
scripts/receita/ # bucket de state, ALBs, stores — passo 0 fora do Terraform
.github/workflows/ # terraform-validate + eks-plat-deploy (+ template)
Each layer holds provider.tf (backend "s3" {}, AWS ~> 5.0, default_tags), variables.tf, main.tf, outputs.tf, and modules/<n>_<name>/ submodules.
Environments
Um cluster por ambiente, namespaces estáticos (ADR-0027):
| Env | tfvars (cluster_slug) | State bucket | Namespaces | Cluster |
|---|---|---|---|---|
| plat-nonprod | plat-nonprod.tfvars (devqa-df-plat) | bkt-plat-nonprod-devfactory-us-east-1-tfstate | devfactory-v1-dev, devfactory-v1-qa, dataplane-dev, dataplane-qa | eks-devqa-df-plat |
| plat-prod | plat-prod.tfvars (prd-df-plat) | bkt-plat-prod-devfactory-us-east-1-tfstate | devfactory-v1-prod | eks-prd-df-plat |
| apps-nonprod | apps-nonprod.tfvars (devqa-df-apps) | bkt-apps-nonprod-devfactory-us-east-1-tfstate | apps-dev, apps-qa | eks-devqa-df-apps |
| apps-prod | apps-prod.tfvars (prd-df-apps) | bkt-apps-prod-devfactory-us-east-1-tfstate | apps-prod | eks-prd-df-apps |
⛔ **Os nomes dos buckets de state são da geração anterior de naming, mas guardam o state
dos clusters VIVOS** — os clusters foram renomeados in-place em 17/07 mantendo o mesmo
state. Nunca renomear, recriar ou "alinhar" esses buckets ao naming novo.
Legado (história): a gen-1 (cluster eks-dev-devfactory-us-east-1, camadas 01_ecr/02_state/03_eks/04_alb/06_application, manifests k8/dev+k8/prod, tfvars dev/prod) foi desmontada em 30–31/07/2026 — cluster, bucket de state e App Runner deletados — e o código removido deste repo em 2026-08-07. Histórico no git.
Apply order
ENV = plat-nonprod | plat-prod | apps-nonprod | apps-prod. As camadas são roots independentes; aplicar em ordem numérica. Passo 0 e o ALB/stores não são Terraform — ver scripts/receita/.
ENV=plat-nonprod
# 0) RECEITA (fora do Terraform): bucket de state
ENV_NAME=$ENV ./scripts/receita/01-bootstrap-tfstate.sh
# 1) VPC endpoints — primeiro na ordem, mas hoje é no-op (create_endpoints=false)
cd terraform/10_endpoints
terraform init -reconfigure -backend-config=../0_backend_configs/$ENV-10_endpoints.hcl
terraform apply -var-file=../0_environments/$ENV.tfvars
# 2) Cluster EKS Fargate (~10–15 min)
cd ../20_cluster
terraform init -reconfigure -backend-config=../0_backend_configs/$ENV-20_cluster.hcl
terraform apply -var-file=../0_environments/$ENV.tfvars
# 3) RECEITA (fora do Terraform): ALB + listener; e, só para plat-nonprod, os stores
# O DNS do ALB vai para o DNS corporativo (CNAME) e, no caso público, para o Imperva.
ENV_NAME=$ENV SCHEME=internal VPC_ID=... SUBNET_IDS="..." CERT_ARN=... ALLOWED_CIDRS="..." \
./scripts/receita/02-albs.sh
Deploy de workloads
Deploy da plataforma não passa pelo Terraform: o workflow eks-plat-deploy.yaml (via eks-deploy-template.yml) aplica o manifest de k8/plat-devqa|plat-prod e rola o Deployment com a imagem ecr-{env}-df-plat-{service}:latest. Apps de projeto deployam pelo CI GitLab de cada projeto nos clusters apps.
Validate (no AWS needed)
cd terraform/<layer>
terraform fmt -recursive
terraform init -backend=false
terraform validate
CI runs this for every layer (.github/workflows/terraform-validate.yml).