Dev Factory Code Wiki

devfactory-iac

Terraform Infrastructure-as-Code for the Dev Factory platform on AWS: 4 EKS

YAML · 74 arquivos JSON · 51 arquivos Markdown · 41 arquivos Shell · 6 arquivos 233 arquivos

Estrutura

📁 bedrock/2 arquivos
📁 inference-profiles/
📁 billing/1 arquivos
· split-cost-allocation-eks.md
📁 cloudwatch/3 arquivos
· bedrock-usage-claudecode-dashboard.json
· bedrock-usage-dashboard.json
· README.md
📁 docs/2 arquivos
· aws-oidc-pipelines.md
· secrets-map.md
📁 iam/63 arquivos
📁 apis-aws-cloudtrail/
📁 apis-aws-cost-explorer/
📁 apis-aws-deploy-role-provisioner/
📁 apis-aws-observability/
📁 apis-aws-provisioning/
📁 bedrock-kb-role/
📁 bedrock-model-invocation-logging/
📁 ci-ecr-broker/
📁 eks-apis-aws/
📁 energia-ops-deploy/
📁 eso-dev/
📁 eso-prod/
📁 k8/90 arquivos
📁 apps-devqa/
📁 apps-prod/
📁 argo/
📁 cluster/
📁 kube-system/
📁 plat-devqa/
📁 plat-prod/
📁 scripts/6 arquivos
📁 receita/
📁 terraform/62 arquivos
📁 00_account_baseline/
📁 0_backend_configs/
📁 0_environments/
📁 10_endpoints/
📁 20_cluster/
📁 ad-hml-dc/
📁 geoserver/
📁 velosec/
· .gitignore
· ARCHITECTURE.md
· README.md
· version.json

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.

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 Terraformquem gerenciaonde está documentado
Bucket de state, ALBs, stores (DocumentDB/RDS/Redis)receita manualscripts/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 IngressesAWS Load Balancer Controller in-clusterk8/
ECRs de plataforma (ecr-{env}-df-plat-*)CI dos repos de plataformaworkflows docker-* de cada repo
Roles IAM de app/CI (devfactory-eks-apis-aws, brokers, runners)CLI, espelhadas neste repoiam/
metrics-server add-oninstalado out-of-band em 2026-07-31; código gated até o importterraform/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):

Envtfvars (cluster_slug)State bucketNamespacesCluster
plat-nonprodplat-nonprod.tfvars (devqa-df-plat)bkt-plat-nonprod-devfactory-us-east-1-tfstatedevfactory-v1-dev, devfactory-v1-qa, dataplane-dev, dataplane-qaeks-devqa-df-plat
plat-prodplat-prod.tfvars (prd-df-plat)bkt-plat-prod-devfactory-us-east-1-tfstatedevfactory-v1-prodeks-prd-df-plat
apps-nonprodapps-nonprod.tfvars (devqa-df-apps)bkt-apps-nonprod-devfactory-us-east-1-tfstateapps-dev, apps-qaeks-devqa-df-apps
apps-prodapps-prod.tfvars (prd-df-apps)bkt-apps-prod-devfactory-us-east-1-tfstateapps-prodeks-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).