Secrets Manager y SSM
AWS Secrets Manager almacena secretos rotables; SSM Parameter Store guarda configuraciones y cadenas seguras. Las aplicaciones Python obtienen valores al inicio o en caso de caché no válida con boto3 en lugar de incrustar credenciales en las imágenes.
Receta
import boto3
sm = boto3.client("secretsmanager")
resp = sm.get_secret_value(SecretId="prod/db/password")
password = resp["SecretString"]Cuándo usar esto:
- Contraseñas de bases de datos y claves API con rotación
- Configuración no secreta en Parameter Store (
String) - Parámetros seguros (
SecureString) con cifrado KMS - Inyección en ECS/Lambda a través de referencias de definición de tareas
Ejemplo de Trabajo
Obtiene un secreto JSON, analiza campos y lee parámetros SSM con caché.
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)Lo que esto demuestra:
SecretStringa menudo contiene JSON; analízalo una vez y almacena en caché en memoria.- La caché TTL evita golpear la API en cada solicitud, permitiendo la recuperación de la rotación.
- Los nombres de estilo de ruta de SSM (
/app/region) organizan los parámetros por servicio.
Profundización
Secrets Manager vs SSM
| Característica | Secrets Manager | SSM Parameter Store |
|---|---|---|
| Rotación | Lambdas integradas | Manual/personalizada |
| Costo | Más alto por secreto | Más barato para configuración simple |
| Caso de uso | Contraseñas de BD, claves API | Indicadores de funciones, URLs |
Cómo Funciona
- La política de IAM otorga
secretsmanager:GetSecretValueossm:GetParameteren ARNs específicos. - Se requieren permisos de KMS para descifrar
SecureStringy muchos secretos. - La rotación actualiza el valor del secreto; las aplicaciones deben actualizar la caché o reiniciarse según lo programado.
Notas de 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
raiseErrores Comunes
- Obtener el secreto en cada solicitud: latencia y limitación de la API. Solución: caché a nivel de proceso con TTL.
- Registrar valores secretos: fuga de credenciales en el agregador de registros. Solución: registrar solo el ARN del secreto.
- Nombres de secretos codificados sin prefijo de entorno: script de producción accede al secreto de desarrollo. Solución: rutas
/app/${ENV}/db. - Sin alcance de recursos IAM:
secretsmanager:*en*. Solución: políticas a nivel de ARN por secreto. - Ignorar la rotación: contraseña obsoleta después de la rotación. Solución: TTL más corto o webhook de rotación de SSM/Secrets.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| HashiCorp Vault | Plataforma de secretos multicloud | Pila simple solo de AWS |
| Secretos de K8s | Despliegue nativo de Kubernetes | EC2/Lambda simple sin secretos sellados |
| Variables de entorno de CI | Inyección efímera en tiempo de despliegue | Las aplicaciones necesitan rotación en tiempo de ejecución |
Preguntas Frecuentes
¿Secrets Manager vs SSM SecureString?
Secrets Manager para credenciales que necesitan rotación; SSM SecureString para secretos estáticos y configuración con KMS.
¿Cómo paso secretos a Lambda?
Referencia el ARN del secreto en una variable de entorno; Lambda resuelve al inicializar, o obtén en el código con caché.
¿Puedo usar pydantic-settings?
Una fuente de configuración personalizada que llama a boto3 al primer acceso y luego almacena en caché, manteniendo la validación en un solo lugar.
¿Cómo pruebo sin AWS?
Inyecta una SecretCache falsa en las pruebas; moto soporta mocks básicos de secretsmanager.
¿Qué pasa con el desarrollo local?
.env excluido de git para portátiles; producción solo usa Secrets Manager/SSM.
¿Cómo funcionan las jerarquías en SSM?
get_parameters_by_path carga /app/prod/* en una sola llamada para la configuración de arranque.
¿Quién puede descifrar?
IAM debe permitir tanto ssm:GetParameter como kms:Decrypt en la CMK utilizada por el parámetro.
¿Qué tan rápida es la rotación?
Planifica una breve ventana de doble contraseña en la base de datos o reintenta la aplicación ante fallos de autenticación durante el evento de rotación.
¿Deben los secretos estar en variables de entorno?
Aceptable cuando se inyectan al inicio del contenedor desde una referencia de secreto, no cuando se incrustan en las capas de la imagen.
¿Cómo audito el acceso?
CloudTrail registra las llamadas a GetSecretValue; alerta sobre principales o regiones inusuales.
Relacionado
- Patrones de Credenciales y Sesiones - IAM para acceso a secretos
- Gestión de Configuración - renderizar sin secretos en git
- Configuración y Secretos en Producción - inyección 12-factor
- Conceptos Básicos de Boto3 - sesiones y clientes
- Mejores Prácticas de SDK en la Nube - mínimo privilegio
Versiones de la Pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 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+, y uv 0.6+.