Ambientes & Promoção de Configuração
A paridade de ambientes captura falhas específicas do Rust antes da produção: contagens de workers do Tokio, tamanhos de pool do sqlx, níveis de RUST_LOG e flags de funcionalidades. A promoção de configuração move valores testados através de dev, staging e prod com segredos injetados em tempo de execução, não copiados entre laptops.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
dev: docker-compose local, apenas .env.example (sem segredos reais)
staging: teste de carga de 50% RPS de prod, pool max = prod, snapshot anonimizado de prod
prod: segredos injetados pelo Vault, imagem imutável SHA, janela de alteração
Promoção: PR atualiza config/values.staging.yaml -> soak 48h -> PR values.prod.yamlQuando usar isso:
- Inicialização de novo serviço
- Incidentes repetidos de "funciona em staging, falha em prod"
- Auditoria de manuseio de segredos
- Expansão multi-região
Exemplo de Trabalho
use serde::Deserialize;
#[derive(Debug, Deserialize)]
pub struct AppConfig {
pub database_url: String,
pub database_max_connections: u32,
pub tokio_worker_threads: usize,
pub git_sha: String,
}
impl AppConfig {
pub fn from_env() -> Result<Self, config::ConfigError> {
config::Config::builder()
.add_source(config::Environment::default().separator("__"))
.build()?
.try_deserialize()
}
pub fn validate(&self) -> Result<(), String> {
if self.database_max_connections < 5 {
return Err("DATABASE_MAX_CONNECTIONS must be >= 5".into());
}
if self.tokio_worker_threads == 0 {
return Err("TOKIO_WORKER_THREADS must be set".into());
}
Ok(())
}
}# CI: valida fixture de staging contra esquema
cargo test -p orders-api -- config_validate_staging_fixture
# Promover (exemplo GitOps)
cp deploy/staging/values.yaml deploy/prod/values.yaml
# revisão de diff: apenas deltas pretendidos (réplicas, URLs)O que isso demonstra:
- Configuração tipada com validação captura erros de digitação antes da implantação
- Chaves de ambiente aninhadas via separador
__mapeiam para campos de struct - A promoção é um PR revisado, não
kubectl editmanual
Mergulho Profundo
Dimensões de Paridade
| Dimensão | Fidelidade mínima de staging |
|---|---|
| Toolchain Rust | Mesma rust-toolchain.toml |
| Limites de CPU / memória | Mesma proporção de prod por pod |
| Pool de DB | Corresponde a max_connections de prod |
| Configuração TLS / rustls | Mesma política de cifra |
| Serviços dependentes | Injeção de latência realista opcional |
Fluxo de Segredos
- Desenvolvedores: credenciais falsas ou função de dev local do vault.
- CI: tokens de curta duração do OIDC.
- Staging/prod: Operador de segredos Vault/K8s; monta como env no início do pod.
- Nunca comitar
.envcom segredos de prod;cargo deny+ scanners de segredos em CI.
Configuração vs Código
- Flags de funcionalidades e tamanhos de pool: camada de configuração.
- Lógica de negócios: código + lançamento normal.
- Documentar quais alterações precisam apenas de promoção de configuração vs. reconstrução de imagem.
Armadilhas
- Staging com 1/100 do tráfego - Bugs no pool se escondem. Correção: Teste de carga com 50% do pico trimestralmente.
- Erro de digitação de variável de ambiente apenas de prod - Incidente clássico. Correção: Validar esquema de todas as fixtures de ambiente em CI.
- Diferentes workers Tokio em staging vs prod - Corrida se esconde. Correção:
TOKIO_WORKER_THREADSexplícito em ambos. - Copiar DB de prod para laptop - Violação de conformidade. Correção: Pipeline de snapshot anonimizado.
- Edição manual de configuração de prod - Desvio do GitOps. Correção: Reverter + PR dentro da política de 24h.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Ambiente de pré-visualização por PR | Alto volume de alterações | Sensível a custos, equipe pequena |
| Ambiente efêmero | Testes de integração | Testes de soak longos |
| Staging único | Produto minúsculo | Serviço de receita Tier-1 |
| Sombra de produção | Validação somente leitura | Gravações não idempotentes |
FAQs
Quantos ambientes?
Mínimo de Dev + staging + prod para tier-1; adicione ambiente de perf se testes de compilação/carga precisarem de isolamento.
Configuração em ConfigMap vs env?
Env para simplicidade 12-factor; arquivos para grandes pacotes TLS; documentar comportamento de recarga.
Configuração de prod regional?
Valores base + overlay de região; promover overlays juntos ou por playbook de região.
Modo offline sqlx em CI?
SQLX_OFFLINE=true com dados de consulta em cache; mesma versão de DB que staging.
Paridade de env de workers?
Workers compartilham crate de configuração com API; mesmo PR de promoção quando possível.
Depuração local de prod?
Sandbox com flags semelhantes às de prod, nunca credenciais de prod no laptop.
Rotacionar segredos?
Janela de leitura dupla durante a rotação; documentar no runbook de promoção.
MSRV entre ambientes?
Mesmo compilador; evitar desvio "staging nightly, prod fixado" exceto por canary breve.
ETL Polars env?
Ambiente de dados separado com credenciais de warehouse; não o mesmo ns k8s que a API.
Auditar alterações de configuração?
Histórico do Git para arquivos de valores; log de auditoria do vault para acesso a segredos.
Relacionados
- Gerenciamento de Releases - tempo de promoção
- Flags de Funcionalidades & Entrega Progressiva - flag por env
- Gerenciamento de Segredos - padrões de segredos
- Design de Configuração e Funcionalidades - design
- Depuração de Produção - repro de env
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.