Una referencia escaneable de patrones arquitectónicos que evalúa el examen DVA-C02. Lee de arriba a abajo o salta a una sección.
Desarrollo con Servicios de AWS
Objetivo de invocación estable mientras se sube nuevo código Lambda.
Publicar versiones numeradas e inmutables; exponer un alias que apunte a una versión. Los llamadores invocan el ARN del alias.
Por qué: Las versiones son instantáneas congeladas de código + configuración; los alias proporcionan indirección para que los llamadores nunca invoquen `$LATEST` directamente.
Despliegue gradual de una nueva versión Lambda con rollback automático en caso de errores.
Alias con enrutamiento de versiones ponderado (por ejemplo, 90/10). CodeDeploy `LambdaCanary10Percent5Minutes` o `LambdaLinear*` desplaza el tráfico y monitorea las alarmas de CloudWatch.
Por qué: El desplazamiento de tráfico incorporado + el rollback impulsado por alarmas elimina la lógica canary codificada a mano.
Inyectar configuración (URL de BD, indicadores de funciones) sin volver a desplegar.
Variables de entorno de Lambda. Cifradas en reposo con KMS; referenciar una CMK personalizada para cifrado adicional en tránsito en el momento de la recuperación.
Lambda necesita consumir un stream de Kinesis / DynamoDB Stream / cola SQS / tópico MSK.
Mapeo de origen de evento (basado en pull). Lambda sondea; el tamaño de lote + la ventana de lotes máxima ajustan el rendimiento vs la latencia. Fallo → DLQ a través del destino On-Failure.
Por qué: Para fuentes pull, el servicio no puede invocar Lambda directamente; el mapeo es el adaptador de sondeo de Lambda.
Elegir tipo de API Gateway para una nueva API REST.
HTTP API: más barata, más rápida, autenticación JWT integrada, más simple. REST API: características completas (plantillas de mapeo, validadores de solicitudes, WAF, puntos finales privados, X-Ray, caché de API).
Por qué: Por defecto, use HTTP API a menos que necesite una característica exclusiva de REST. Las API WebSocket son un producto separado para tiempo real con estado.
Promover cambios de API de dev → test → prod sin volver a desplegar APIs separadas.
Etapas en una sola API. Despliegue una etapa para publicar; las variables de etapa contienen valores específicos del entorno, como nombres de alias de Lambda.
Validar un token personalizado (no Cognito, no IAM) antes de enrutar la solicitud.
Autorizador Lambda. El tipo TOKEN lee un encabezado; el tipo REQUEST lee el contexto completo de la solicitud. Devuelve política IAM + principalId. Cacheado por identidad para TTL.
Necesita un patrón de acceso adicional más allá de la clave primaria.
GSI: clave de partición + ordenación alternativa, eventualmente consistente, capacidad separada, se puede añadir en cualquier momento. LSI: misma clave de partición, clave de ordenación alternativa, opción de consistencia fuerte, debe crearse al crear la tabla.
Subir un archivo grande (≫100 MB) de forma fiable desde el SDK.
`CreateMultipartUpload` → `UploadPart` en paralelo → `CompleteMultipartUpload`. El gestor de transferencias de alto nivel del SDK maneja el tamaño de las partes automáticamente.
Por qué: Requerido >5 GB; recomendado ≥100 MB. Las partes fallidas se vuelven a subir de forma independiente. Configure el ciclo de vida para abortar multiparts incompletos para recuperar almacenamiento.
Iniciar sesión de un usuario desde un cliente móvil/web público sin enviar la contraseña.
Cognito User Pool con flujo `USER_SRP_AUTH`. El cliente calcula la prueba SRP; el backend nunca ve la contraseña. Devuelve tokens de ID + acceso + actualización.
Usuario federado (Google/Apple/Cognito UP) necesita credenciales temporales de AWS para llamar directamente a las API de AWS desde una aplicación móvil.
Cognito Identity Pool. Intercambia token de proveedor de identidad → rol IAM → credenciales temporales de AWS vía STS.
Por qué: Los User Pools autentican usuarios; los Identity Pools los autorizan a recursos de AWS.
Elegir un tipo de flujo de trabajo de Step Functions.
Standard: de larga duración (≤1 año), exactamente una vez, $0.025/1k transiciones, historial completo. Express: ≤5 min, al menos una vez o como máximo una vez, se factura por solicitud + duración; para ETL/streaming de alto volumen.
Un paso del flujo de trabajo falla; quiere reintento con retroceso y enrutamiento a un estado de recuperación.
Matriz `Retry` (por estado, con `BackoffRate` + `MaxAttempts`) y `Catch` para enrutamiento de fallos terminales. Coincidir por `ErrorEquals` (por ejemplo, `States.TaskFailed`, nombres de error personalizados).
Activar Lambda en un horario cron o al coincidir eventos entrantes.
Regla de EventBridge. Programación: `rate(...)` o `cron(...)`. Patrón: filtro de eventos JSON; coincide con fuente, tipo de detalle, campos de detalle.
Procesar mensajes estrictamente en orden por cliente, con deduplicación.
Cola SQS FIFO. `MessageGroupId` particiona el ordenamiento (paralelismo por grupo); `MessageDeduplicationId` (o deduplicación basada en contenido) elimina duplicados en 5 minutos.
El consumidor extrae un mensaje pero falla antes de eliminarlo.
Mensaje oculto durante VisibilityTimeout segundos, luego reaparece para reentrega. Ajustar al tiempo de procesamiento más largo esperado + buffer.
Por qué: Demasiado corto → procesamiento duplicado. Demasiado largo → recuperación lenta en caso de fallo. ChangeMessageVisibility extiende el tiempo en tránsito si es necesario.
El código en EC2 / tarea ECS / Lambda necesita acceso a AWS - sin claves embebidas.
Adjuntar un rol IAM vía perfil de instancia (EC2) o rol de tarea/ejecución (ECS/Lambda). El SDK obtiene credenciales temporales del servicio de metadatos; se auto-rota.
Acceso entre cuentas desde el código de la aplicación o la CLI.
`sts:AssumeRole` desde el principal del llamador. La política de confianza del rol de destino enumera al llamador como `Principal`. Devuelve credenciales temporales (máximo 12 horas).
AssumeRole entre cuentas está fallando - el permiso parece correcto.
Ambos deben estar configurados: la política de confianza en el rol de destino lista al llamador como Principal; la política de identidad del llamador permite `sts:AssumeRole` en el ARN del rol de destino.
Por qué: Confianza = quién puede asumir. Permiso = qué pueden hacer una vez asumido. Cualquiera que falte → AccessDenied.
Permitir que un equipo autogestione roles IAM, pero limitar los permisos que pueden otorgar.
Política de límites de permisos en el rol creador del equipo. Cualquier rol que creen con el límite tendrá la intersección de la política de identidad + el límite como permisos efectivos.
Cliente SPA / móvil vs servicio de lado del servidor llamando a Cognito.
Clientes públicos (SPA, móvil) → cliente de aplicación sin secreto. Clientes confidenciales (servidor) → cliente de aplicación con secreto; el cliente debe incluir `SECRET_HASH` (HMAC de nombre de usuario + clientId).
Distinguir token de ID de Cognito vs token de Acceso vs token de Actualización.
ID = claims de identidad de usuario (consumir en cliente). Acceso = autorización con ámbito para APIs. Actualización = obtener nuevos tokens de ID/acceso. Todos son JWTs excepto el de Actualización.
UI de inicio de sesión/registro lista para usar sin construir formularios.
Cognito Hosted UI. Flujo de código de autorización OAuth2: redirigir a `/oauth2/authorize` → URL de callback con `code` → intercambiar en `/oauth2/token`.
Cifrar un secreto pequeño (≤4 KB) directamente con KMS.
`kms:Encrypt` devuelve un blob de texto cifrado que contiene el ARN de la clave. `kms:Decrypt` recupera el texto plano si el llamador tiene permiso y (si se especifica) `EncryptionContext` coincide.
Cifrar grandes cantidades de datos con KMS sin alcanzar el límite de cifrado directo de 4 KB.
Cifrado de envolvente. `GenerateDataKey` devuelve DEK en texto plano + cifrado; cifrar datos localmente con DEK, almacenar DEK cifrado junto, descartar DEK en texto plano.
Por qué: KMS aplica control de acceso en el DEK pequeño; el cifrado masivo ocurre localmente a velocidad de línea.
Referenciar una clave KMS indirectamente para que la CMK subyacente pueda rotar sin cambios en el código.
Usar `alias/my-key` (o `arn:aws:kms:region:acct:alias/my-key`). Actualizar el alias para que apunte a una nueva CMK; los consumidores siguen funcionando.
Rotación nativa de Secrets Manager (Lambda gestionada) para Aurora/RDS/DocumentDB/Redshift. El patrón maestro/usuario utiliza un secreto maestro separado para rotar el secreto de usuario.
Almacenar un valor de configuración con cifrado KMS en reposo en Parameter Store.
Tipo de parámetro SecureString. Especificar `--key-id` para una CMK personalizada; de lo contrario, usa `aws/ssm`. El descifrado requiere `kms:Decrypt` en la CMK.
Restringir el acceso a CloudFront a usuarios autenticados.
URLs firmadas (recurso único) o cookies firmadas (múltiples recursos, SPAs/streaming). Firmar con un par de claves de CloudFront almacenado como clave pública en el grupo de claves de CloudFront.
SSE-S3 (AES-256 gestionado, predeterminado), SSE-KMS (CMK, auditoría vía CloudTrail, política de clave), SSE-C (claves suministradas por el cliente, usted las gestiona), DSSE-KMS (doble capa para alta conformidad).
Encontrar roles/políticas que otorgan acceso fuera de la cuenta o son demasiado permisivas.
IAM Access Analyzer. Hallazgos sobre acceso externo; generación de políticas a partir del historial de CloudTrail para el dimensionamiento de privilegios mínimos.
La variable de entorno de Lambda contiene un valor sensible.
Lambda cifra las variables de entorno en reposo con KMS por defecto. Para control en tránsito/en descifrado, configure una CMK personalizada y use los ayudantes de cifrado en la consola para enviar texto cifrado pre-cifrado.
Firmar una solicitud HTTP personalizada a un servicio de AWS desde código que no es SDK.
Sigv4: derivar clave de firma de secreto + fecha + región + servicio; canonicar solicitud; firmar; añadir encabezados `Authorization`, `X-Amz-Date`, `X-Amz-Security-Token`.
Acceso a S3 denegado a pesar de que la política IAM lo permite.
Se evalúan tanto la política de bucket como la política de identidad. Una denegación explícita en cualquier lugar tiene prioridad. La configuración de Bloqueo de Acceso Público también puede anular el permiso.
Construir un pipeline CI/CD: fuente → construcción → prueba → despliegue con aprobación manual de producción.
Etapas de CodePipeline, cada una con una o más acciones. Acción de Aprobación Manual entre Prueba y Despliegue. Fuente = CodeCommit / GitHub / S3 / ECR.
`buildspec.yml` en la raíz del repositorio. Fases: `install`, `pre_build`, `build`, `post_build`. Salidas: `artifacts.files`, `cache.paths`. Variables de entorno vía `env.variables` o referencias a Parameter Store/Secrets Manager.
Desviar el tráfico de Lambda 10% y luego 100% con rollback automático en caso de alarmas.
CodeDeploy con `LambdaCanary10Percent5Minutes` / `10Percent10Minutes` / `10Percent15Minutes` / `10Percent30Minutes`. Configurar alarmas de CloudWatch en DeploymentGroup.
Despliegue blue/green para un servicio ECS detrás de un ALB.
CodeDeploy Compute Platform = ECS. Crea un conjunto de tareas verde; ALB cambia el oyente al grupo de destino verde; aprobación manual opcional antes del cambio de tráfico y antes de terminar el azul.
Actualizar una flota de EC2 sin tiempo de inactividad de toda la flota.
Despliegue in situ con configuraciones `OneAtATime` / `HalfAtATime` / `AllAtOnce`. Los hooks de Auto Scaling Group pausan los lanzamientos de nuevas instancias durante el despliegue.
Alojar repositorios Git dentro de AWS con acceso controlado por IAM.
CodeCommit. Autenticación: claves SSH por usuario IAM, credenciales Git HTTPS por usuario IAM, o ayudante de credenciales de AWS CLI. Activadores vía SNS / Lambda en push.
Elegir una herramienta IaC para una aplicación sin servidor.
CDK: lenguajes de programación (TS/Python/Java/Go/.NET), constructos de aplicación completos, patrones de múltiples recursos. SAM: extensión YAML de CFN, centrada en sin servidor, más simple. Ambos compilan a CloudFormation.
Previsualizar cambios antes de aplicarlos a un stack de CloudFormation.
`create-change-set` → revisar JSON de adiciones/modificaciones/reemplazos → `execute-change-set`. Las acciones de reemplazo causan la recreación del recurso.
La actualización del stack falla a mitad de camino.
CloudFormation revierte automáticamente a menos que `DisableRollback` sea verdadero. ¿Atascado en `UPDATE_ROLLBACK_FAILED`? Usar `ContinueUpdateRollback` con `ResourcesToSkip`.
Prevenir la actualización accidental de un recurso crítico (por ejemplo, RDS DB) durante las actualizaciones del stack.
Política de stack: JSON que deniega `Update:Replace` y `Update:Delete` en el ID lógico del recurso. Saltar con anulación explícita en una actualización específica.
Stacks anidados (`AWS::CloudFormation::Stack` con `TemplateURL`) para reutilización propiedad de un padre. Cross-stack vía Outputs + `Fn::ImportValue` para acoplamiento más estrecho entre stacks separados.
Inyectar un valor de Parameter Store o un secreto de Secrets Manager en una plantilla CFN.
`{{resolve:ssm:/path/to/param}}`, `{{resolve:ssm-secure:/path}}`, `{{resolve:secretsmanager:secret-id:SecretString:json-key}}`. Resuelto en tiempo de despliegue.
Elegir política de despliegue de Elastic Beanstalk.
Todo a la vez (más rápido, tiempo de inactividad), Rolling (sin instancias extra, capacidad parcial), Rolling con lote adicional (sin pérdida de capacidad, costo extra), Inmutable (nuevo ASG, más seguro), Blue/Green (entorno separado, swap CNAMEs).
Personalizar el entorno de Elastic Beanstalk (paquetes, archivos, comandos de contenedor).
YAML `.ebextensions/*.config` en el paquete fuente. Plataformas más nuevas: scripts de shell `.platform/hooks/...` para el ciclo de vida prebuild/predeploy/postdeploy.
Necesita un artefacto Lambda estable y nunca mutable.
Publicar una versión numerada. Código + la mayoría de la configuración (memoria, tiempo de espera, variables de entorno, capas) se congelan. `$LATEST` es mutable; las versiones numeradas no lo son.
Empujar una imagen Docker a ECR para ECS / EKS / Lambda.
`aws ecr get-login-password | docker login` → `docker tag` → `docker push`. Imágenes de contenedor Lambda: la imagen se extrae una vez al desplegar; la imagen etiquetada debe estar en la misma región.
Reducir el costo de cómputo para cargas de trabajo ECS tolerantes a fallos.
Proveedor de capacidad Fargate Spot. Mezclar con Fargate regular a través de pesos y base. Las tareas pueden ser interrumpidas con un aviso de 2 minutos.
Rastrear una solicitud que se distribuye entre Lambda → DynamoDB → HTTP externo.
Segmentos de X-Ray por salto de servicio, subsegmentos para llamadas descendentes. El mapa de servicio visualiza la topología + latencia. Las reglas de muestreo limitan el volumen.
Adjuntar datos buscables vs datos de referencia a un rastreo de X-Ray.
Anotaciones: indexadas, filtrables en la consola (por ejemplo, `customerId`, `tier`). Metadatos: no indexados, de forma libre (cuerpo de la solicitud, cuerpo de la respuesta para depuración).
Generar una métrica personalizada a partir de un patrón de log (por ejemplo, recuento de `OutOfMemoryError`).
Filtro de métricas en el grupo de logs. El patrón coincide con los eventos de log; el filtro crea una métrica personalizada de CloudWatch sobre la cual se puede configurar una alarma.
Emitir métricas personalizadas desde Lambda sin una llamada a la API `PutMetricData` separada.
Formato de métrica incrustada (Embedded Metric Format): escribir JSON estructurado en stdout; CloudWatch analiza los logs y crea métricas. Más barato y asíncrono.
Por qué: Desacopla la ruta de la métrica de la ruta de la solicitud; sin latencia de API ni permiso IAM adicional.
Los arranques en frío de Lambda afectan los objetivos de latencia p99.
Concurrencia Aprovisionada para carga predecible. SnapStart para código Java/Python con inicialización pesada. Dependencias ligeras, usar ARM/Graviton, mover la inicialización pesada fuera del handler.
Elegir la memoria de Lambda para el mejor costo/latencia.
La memoria también escala CPU + red. Usar la máquina de estados AWS Lambda Power Tuning para barrer la memoria y encontrar el punto óptimo para su carga de trabajo.
`TooManyRequestsException` de Lambda; se alcanzó el límite de concurrencia.
Concurrencia reservada por función (límites + reservas) o solicitar un aumento de límite a nivel de cuenta. Las invocaciones asíncronas se encolan y reintentan; las invocaciones síncronas dan error.
CloudWatch `WriteThrottleEvents` / `ReadThrottleEvents`. Cambiar al modo On-Demand, aumentar la capacidad aprovisionada o arreglar una partición caliente con un mejor diseño de clave.
Una clave de partición recibe tráfico desproporcionado; limitación bajo baja carga agregada.
Rediseñar la clave de partición con alta cardinalidad. Para escrituras: prefijar con shard aleatorio (por ejemplo, `shard#user`); para lecturas: dispersar-recolectar entre shards.
Necesita latencia de lectura de DynamoDB de microsegundos sin cambiar la lógica de la aplicación.
Clúster DAX + SDK DAX como reemplazo directo del SDK de DynamoDB. Las lecturas se sirven desde la caché en memoria; las escrituras se escriben en la tabla.
Elegir estrategia de caché para ElastiCache / DAX.
Carga perezosa (fallo de caché → BD → poblar caché): solo almacena en caché los datos solicitados, pero propenso a la desactualización. Escritura a través (escribir en caché + BD en cada escritura): siempre fresco, pero las escrituras tienen un costo adicional. El TTL limita la desactualización en ambos casos.
Nivel de cuenta predeterminado: 10,000 solicitudes/seg + 5,000 de ráfaga. Anulaciones por etapa y por método; limitación por clave a través de Planes de Uso para control de nivel de socio.
CloudFront sirve contenido obsoleto después de un despliegue.
Invalidar rutas (`/index.html`, `/*`) - se factura por ruta más allá de 1000/mes gratis. Mejor: nombres de archivo versionados (`app.abc123.js`) para que la caché se omita naturalmente.