Secrets Manager & SSM
O AWS Secrets Manager armazena segredos rotacionáveis; o SSM Parameter Store guarda configurações e strings seguras. Aplicativos Python buscam valores na inicialização ou em caso de cache inválido com boto3, em vez de embutir credenciais em imagens.
Receita
import boto3
sm = boto3.client("secretsmanager")
resp = sm.get_secret_value(SecretId="prod/db/password")
password = resp["SecretString"]Quando usar isso:
- Senhas de banco de dados e chaves de API com rotação
- Configuração não secreta no Parameter Store (
String) - Parâmetros seguros (
SecureString) com criptografia KMS - Injeção em ECS/Lambda via referências de definição de tarefa
Exemplo de Trabalho
Busca JSON de segredo, analisa campos e lê parâmetros SSM com cache.
import json
import time
from typing import Any
import boto3
class SecretCache:
def __init__(self, ttl_seconds: int = 300) -> None:
self._ttl = ttl_seconds
self._cache: dict[str, tuple[float, Any]] = {}
self._sm = boto3.client("secretsmanager")
self._ssm = boto3.client("ssm")
def get_secret_json(self, secret_id: str) -> dict:
now = time.monotonic()
if secret_id in self._cache:
expires, value = self._cache[secret_id]
if now < expires:
return value
resp = self._sm.get_secret_value(SecretId=secret_id)
data = json.loads(resp["SecretString"])
self._cache[secret_id] = (now + self._ttl, data)
return data
def get_parameter(self, name: str, decrypt: bool = True) -> str:
resp = self._ssm.get_parameter(Name=name, WithDecryption=decrypt)
return resp["Parameter"]["Value"]
if __name__ == "__main__":
cache = SecretCache()
creds = cache.get_secret_json("app/database")
print(creds.get("username"))
region = cache.get_parameter("/app/region")
print(region)O que isso demonstra:
SecretStringfrequentemente contém JSON - analise uma vez e armazene em cache na memória- Cache TTL evita chamadas à API a cada requisição, permitindo a atualização de segredos rotacionados
- Nomes de caminho SSM (
/app/region) organizam parâmetros por serviço
Mergulho Profundo
Secrets Manager vs SSM
| Recurso | Secrets Manager | SSM Parameter Store |
|---|---|---|
| Rotação | Lambdas integradas | Manual/personalizada |
| Custo | Mais alto por segredo | Mais barato para config simples |
| Caso de uso | Senhas de DB, chaves de API | Flags de recursos, URLs |
Como Funciona
- Política IAM concede
secretsmanager:GetSecretValueoussm:GetParameterem ARNs específicos - Permissões KMS de descriptografia necessárias para
SecureStringe muitos segredos - Rotação atualiza o valor do segredo; aplicativos devem atualizar o cache ou reiniciar conforme agendado
Notas Python
from botocore.exceptions import ClientError
def get_secret_or_none(secret_id: str) -> str | None:
try:
return boto3.client("secretsmanager").get_secret_value(SecretId=secret_id)["SecretString"]
except ClientError as exc:
if exc.response["Error"]["Code"] == "ResourceNotFoundException":
return None
raiseArmadilhas
- Buscar segredo a cada requisição - latência e limitação de taxa da API. Correção: cache no nível do processo com TTL.
- Registrar valores de segredo - vazamento de credenciais no agregador de logs. Correção: registrar apenas o ARN do segredo.
- Embutir nomes de segredo sem prefixo de ambiente - script de produção acessa segredo de desenvolvimento. Correção: caminhos
/app/${ENV}/db. - Sem escopo de recurso IAM -
secretsmanager:*em*. Correção: políticas em nível de ARN por segredo. - Ignorar rotação - senha desatualizada após rotação. Correção: TTL menor ou webhook de rotação SSM/Secrets.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| HashiCorp Vault | Plataforma de segredos multi-cloud | Pilha AWS simples |
| Segredos K8s | Implantação nativa Kubernetes | EC2/Lambda simples sem sealed secrets |
| Variáveis de ambiente do CI | Injeção efêmera no momento da implantação | Aplicativos precisam de rotação em tempo de execução |
FAQs
Secrets Manager vs SSM SecureString?
Secrets Manager para credenciais que precisam de rotação; SSM SecureString para segredos estáticos e configuração com KMS.
Como passar segredos para Lambda?
Referencie o ARN do segredo em uma variável de ambiente; Lambda resolve na inicialização, ou busque no código com cache.
Posso usar pydantic-settings?
Fonte de configurações personalizada que chama boto3 no primeiro acesso, depois armazena em cache - mantém a validação em um só lugar.
Como testar sem AWS?
Injete SecretCache falso nos testes; moto suporta mocks básicos de secretsmanager.
E o desenvolvimento local?
.env excluído do git para laptops; produção usa apenas Secrets Manager/SSM.
Como funcionam as hierarquias no SSM?
get_parameters_by_path carrega /app/prod/* em uma chamada para configuração de bootstrap.
Quem pode descriptografar?
IAM deve permitir ssm:GetParameter e kms:Decrypt na CMK usada pelo parâmetro.
Qual a velocidade da rotação?
Planeje uma breve janela de dupla senha no banco de dados ou retentativa no aplicativo em caso de falha de autenticação durante o evento de rotação.
Segredos devem estar em variáveis de ambiente?
Aceitável quando injetado na inicialização do contêiner a partir de uma referência de segredo - não quando embutido nas camadas da imagem.
Como auditar o acesso?
CloudTrail registra chamadas GetSecretValue - alerte sobre principais ou regiões incomuns.
Relacionados
- Padrões de Credenciais e Sessão - IAM para acesso a segredos
- Gerenciamento de Configuração - renderizar sem segredos no git
- Configuração e Segredos em Produção - injeção 12-factor
- Noções Básicas de Boto3 - sessões e clientes
- Melhores Práticas do SDK da Nuvem - menor privilégio
Versões da Stack: 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+.