Migrar o CI de infra do onion-backend para ward/EKS
TLDR: Atualiza o workflow de CI de infra e os providers do terraform para que namespace e secrets sejam criados no cluster EKS, e o pipeline de deploy funcione ponta a ponta.
Contexto
O pipeline de deploy de staging (deploy-staging.yml) falha porque o namespace onion-backend--staging não existe no EKS. O namespace é criado pelo terraform (.infra/terraform/namespace.tf), mas:
- O provider
kubernetesdo terraform aponta parado-sfo3-shared-kubernetes(contexto de kubeconfig do DOKS) — o cluster antigo, que não existe mais - O caller de CI
infra.ymlainda usa a interface antiga (SOPS_AGE_KEY_*,DIGITALOCEAN_ACCESS_TOKEN), enquanto opipelines/infra.yml@v2agora esperaward_path+WARD_KEY - O
infra-pr.ymlusa um padrão de decrypt SOPS local que também precisa migrar para ward
A spec 20260706235356_migrate_onion_backend_secrets_to_ward.md cobriu apenas os secrets. Esta cobre a migração completa de provider + CI necessária para os deploys de staging funcionarem.
Objetivos
- O provider
kubernetesdo terraform conecta no EKS (via credenciais AWS +eks update-kubeconfig) infra.ymlusapipelines/infra.yml@v2comward_path+WARD_KEYinfra-pr.ymlusa plan baseado em ward (sem SOPS/age key)- Namespace
onion-backend--staginge secrets criados pelo terraform apply no EKS - Pipeline de deploy de staging passa ponta a ponta
Fora de escopo
O banco e o cache continuam em DigitalOcean Managed — ficam lá (sem migração de dados). Só mudam o contexto do provider kubernetes e o wiring de CI.
Mudanças
.infra/terraform/versions.tf
- Remover o provider
sops - Manter
digitalocean(banco/cache continuam na DO),kubernetes,cloudflare,rabbitmq
.infra/terraform/data.tf
- Remover
data.sops_file.secretselocal.secrets - Adicionar secrets baseados em
variable(alimentados pelo ward viaTF_VAR_*) - Corrigir a referência ao remote state
kubernetes: o outputkubernetes_cluster_iddo DOKS usado nas firewall rules do banco precisa ser substituído — remover a firewall rule do k8s da DO, já que os nós do EKS acessam pelo endpoint público - Corrigir o remote state
messagebroker: usar o outputmessagebroker_amqp_hostem vez demessagebroker_public_ip - Remover
data.terraform_remote_state.network
.infra/terraform/main.tf (provider kubernetes)
- Substituir
config_context = "do-sfo3-shared-kubernetes"pelo data source do EKS:hcl data "aws_eks_cluster" "shared" { name = "shared-kubernetes" } data "aws_eks_cluster_auth" "shared" { name = "shared-kubernetes" } provider "kubernetes" { host = data.aws_eks_cluster.shared.endpoint cluster_ca_certificate = base64decode(data.aws_eks_cluster.shared.certificate_authority[0].data) token = data.aws_eks_cluster_auth.shared.token } - Adicionar o provider
aws(regiãous-east-1; credenciais via env varsAWS_*do ward)
.infra/terraform/secrets.tf
- Substituir todas as referências
local.secrets["<key>"]por variáveisvar.<key>declaradas emvariables.tf - O ward injeta os secrets como env vars
TF_VAR_*— o terraform os pega automaticamente, sem wiring extra - Os valores de
DATABASE_URL_*eREDIS_URLcontinuam sendo montados a partir dos recursos DO do_token,cloudflare_api_token,cloudflare_zone_idetc. viram blocosvariablealimentados porTF_VAR_*
.infra/terraform/database.tf / cache.tf
- Remover os recursos
digitalocean_database_firewall(referenciamkubernetes_cluster_iddo state antigo do DOKS; os nós do EKS alcançam os bancos DO pelo endpoint público com SSL — firewall por IP é impraticável com autoscaler) - Manter todos os outros recursos DO de banco/cache inalterados
.github/workflows/infra.yml
- Subir para a interface
pipelines/infra.yml@v2: adicionarward_path: onion-backend - Remover
SOPS_AGE_KEY_*,DIGITALOCEAN_ACCESS_TOKEN,TERRAFORM_BACKEND_ACCESS_KEY/SECRET_KEY - Adicionar
WARD_KEY: ${{ secrets.WARD_KEY }}
.github/workflows/infra-pr.yml
- Substituir o decrypt SOPS local pelo plan baseado em ward (padrão do
infra-pr.ymldo marketing)
.ward/ (se ainda não migrado)
- A spec
20260706235356pode já ter feito isso. Verificar; se não, criar o vault ward com os equivalentesTF_VAR_*dos secrets SOPS atuais
Remover SOPS
- Deletar o diretório
.infra/terraform/secrets/(arquivos enc + key) e o.sops.yaml, se presente
Como verificar
gh workflow run infra.yml --repo ibft-corp/onion-backend --ref <branch>→ verdekubectl get namespace onion-backend--staging→ existekubectl get secret onion-backend-secrets -n onion-backend--staging→ existe com as chaves corretasgh workflow run deploy-staging.yml(ou push de tag) → deploy passa
Documentação
Nenhuma mudança de documentação necessária.