Configuração e Segredos em Produção
Serviços Python de produção leem a configuração do ambiente, validam com modelos de configurações do Pydantic 2 e carregam segredos de armazenamentos da plataforma - nunca de arquivos embutidos em imagens de contêiner ou git.
Receita
from pydantic import Field, SecretStr
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file=None)
database_url: SecretStr
log_level: str = "info"
environment: str = Field(default="dev")
settings = Settings()Quando usar isso:
- Todo contêiner/Lambda implantado na AWS, K8s ou PaaS
- Separando a configuração por ambiente com a mesma tag de imagem
- Rotacionando credenciais sem reconstruir imagens
- Auditar quem pode ler quais segredos via IAM/RBAC
Exemplo de Trabalho
Configurações com .env local opcional apenas em desenvolvimento, produção a partir do ambiente injetado + busca no SSM na inicialização.
import os
from functools import lru_cache
import boto3
from pydantic import Field, SecretStr
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
model_config = SettingsConfigDict(extra="ignore")
O que isso demonstra:
SecretStrevita o registro acidental do segredo bruto na representação (repr)- Produção usa referência ao nome do parâmetro SSM, não o valor do segredo no ambiente
- Singleton de configurações
lru_cachepor processo corresponde ao padrão de dependência do FastAPI
Mergulho Profundo
Regras de Configuração 12-Factor
- Armazene a configuração no ambiente
- Separação estrita da configuração do código
- Trate serviços de apoio como recursos anexados
Injeção pela Plataforma
| Plataforma | Mecanismo |
|---|---|
| Kubernetes | envFrom de Secret/ConfigMap |
| ECS | segredos da definição de tarefa do SSM |
| Lambda | extensão de ambiente + Secrets Manager |
| GitHub Actions | segredos de ambiente |
Notas de Python
# Dependência do FastAPI
from fastapi import Depends
def settings_dep() -> Settings:
return get_settings()
@app.get("/health")
def health(s: Settings = Depends(settings_dep)):
return {"env": s.environment}Armadilhas
- Arquivo
.envna imagem de produção - segredos em camadas. Correção:dotenvapenas para desenvolvimento; injeção pela plataforma de produção. - Registrar
settings.model_dump()- vaza segredos. Correção:model_dump(exclude={"database_url"})oureprpersonalizado com exclusão. - Mesma configuração de imagem para staging/prod - DB errado sobrescrito. Correção: ARNs de segredos específicos do ambiente apenas no manifesto de implantação.
- Ambiente legível por qualquer um em
/proc- risco de escape de contêiner mitigado por RBAC e segredos mínimos por pod. - Recarregamento a quente da configuração sem reinicialização - raro em aplicativos web Python; documentar a reinicialização necessária após a rotação de segredos.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Agente sidecar Vault | Credenciais de banco de dados dinâmicas | Segredos estáticos simples do SSM |
| Sealed Secrets | Segredos criptografados GitOps no git | SSM já é padrão |
| Arquivos de configuração em volume | Grandes arquivos YAML não secretos | Segredos no mesmo arquivo |
FAQs
pydantic-settings vs os.environ?
Settings fornece validação, tipos e aliases - vale a pena para todo serviço de produção.
Como Flask/Django carregam configurações?
Módulo de configurações do Django a partir do ambiente; Flask app.config.from_prefixed_env() ou wrapper pydantic.
Como rotacionar a senha do DB?
Janela de senha dupla no RDS + reinicialização em cascata dos pods para capturar o novo valor do SSM.
ConfigMap para segredos em K8s?
Antipadrão - use o recurso Secret ou um operador de segredos externo para SSM.
Como testar configurações?
monkeypatch.setenv em pytest antes de get_settings.cache_clear().
Flags de recursos?
Flags não secretas em ConfigMap/ambiente; flags dinâmicas via LaunchDarkly/etc. quando necessário.
Como isso se relaciona com a templating de infraestrutura?
A infraestrutura renderiza os manifestos de implantação com ARNs de segredos; o aplicativo busca os valores em tempo de execução - veja Gerenciamento de Configuração em automação de infraestrutura.
Limites de tamanho de ambiente do Lambda?
4KB de ambiente total - use SSM/Secrets para grandes blocos de configuração.
Como documentar variáveis de ambiente necessárias?
Tabela no README + descrições dos campos Settings + comentários no manifesto de implantação.
Valores padrão são seguros?
Apenas para padrões de desenvolvimento não secretos; a falta de um campo obrigatório em produção deve falhar rapidamente na inicialização.
Relacionados
- Secrets Manager & SSM - busca com boto3
- Gerenciamento de Configuração - artefatos de implantação de templating
- Dockerizando Python - sem segredos na imagem
- Kubernetes para Aplicativos Python - secretRef
- Melhores Práticas de Implantação - checklist de configuração
Versões das Pilhas: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ e uv 0.6+.