infracloud/inventcloud/invista/nexus/OCI-DEV-NEXUS.md
Tiago Ribeiro 566399fb60 docs(nexus): adiciona seção sobre importância do Terraform vs Console OCI
- Comparativo de tempo: 90min manual vs 5min Terraform por cluster
- Demonstração do que 1 apply cria (47 recursos)
- Scale up/down: 1 linha no tfvars vs 3 operações manuais
- Infraestrutura como documentação viva (tfvars)
- Lições aprendidas: custo de não usar Terraform (orphans, duplicatas, etc.)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-25 13:24:46 -03:00

675 lines
33 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# OCI — Ambiente DEV Nexus (cmp-dev-nexus)
> **Data:** 2026-02-25 | **Responsável:** Tiago Ribeiro
> **Contexto:** Documentação completa do ambiente DEV Nexus — recursos OCI e Terraform (`tf_oci_clusters`)
---
## 0. Diagrama Geral — Fluxo de Tráfego e Recursos
### 0.1 Fluxo Completo: Internet → Cloudflare → OCI → Serviços
```
┌─────────────────────────────────────────────────────────────────────────────────────┐
│ INTERNET │
└──────────────────────────────┬──────────────────────────────────────────────────────┘
┌──────────▼──────────┐
│ CLOUDFLARE │
│ *.invista.com.br │
│ (DNS + Proxy/WAF) │
└──────┬──────────────┘
┌────────────────┼─────────────────────┐
│ APIs backend │ MFE (frontend) │ Acesso direto
│ (proxied) │ (planejado ⏳) │ (public LB)
▼ ▼ ▼
┌─────────────────┐ ┌──────────────────┐ ┌──────────────────────┐
│ LB Test_Crivo │ │ LB Test_Crivo │ │ OKE Public LB │
│ 10.8.4.127 │ │ Dev (VCN-Shared) │ │ 137.131.236.202 │
│ VCN-Shared │ │ (rota pendente) │ │ cls-dev-nexus │
│ cmp-shared-inv │ └──────────────────┘ └──────────────────────┘
│ [MANUAL] │ │ │
└────────┬────────┘ │ │
│ │ │
│ DRG-Invista-Shared │
│ (VCN-Shared ↔ VCN-DEV) │
▼ │ │
┌─────────────────────────────────────────────────┼──────────────────────────────────┐
│ VCN-DEV (10.6.0.0/16) — cmp-dev-inv [MANUAL] │ │
│ │ │
│ ┌──────────────────────────────────────────┐ │ │
│ │ api-gateway-nexus-dev [MANUAL] │ │ │
│ │ PRIVATE · IP: 10.6.0.123 │ │ │
│ │ Subnet: SBNT-DEV (10.6.0.0/24) │ │ │
│ │ │ │ │
│ │ Deployments: │ │ │
│ │ /api/auth /api/user │ │ │
│ │ /api/person /api/role │ │ │
│ │ /api/sso /api/cache │ │ │
│ │ /api/commercial-manager … │ │ │
│ └────────────────────┬─────────────────────┘ │ │
│ │ DRG (VCN-DEV ↔ vcn-oke) │ │
└───────────────────────┼─────────────────────────┼──────────────────────────────────┘
│ │
└────────────┬────────────┘
┌────────────────────────────────────▼────────────────────────────────────────────────┐
│ vcn-oke (10.110.0.0/16) — cmp-dev-inv [TERRAFORM ✅] │
│ │
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
│ │ sbn-lb-1 (10.110.128.0/20) · sbn-lb-2 (10.110.144.0/20) — PÚBLICAS │ │
│ │ │ │
│ │ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ ┌─────────────┐ │ │
│ │ │ OKE LB │ │ OKE LB │ │ OKE LB │ │ OKE LB pub │ │ │
│ │ │ 10.110.133.131│ │ 10.110.135.3 │ │ 10.110.129.64 │ │137.131.236.2│ │ │
│ │ │ cls-barramento│ │ cls-nexus │ │ cls-obs. │ │ cls-nexus │ │ │
│ │ └───────┬───────┘ └──────┬────────┘ └──────┬────────┘ └──────┬──────┘ │ │
│ └──────────┼─────────────────┼──────────────────┼─────────────────┼─────────┘ │
│ │ │ │ │ │
│ ┌──────────┼─────────────────┼──────────────────┼─────────────────┼─────────┐ │
│ │ sbn-workers-1/2/3 (10.110.032.0/20) — PÚBLICAS — cmp-dev-nexus │ │
│ │ │ │
│ │ ┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────┐ │ │
│ │ │ cls-dev-nexus │ │ cls-dev-barramento │ │ cls-dev-obs. │ │ │
│ │ │ [TERRAFORM ✅] │ │ [TERRAFORM ✅] │ │ [TERRAFORM ✅] │ │ │
│ │ │ np-dev-1 (x3 VMs) │ │ np-dev-2 (x3 VMs) │ │ np-dev-3 (x3) │ │ │
│ │ │ ArgoCD ✅ │ │ ArgoCD ✅ │ │ ArgoCD ✅ │ │ │
│ │ │ K8s v1.34.1 │ │ K8s v1.34.1 │ │ K8s v1.34.1 │ │ │
│ │ └─────────────────────┘ └─────────────────────┘ └─────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
│ │ sbn-api-gateway (10.110.192.0/20) — PRIVADA [TERRAFORM ✅] │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │
│ │ │ api-gateway-mfe-dev [TERRAFORM ✅] │ │ │
│ │ │ PRIVATE · IP: 10.110.198.250 │ │ │
│ │ │ Deployments: mfe-user → nexus-mfe-user-development (Object Storage) │ │ │
│ │ └──────────────────────────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────────────┘
┌───────────▼──────────────┐
│ OCI Object Storage │
│ Namespace: grbb7qzeuoag │
│ nexus-mfe-user-dev │
│ mfe-shell-dev │
│ [MANUAL / Pipeline CI] │
└───────────────────────────┘
```
---
### 0.2 Fluxo API Backend (atual)
```
Browser
└─► Cloudflare (*.invista.com.br) [DNS Proxy + WAF]
LB Test_Crivo_Dev (10.8.4.127 — VCN-Shared — cmp-shared-inv)
Cert: *.invista.com.br (Cloudflare Origin CA)
│ roteamento por hostname
api-gateway-nexus-dev (PRIVATE — 10.6.0.123 — VCN-DEV)
/api/auth /api/user /api/person /api/sso …
│ DRG: VCN-DEV ↔ vcn-oke
OKE Load Balancers internos (10.110.128-143.x — sbn-lb-1/2)
K8s Services / Ingress (cls-dev-nexus)
Pods (worker nodes — sbn-workers-1/2/3 — cmp-dev-nexus)
```
---
### 0.3 Fluxo MFE Frontend (planejado ⏳)
```
Browser
└─► Cloudflare (mfe-user-dev.invista.com.br) [DNS Proxy]
▼ ⏳ PENDENTE: DRG attach vcn-oke → DRG-Invista-Shared
LB Test_Crivo_Dev (10.8.4.127 — VCN-Shared)
│ rota: mfe-user-dev.invista.com.br → 10.110.198.250:443
│ DRG: VCN-Shared → vcn-oke
api-gateway-mfe-dev (PRIVATE — 10.110.198.250 — sbn-api-gateway)
│ / → index.html /{path*} → arquivos estáticos
OCI Object Storage
nexus-mfe-user-development (namespace: grbb7qzeuoag)
Atual (sem DNS):
https://guhal72tzyekzchzamhhi3lvgi.apigateway.sa-saopaulo-1.oci.customer-oci.com/
```
---
### 0.4 Mapa de Compartments e Recursos
```
invistacloud (root)
├── cmp-top-invista
│ └── cmp-dev-inv ──────────────────────────────────────────────────────────────┐
│ │ │
│ │ [TERRAFORM ✅] vcn-oke (10.110.0.0/16) │
│ │ [TERRAFORM ✅] api-gateway-mfe-dev (10.110.198.250) │
│ │ [TERRAFORM ✅] observability (alarms, log group, dashboards) │
│ │ [MANUAL] VCN-DEV (10.6.0.0/16) │
│ │ [MANUAL] api-gateway-nexus-dev (PRIVATE, 10.6.0.123) │
│ │ [MANUAL] DRG attachments (VCN-DEV ↔ vcn-oke) │
│ │ [PIPELINE CI] buckets: mfe-shell-dev │
│ │ │
│ └── cmp-dev-nexus ────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ [TERRAFORM ✅] cls-dev-nexus (k8s v1.34.1, x3 VMs) │ │
│ │ [TERRAFORM ✅] cls-dev-barramento (k8s v1.34.1, x3 VMs) │ │
│ │ [TERRAFORM ✅] cls-dev-observabilidade (k8s v1.34.1, x3 VMs)│ │
│ │ [OKE-managed] 5x Load Balancers (OKE Services) │ │
│ │ [MANUAL] buckets: tfstate-*, invista-inventcloud-bucket3│ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
└── cmp-shared-inv │
[MANUAL] LB Test_Crivo_Dev (10.8.4.127, VCN-Shared 10.8.0.0/16) │
[MANUAL] DRG-Invista-Shared │
OKE > DEV ←── VCNs orphans deletadas em 2026-02-25 ────────────────────────────┘
```
---
### 0.5 O que é Terraform vs Manual vs Pipeline CI
| Recurso | Gerenciado por | Repositório |
|---|---|---|
| VCN `vcn-oke` (10.110.0.0/16) + subnets + gateways | **Terraform** | `tf_oci_clusters/modules/network` |
| OKE clusters (x3) + node pools | **Terraform** | `tf_oci_clusters/modules/oke_cluster` |
| `api-gateway-mfe-dev` + deployments MFE | **Terraform** | `tf_oci_clusters/modules/api_gateway_mfe` |
| ArgoCD (Helm v7.3.0) em cada cluster | **Terraform** (null_resource) | `tf_oci_clusters/environments/dev/argocd.tf` |
| Observabilidade (alarms, log group, dashboards) | **Terraform** | `tf_oci_clusters/modules/observability` |
| Compartments `cmp-dev-nexus` / `cmp-dev-inv` | **Terraform** (flags `create_*=false` = não recria) | `tf_oci_clusters` |
| `VCN-DEV` (10.6.0.0/16) + subnets + gateways | **Manual** (OCI Console) | — |
| `api-gateway-nexus-dev` (PRIVATE) + deployments | **Manual** (OCI Console) | — |
| LB `Test_Crivo_Dev` (10.8.4.127) | **Manual** | — |
| DRG-Invista-Shared + attachments | **Manual** | — |
| DNS Cloudflare (*.invista.com.br) | **Manual** (API Cloudflare) | — |
| Object Storage buckets (mfe-*) | **Pipeline CI** (azure-pipelines.yml) | Repos dos MFEs |
| OKE Load Balancers (5x) | **OKE-managed** (K8s Service) | Apps no cluster |
| Kubeconfigs (`~/.kube/config-dev-*`) | **Terraform** (local-exec) | Gerado no apply |
---
## 1. Compartments
### Hierarquia
```
invistacloud (root)
└── cmp-top-invista
└── cmp-dev-inv ← compartment pai (local.compartment_id no Terraform)
└── cmp-dev-nexus ← clusters OKE, node pools, LBs
```
| Compartment | OCID | Uso |
|---|---|---|
| `cmp-dev-inv` | `ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a` | VCN, API Gateway, Object Storage, Observabilidade |
| `cmp-dev-nexus` | `ocid1.compartment.oc1..aaaaaaaahycc62za6ikthlhauvarvbdixc7xpjjmcrame3cirhu2kz74ddma` | Clusters OKE, Node Pools, Load Balancers |
> **Nota:** O Terraform usa `cmp-dev-inv` como compartment raiz do ambiente (`existing_compartment_id`) e `cmp-dev-nexus` como compartment dos clusters (`cluster_compartment_id_map`).
---
## 2. OKE Clusters
### Clusters Ativos
| # | Cluster | OCID (sufixo) | Versão K8s | Node Pool | Nodes |
|---|---|---|---|---|---|
| 1 | `cls-dev-nexus` | `…cobrewkvc3a` | v1.34.1 | `np-dev-1` | 3x VM.Standard.E4.Flex |
| 2 | `cls-dev-barramento` | `…cifn2eknv6q` | v1.34.1 | `np-dev-2` | 3x VM.Standard.E4.Flex |
| 3 | `cls-dev-observabilidade` | `…crszb62robq` | v1.34.1 | `np-dev-3` | 3x VM.Standard.E4.Flex |
### Configuração dos Node Pools
| Parâmetro | Valor |
|---|---|
| Shape | `VM.Standard.E4.Flex` |
| OCPUs | 2 |
| Memória | 16 GB |
| Nodes por pool | 3 (`node_pool_size_up = 3`) |
| Modo de escala | `up` (escala zero: `node_pool_size_down = 0`) |
| Autoscaler | Desabilitado |
| Pods CIDR | `10.244.0.0/16` |
| Services CIDR | `10.96.0.0/16` |
### Worker Nodes (Compute Instances)
| Instância | Cluster | Shape | Estado |
|---|---|---|---|
| `oke-cifn2eknv6q-*` (x3) | cls-dev-barramento | VM.Standard.E4.Flex | RUNNING |
| `oke-cobrewkvc3a-*` (x3) | cls-dev-nexus | VM.Standard.E4.Flex | RUNNING |
| `oke-crszb62robq-*` (x3) | cls-dev-observabilidade | VM.Standard.E4.Flex | RUNNING |
### Kubeconfig
Os kubeconfigs são gerados automaticamente pelo Terraform via `null_resource.kubeconfig`:
```
~/.kube/config-dev-1 → cls-dev-nexus
~/.kube/config-dev-2 → cls-dev-barramento
~/.kube/config-dev-3 → cls-dev-observabilidade
```
Gerar manualmente:
```bash
oci ce cluster create-kubeconfig \
--cluster-id <CLUSTER_OCID> \
--file ~/.kube/config-dev-<N> \
--token-version 2.0.0
```
---
## 3. Rede
### VCN
| VCN | CIDR | Compartment | Gerenciada por |
|---|---|---|---|
| `vcn-oke` | `10.110.0.0/16` | `cmp-dev-inv` / OKE > DEV | Terraform (`tf_oci_clusters`) |
| `VCN-DEV` | `10.6.0.0/16` | `cmp-dev-inv` | Manual |
### Subnets `vcn-oke` (10.110.0.0/16)
| Subnet | CIDR | Tipo | Uso |
|---|---|---|---|
| `sbn-workers-1` | `10.110.0.0/20` | Pública | OKE worker nodes |
| `sbn-workers-2` | `10.110.16.0/20` | Pública | OKE worker nodes |
| `sbn-workers-3` | `10.110.32.0/20` | Pública | OKE worker nodes |
| `sbn-lb-1` | `10.110.128.0/20` | Pública | Load Balancers OKE + API Gateway MFE |
| `sbn-lb-2` | `10.110.144.0/20` | Pública | Load Balancers OKE |
| `sbn-api-gateway` | `10.110.192.0/20` | **Privada** | Criada pelo Terraform (disponível — não usada atualmente) |
### Gateways de Rede
| Gateway | Tipo | Uso |
|---|---|---|
| `igw-oke` | Internet Gateway | Egress público para workers e LBs |
| `nat-oke` | NAT Gateway | Egress privado para `sbn-api-gateway` |
| `sgw-oke` | Service Gateway | Acesso a serviços OCI (Object Storage, etc.) |
| DRG | Dynamic Routing Gateway | Cross-VCN: `vcn-oke``VCN-DEV` |
---
## 4. Load Balancers
Todos os LBs são criados e gerenciados pelo OKE (via Services do tipo LoadBalancer no Kubernetes):
| Display Name (ID OKE) | IP | Shape | Cluster | Criado em |
|---|---|---|---|---|
| `35adee2d-…` | `10.110.133.131` | 100Mbps | cls-dev-barramento | 2026-01-26 |
| `b8344bb7-…` | `10.110.135.3` | 100Mbps | cls-dev-nexus | 2026-01-26 |
| `bc0548de-…` | `10.110.129.64` | 100Mbps | cls-dev-observabilidade | 2026-01-26 |
| `177c06f0-…` | `10.110.143.54` | 100Mbps | cls-dev-nexus | 2026-01-29 |
| `029cfee6-…` | `137.131.236.202` *(público)* | 100Mbps | cls-dev-nexus | 2026-02-09 |
> Os IPs privados (`10.110.x`) estão na subnet `sbn-lb-1` ou `sbn-lb-2`.
> O único IP público (`137.131.236.202`) pertence a um Service exposto externamente no `cls-dev-nexus`.
---
## 5. API Gateways
### `api-gateway-mfe-dev` — Terraform-managed
| Campo | Valor |
|---|---|
| Nome | `api-gateway-mfe-dev` |
| Compartment | `cmp-dev-inv` |
| Tipo | PUBLIC |
| Subnet | `sbn-lb-1` (10.110.128.0/20) — vcn-oke |
| Gerenciado por | Terraform (`modules/api_gateway_mfe`) |
| Hostname | `guhal72tzyekzchzamhhi3lvgi.apigateway.sa-saopaulo-1.oci.customer-oci.com` |
**Deployments configurados:**
| MFE | Bucket | Path | Backend |
|---|---|---|---|
| `mfe-user` | `mfe-user-dev` | `/{path*}` | Object Storage `grbb7qzeuoag` |
| `mfe-user` | `mfe-user-dev` | `/` (fallback SPA) | `index.html` no bucket |
### `api-gateway-nexus-dev` — Manual
| Campo | Valor |
|---|---|
| Nome | `api-gateway-nexus-dev` |
| Compartment | `cmp-dev-inv` |
| Subnet | `SBNT-DEV` (10.6.0.0/24) — VCN-DEV |
| Gerenciado por | Manual |
| Conectividade OKE | Via DRG (cross-VCN: VCN-DEV ↔ vcn-oke) |
> **Pendência:** Migrar `api-gateway-nexus-dev` para `sbn-api-gateway` na `vcn-oke` (ver `OCI-NETWORK-ANALYSIS.md` — Opção A).
---
## 6. Object Storage
### Buckets em `cmp-dev-nexus`
| Bucket | Uso | Criado em |
|---|---|---|
| `invista-inventcloud-bucket3` | Uso geral | 2026-02-06 |
| `tfstate-gqysee` | Terraform remote state | 2025-12-30 |
| `tfstate-inidhr` | Terraform remote state | 2025-12-30 |
| `tfstate-terraform` | Terraform remote state | 2025-12-30 |
### Buckets em `cmp-dev-inv`
| Bucket | Uso | Criado em |
|---|---|---|
| `mfe-shell-dev` | MFE Shell (frontend) | 2026-02-24 |
> **Namespace do Object Storage:** `grbb7qzeuoag`
---
## 7. ArgoCD
ArgoCD instalado em todos os 3 clusters via Helm pelo Terraform:
| Parâmetro | Valor |
|---|---|
| Chart Version | `7.3.0` (argo/argo-cd) |
| Namespace | `argocd` |
| LB tipo | Interno (annotation `oci-load-balancer-internal=true`) |
| OIDC | OCI IDCS (integrado via outputs do módulo `identity`) |
**URLs internas (somente acesso via VCN):**
| Cluster | URL |
|---|---|
| `cls-dev-nexus` (1) | `https://argocd.dev-01.interno.invista.com.br` |
| `cls-dev-barramento` (2) | `https://argocd.dev-02.interno.invista.com.br` |
| `cls-dev-observabilidade` (3) | `https://argocd.dev-03.interno.invista.com.br` |
**RBAC OCI IDCS:**
| Grupo OCI | Role ArgoCD |
|---|---|
| `invista-oke-admin` | `admin` |
| `invista-oke-dev` | `readonly` |
| `invista-oke-readonly` | `readonly` |
---
## 8. Observabilidade
Gerenciada pelo módulo `modules/observability` em `cmp-dev-inv`:
| Recurso | Tipo | Configuração |
|---|---|---|
| Alarmes OCI Monitoring | `oci_computeagent` | CPU > 90% (PT10M) → CRITICAL; CPU > 75% (PT15M) → WARNING |
| Log Group | OCI Logging | — |
| Dashboard | OCI Management Dashboard | Import de `dashboards/oke-observability-import.json` |
---
## 9. Terraform — `tf_oci_clusters`
### Repositório
| Campo | Valor |
|---|---|
| Organização | Azure DevOps — CN-Squad |
| Projeto | Invista FIDC - Nexus |
| Repositório | `tf_oci_clusters` |
| Pipeline | `terraform-tf_oci_clusters` (ID 51) |
| Variable Group | `oci-terraform` (ID 34) |
| Backend | Object Storage OCI (S3-compatible) — bucket `tfstate-*` em `cmp-dev-nexus` |
### Estrutura de Arquivos
```
tf_oci_clusters/
├── environments/
│ ├── dev/
│ │ ├── main.tf # Clusters, rede, bastion, observabilidade
│ │ ├── api_gateway_mfe.tf # API Gateway MFE + deployments
│ │ ├── argocd.tf # ArgoCD Helm install + kubeconfig
│ │ ├── backend.tf # Remote state config
│ │ ├── providers.tf # OCI provider
│ │ ├── variables.tf # Todas as variáveis
│ │ └── terraform.ci.tfvars # Valores do ambiente DEV (pipeline CI)
│ ├── hml/ # Ambiente HML (estrutura similar)
│ └── prod/ # Ambiente PROD (estrutura similar)
├── modules/
│ ├── oke_cluster/ # OKE cluster + node pool
│ │ ├── main.tf # oci_containerengine_cluster + node_pool
│ │ └── variables.tf
│ ├── network/ # VCN, subnets, gateways, route tables, security lists
│ │ ├── main.tf
│ │ └── variables.tf
│ ├── api_gateway_mfe/ # API Gateway PUBLIC para MFEs estáticos
│ │ ├── main.tf # oci_apigateway_gateway + deployments por MFE
│ │ └── variables.tf
│ ├── compartment/ # Criação de compartment
│ ├── observability/ # ONS + OCI Logging + Alarms + Dashboards
│ └── iam_service_accounts/ # IAM para service accounts
├── compartments/ # Gerenciamento top-level de compartments
├── dns/ # DNS OCI
├── iam/ # IAM policies
├── identity/ # OIDC / IDCS (usado pelo ArgoCD)
├── argocd/
│ ├── values.yaml # Helm values do ArgoCD
│ └── application-dev.yaml # ArgoCD Application manifest (GitOps)
└── dashboards/
└── oke-observability-import.json
```
### terraform.ci.tfvars DEV — Valores Principais
```hcl
env_name = "dev"
create_compartment = false
create_cluster_compartment = false # removido manualmente 2026-02-25
existing_compartment_id = "ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a" # cmp-dev-inv
cluster_compartment_id_map = {
"1" = "ocid1.compartment.oc1..aaaaaaaahycc62za6ikthlhauvarvbdixc7xpjjmcrame3cirhu2kz74ddma" # cmp-dev-nexus
"2" = "ocid1.compartment.oc1..aaaaaaaahycc62za6ikthlhauvarvbdixc7xpjjmcrame3cirhu2kz74ddma"
"3" = "ocid1.compartment.oc1..aaaaaaaahycc62za6ikthlhauvarvbdixc7xpjjmcrame3cirhu2kz74ddma"
}
kubernetes_version = "v1.34.1"
node_shape = "VM.Standard.E4.Flex"
ocpus = 2
memory_in_gbs = 16
vcn_cidr = "10.110.0.0/16"
scale_mode = "up"
node_pool_size_up = 3
node_pool_size_down = 0
enable_bastion = true
admin_cidr = "187.65.249.125/32"
enable_api_gateway_mfe = true
```
### Pipeline CI/CD
```
Push to main (tf_oci_clusters)
→ Bootstrap (init + validate)
→ Detect Changes (diff por environment)
→ Plan (terraform plan -var-file=terraform.ci.tfvars)
→ Aprovação Manual
→ Apply (terraform apply)
```
---
## 10. Fluxo de Dependências
```
tf_oci_clusters (pipeline ID 51)
├── module.network → VCN vcn-oke (10.110.0.0/16)
│ └── subnets, IGW, NAT, SGW, route tables, security lists
├── module.cluster[1,2,3] → cls-dev-nexus / cls-dev-barramento / cls-dev-observabilidade
│ └── node_pool → np-dev-1/2/3 (VM.Standard.E4.Flex 2cpu/16gb x3)
├── module.api_gateway_mfe → api-gateway-mfe-dev (PUBLIC, sbn-lb-1)
│ └── deployment mfe-user → bucket mfe-user-dev
├── null_resource.kubeconfig → ~/.kube/config-dev-{1,2,3}
├── null_resource.argocd_setup → ArgoCD v7.3.0 em cada cluster
└── module.observability → Alarms + Log Group + Dashboards
```
---
## 11. Por que Terraform — Importância e Comparativo com Console OCI
### 11.1 O problema de provisionar manualmente
Criar o ambiente DEV Nexus via OCI Console exige navegar por dezenas de telas, preencher formulários e decorar dependências entre recursos. Qualquer erro (subnet errada, CIDR conflitante, security list faltando uma porta) só aparece quando algo não funciona — e não existe histórico do que foi feito nem como desfazer de forma controlada.
Exemplo real desse ambiente: as **8 VCNs orphans** encontradas em 2026-02-25 existiam porque clusters foram criados/destruídos manualmente sem deletar os recursos de rede. Resultado: 104 recursos abandonados consumindo cota sem nenhum registro.
---
### 11.2 Comparativo: Console OCI vs Terraform
#### Criar 1 cluster OKE completo (cluster + node pool + rede)
| Etapa | Via Console OCI | Via Terraform |
|---|---|---|
| Criar VCN | ~5 min (telas: VCN, CIDR, DNS) | `terraform apply` |
| Criar subnets (5x) | ~20 min (cada subnet: nome, CIDR, tipo, route table, security list) | já incluso no `apply` |
| Criar IGW + NAT + SGW | ~10 min (3 recursos separados) | já incluso |
| Criar route tables (3x) + regras | ~15 min | já incluso |
| Criar security lists (3x) + regras de portas | ~20 min | já incluso |
| Criar cluster OKE | ~10 min (escolher versão, VCN, subnets, endpoint) | já incluso |
| Criar node pool | ~10 min (shape, imagem, placement, SSH key) | já incluso |
| **Total (1 cluster)** | **~90 min · propenso a erros** | **~5 min · repetível** |
| **Total (3 clusters como no DEV)** | **~45 horas** | **~5 min (mesma execução)** |
#### Recriar o ambiente do zero (ex.: novo ambiente HML/PROD)
| Cenário | Console OCI | Terraform |
|---|---|---|
| Tempo estimado | 12 dias (com documentação detalhada) | 1520 min (`cp -r environments/dev environments/staging` + ajuste de tfvars) |
| Risco de divergência entre ambientes | Alto — cada clique pode ser diferente | Zero — mesmos módulos, variáveis diferentes |
| Rastreabilidade | Nenhuma — "alguém clicou em alguma coisa" | Git blame, PR, histórico de apply |
| Rollback | Manual — deletar na ordem certa | `terraform destroy` ou reverter commit |
---
### 11.3 O que o Terraform garante nesse ambiente
```
Um único comando:
terraform apply -var-file=terraform.ci.tfvars
Cria/garante automaticamente:
✅ 1 VCN (vcn-oke 10.110.0.0/16)
✅ 6 subnets (workers x3, LB x2, api-gateway x1)
✅ 3 gateways (IGW + NAT + SGW)
✅ 3 route tables com regras corretas
✅ 3 security lists com portas OKE (6443, 10250, NodePort, etc.)
✅ 3 clusters OKE (cls-dev-nexus / barramento / observabilidade)
✅ 3 node pools (np-dev-1/2/3 · VM.Standard.E4.Flex · 2cpu/16gb · 3 nodes)
✅ ArgoCD v7.3.0 instalado via Helm nos 3 clusters
✅ Kubeconfigs gerados em ~/.kube/config-dev-{1,2,3}
✅ API Gateway MFE (api-gateway-mfe-dev) + deployment mfe-user
✅ Alarms de CPU (WARNING 75% / CRITICAL 90%)
✅ Log Group + Dashboard de observabilidade OKE
Total: ~47 recursos OCI · 1 comando · ~12 min de pipeline
```
---
### 11.4 Scale up / Scale down em segundos
Um dos maiores benefícios práticos: **ligar e desligar os node pools** sem recriar os clusters.
```bash
# Desligar workers (economizar custo fora do horário):
# terraform.ci.tfvars:
scale_mode = "down" # node_pool_size_down = 0
# Ligar workers:
scale_mode = "up" # node_pool_size_up = 3
```
Via Console: editar cada node pool individualmente (3 clusters × 1 node pool = 3 operações manuais, ~15 min).
Via Terraform: alterar 1 linha no tfvars + push → pipeline aplica em todos os 3 clusters automaticamente.
---
### 11.5 Infraestrutura como código = documentação viva
O arquivo `terraform.ci.tfvars` documenta **exatamente** o estado atual do ambiente:
```hcl
kubernetes_version = "v1.34.1" # versão do K8s nos 3 clusters
node_shape = "VM.Standard.E4.Flex"
ocpus = 2 # CPU por worker
memory_in_gbs = 16 # RAM por worker
vcn_cidr = "10.110.0.0/16"
node_pool_size_up = 3 # workers ativos
enable_bastion = true # bastion habilitado
admin_cidr = "187.65.249.125/32" # IP liberado para acesso admin
```
Qualquer pessoa com acesso ao repositório sabe exatamente o que está rodando — sem precisar abrir o Console OCI.
---
### 11.6 Custo de não usar Terraform (lição aprendida)
| Problema encontrado em 2026-02-25 | Causa | Se fosse Terraform |
|---|---|---|
| 2 compartments `cmp-dev-nexus` (um vazio, um ativo) | Ciclo anterior criou manualmente fora do state | Terraform teria gerenciado 1 único compartment |
| 8 VCNs orphans + 104 sub-recursos abandonados | Clusters destruídos via console sem destruir rede | `terraform destroy` teria removido tudo |
| VCN-DEV usada para API Gateway (arquitetura incorreta) | API Gateway criado manualmente na VCN errada | Terraform teria posto na subnet correta (`sbn-api-gateway`) |
| Sem rastreabilidade de quando/por quê recursos foram criados | Console não deixa histórico | Git commit com autor, data e motivo |
---
*Atualizado em: 2026-02-25*
---
## Referências
| Recurso | OCID / URL |
|---|---|
| Compartment `cmp-dev-nexus` | `ocid1.compartment.oc1..aaaaaaaahycc62za6ikthlhauvarvbdixc7xpjjmcrame3cirhu2kz74ddma` |
| Compartment `cmp-dev-inv` | `ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a` |
| VCN `vcn-oke` | `ocid1.vcn.oc1.sa-saopaulo-1.amaaaaaasks3yliapqrmikfzagpgqohuzjqik3hx63w7r2uajiqv5krvxkda` |
| VCN `VCN-DEV` | `ocid1.vcn.oc1.sa-saopaulo-1.amaaaaaasks3yliatoq6uvqqak3kax775ksd2jastvgsbiki7mgj6jzue6dq` |
| API Gateway MFE hostname | `guhal72tzyekzchzamhhi3lvgi.apigateway.sa-saopaulo-1.oci.customer-oci.com` |
| Repo Terraform | Azure DevOps — CN-Squad / Invista FIDC - Nexus / tf_oci_clusters |
| Região | `sa-saopaulo-1` |
| Object Storage Namespace | `grbb7qzeuoag` |
---
*Atualizado em: 2026-02-25*