Uma referência rápida dos padrões arquiteturais que o exame DVA-C02 avalia. Leia de cima a baixo ou pule para uma seção.
Desenvolvimento com Serviços AWS
Alvo de invocação estável enquanto você implanta novo código Lambda.
Publique versões numeradas e imutáveis; exponha um alias que aponta para uma versão. Os chamadores invocam o ARN do alias.
Por quê: Versões são snapshots congelados de código + configuração; aliases fornecem indireção para que os chamadores nunca invoquem `$LATEST` diretamente.
Implantação gradual de uma nova versão do Lambda com rollback automático em caso de erros.
Alias com roteamento de versão ponderado (por exemplo, 90/10). CodeDeploy `LambdaCanary10Percent5Minutes` ou `LambdaLinear*` move o tráfego e monitora alarmes do CloudWatch.
Por quê: O roteamento de tráfego integrado + rollback acionado por alarmes remove a lógica de canary codificada manualmente.
Injetar configurações (URL do DB, feature flags) sem reimplementações.
Variáveis de ambiente Lambda. Criptografadas em repouso com KMS; referencie um CMK personalizado para criptografia adicional em trânsito na recuperação.
Lambda precisa consumir um stream do Kinesis / DynamoDB Stream / fila SQS / tópico MSK.
Mapeamento de fonte de evento (baseado em pull). Lambda consulta; tamanho do lote + janela máxima de lote ajustam throughput vs latência. Falha → DLQ via destino On-Failure.
Por quê: Para fontes pull, o serviço não pode invocar Lambda diretamente; o mapeamento é o adaptador de polling do Lambda.
Escolha o tipo de API Gateway para uma nova API REST.
HTTP API: mais barata, mais rápida, autenticação JWT integrada, mais simples. REST API: recursos completos (templates de mapeamento, validadores de requisição, WAF, private endpoints, X-Ray, cache de API).
Por quê: Prefira HTTP API, a menos que você precise de um recurso exclusivo da REST. As APIs WebSocket são um produto separado para tempo real com estado.
Validar um token personalizado (não Cognito, não IAM) antes de rotear a requisição.
Autorizador Lambda. O tipo TOKEN lê um cabeçalho; o tipo REQUEST lê o contexto completo da requisição. Retorna política IAM + principalId. Cacheado por identidade para TTL.
Precisa de um padrão de acesso adicional além da chave primária.
GSI: chave de partição + ordenação alternativa, eventualmente consistente, capacidade separada, pode ser adicionada a qualquer momento. LSI: mesma chave de partição, chave de ordenação alternativa, opção de consistência forte, deve ser criada na criação da tabela.
Fazer upload de um arquivo grande (≫100 MB) de forma confiável a partir do SDK.
`CreateMultipartUpload` → `UploadPart` paralelo → `CompleteMultipartUpload`. O gerenciador de transferência de alto nível do SDK lida com o dimensionamento das partes automaticamente.
Por quê: Obrigatório para >5 GB; recomendado para ≥100 MB. Partes com falha são re-carregadas independentemente. Defina o ciclo de vida para abortar multiparts incompletos para recuperar armazenamento.
Escolha um tipo de fluxo de trabalho do Step Functions.
Standard: longa duração (≤1 ano), exatamente uma vez, $0.025/1k transições, histórico completo. Express: ≤5 min, pelo menos uma vez ou no máximo uma vez, cobrado por requisição + duração; para ETL/streaming de alto volume.
A etapa do fluxo de trabalho falha; desejo tentar novamente com backoff e rotear para um estado de recuperação.
Array `Retry` (por estado, com `BackoffRate` + `MaxAttempts`) e `Catch` para roteamento de falha terminal. Corresponda por `ErrorEquals` (por exemplo, `States.TaskFailed`, nomes de erros personalizados).
O consumidor puxa uma mensagem, mas trava antes de excluí-la.
Mensagem oculta por VisibilityTimeout segundos, então reaparece para reentrega. Ajuste para o tempo de processamento esperado mais longo + buffer.
Por quê: Muito curto → processamento duplicado. Muito longo → recuperação lenta em caso de falha. ChangeMessageVisibility estende em trânsito se necessário.
O código em EC2 / tarefa ECS / Lambda precisa de acesso à AWS - sem chaves embutidas.
Anexe uma role IAM via perfil de instância (EC2) ou role de tarefa/execução (ECS/Lambda). O SDK puxa credenciais temporárias do serviço de metadados; auto-rotaciona.
Acesso entre contas a partir de código de aplicativo ou CLI.
`sts:AssumeRole` do principal chamador. A política de confiança da role alvo lista o chamador como um `Principal`. Retorna credenciais temporárias (máximo 12 horas).
AssumeRole entre contas está falhando - a permissão parece correta.
Ambos devem ser configurados: a política de confiança na role alvo lista o chamador como Principal; a política de identidade do chamador permite `sts:AssumeRole` no ARN da role alvo.
Por quê: Confiança = quem pode assumir. Permissão = o que podem fazer uma vez assumido. Qualquer um faltando → AccessDenied.
Permitir que uma equipe gerencie roles IAM por conta própria, mas limite as permissões que podem conceder.
Política de limite de permissão na role criadora da equipe. Qualquer role que eles criem com o limite tem a interseção da política de identidade + limite como permissões efetivas.
Cliente SPA / móvel vs serviço do lado do servidor chamando Cognito.
Clientes públicos (SPA, móvel) → cliente de aplicativo sem secret. Clientes confidenciais (servidor) → cliente de aplicativo com secret; o cliente deve incluir `SECRET_HASH` (HMAC de username + clientId).
Distinguir token de ID do Cognito vs token de Acesso vs token de Refresh.
ID = claims de identidade do usuário (consumir no cliente). Acesso = autorização com escopo para APIs. Refresh = obter novos tokens de ID/acesso. Todos são JWTs, exceto Refresh.
UI de login/cadastro pronta para uso sem construir formulários.
Cognito Hosted UI. Fluxo de código de autorização OAuth2: redirecionar para `/oauth2/authorize` → URL de callback com `code` → troca em `/oauth2/token`.
Criptografar um pequeno segredo (≤4 KB) diretamente com KMS.
`kms:Encrypt` retorna um blob de texto cifrado contendo o ARN da chave. `kms:Decrypt` recupera o texto puro se o chamador tiver permissão e (se especificado) o `EncryptionContext` corresponder.
Criptografar dados grandes com KMS sem atingir o limite de criptografia direta de 4 KB.
Criptografia de envelope. `GenerateDataKey` retorna DEK em texto puro + DEK criptografado; criptografa dados localmente com DEK, armazena DEK criptografado ao lado, descarta DEK em texto puro.
Por quê: KMS impõe controle de acesso sobre o pequeno DEK; a criptografia em massa acontece localmente na velocidade da linha.
Referenciar uma chave KMS indiretamente para que a CMK subjacente possa girar sem alterações no código.
Use `alias/my-key` (ou `arn:aws:kms:region:acct:alias/my-key`). Atualize o alias para apontar para uma nova CMK; os consumidores continuam funcionando.
Rotação nativa do Secrets Manager (Lambda gerenciada) para Aurora/RDS/DocumentDB/Redshift. O padrão master/user usa um segredo mestre separado para rotacionar o segredo do usuário.
Armazenar um valor de configuração com criptografia KMS em repouso no Parameter Store.
Tipo de parâmetro SecureString. Especifique `--key-id` para uma CMK personalizada; caso contrário, usa `aws/ssm`. Descriptografar requer `kms:Decrypt` na CMK.
Restringir o acesso ao CloudFront a usuários autenticados.
URLs assinadas (recurso único) ou cookies assinados (múltiplos recursos, SPAs/streaming). Assine com um par de chaves do CloudFront armazenado como uma chave pública em um grupo de chaves do CloudFront.
SSE-S3 (AES-256 gerenciado, padrão), SSE-KMS (CMK, auditoria via CloudTrail, política de chave), SSE-C (chaves fornecidas pelo cliente, você gerencia), DSSE-KMS (camada dupla para alta conformidade).
Encontrar roles/políticas que concedem acesso fora da conta ou são excessivamente permissivas.
IAM Access Analyzer. Descobertas sobre acesso externo; geração de políticas a partir do histórico do CloudTrail para dimensionamento de privilégio mínimo.
Variável de ambiente Lambda contém um valor sensível.
Lambda criptografa variáveis de ambiente em repouso com KMS por padrão. Para controle em trânsito/na descriptografia, configure uma CMK personalizada e use os assistentes de Criptografia no console para enviar texto cifrado pré-criptografado.
Assinar uma requisição HTTP personalizada para um serviço AWS a partir de código não-SDK.
Sigv4: derive a chave de assinatura de secret + data + região + serviço; canonicalize a requisição; assine; adicione os cabeçalhos `Authorization`, `X-Amz-Date`, `X-Amz-Security-Token`.
Acesso S3 negado mesmo que a política IAM o permita.
Ambas, a política de bucket e a política de identidade, são avaliadas. Uma negação explícita em qualquer lugar prevalece. As configurações de Bloqueio de Acesso Público também podem substituir a permissão.
`buildspec.yml` na raiz do repositório. Fases: `install`, `pre_build`, `build`, `post_build`. Saídas: `artifacts.files`, `cache.paths`. Variáveis de ambiente via `env.variables` ou referências do Parameter Store/Secrets Manager.
Mover o tráfego Lambda 10% e depois 100% com auto-rollback em caso de alarmes.
CodeDeploy com `LambdaCanary10Percent5Minutes` / `10Percent10Minutes` / `10Percent15Minutes` / `10Percent30Minutes`. Configure alarmes do CloudWatch no DeploymentGroup.
Implantação blue/green para um serviço ECS atrás de um ALB.
CodeDeploy Compute Platform = ECS. Cria conjunto de tarefas green; ALB move listener para grupo de destino green; aprovação manual opcional antes da troca de tráfego e antes de terminar o blue.
Atualizar uma frota EC2 sem tempo de inatividade total da frota.
Implantação in-place com configurações `OneAtATime` / `HalfAtATime` / `AllAtOnce`. Hooks do Auto Scaling Group pausam novos lançamentos de instância durante a implantação.
Hospedar repositórios Git dentro da AWS com acesso controlado por IAM.
CodeCommit. Autenticação: chaves SSH por usuário IAM, credenciais Git HTTPS por usuário IAM, ou auxiliar de credenciais da AWS CLI. Gatilhos via SNS / Lambda em push.
Escolha uma ferramenta IaC para um aplicativo serverless.
CDK: linguagens de programação (TS/Python/Java/Go/.NET), constructs de aplicativo completos, padrões multi-recurso. SAM: extensão YAML de CFN, focado em serverless, mais simples. Ambos compilam para CloudFormation.
O CloudFormation faz rollback automático, a menos que `DisableRollback` seja verdadeiro. Preso em `UPDATE_ROLLBACK_FAILED`? Use `ContinueUpdateRollback` com `ResourcesToSkip`.
Prevenir atualização acidental de um recurso crítico (ex: DB RDS) durante atualizações de stack.
Política de stack: JSON negando `Update:Replace` e `Update:Delete` no ID lógico do recurso. Ignore com override explícito em uma atualização específica.
Stacks aninhadas (`AWS::CloudFormation::Stack` com `TemplateURL`) para reutilização pertencente a um pai. Cross-stack via Outputs + `Fn::ImportValue` para acoplamento mais forte entre stacks separadas.
Injetar um valor do Parameter Store ou segredo do Secrets Manager em um template CFN.
`{{resolve:ssm:/path/to/param}}`, `{{resolve:ssm-secure:/path}}`, `{{resolve:secretsmanager:secret-id:SecretString:json-key}}`. Resolvido no momento da implantação.
Escolha a política de implantação do Elastic Beanstalk.
All-at-once (mais rápido, tempo de inatividade), Rolling (sem instâncias extras, capacidade parcial), Rolling com lote adicional (sem perda de capacidade, custo extra), Immutable (novo ASG, mais seguro), Blue/Green (ambiente separado, troca de CNAMEs).
Personalizar ambiente Elastic Beanstalk (pacotes, arquivos, comandos de container).
YAML `.ebextensions/*.config` no pacote de origem. Plataformas mais recentes: scripts de shell `.platform/hooks/...` para o ciclo de vida prebuild/predeploy/postdeploy.
Precisa de um artefato Lambda estável e nunca mutável.
Publique uma versão numerada. Código + a maioria das configurações (memória, tempo limite, variáveis de ambiente, layers) congelam. `$LATEST` é mutável; versões numeradas não são.
Enviar uma imagem Docker para ECR para ECS / EKS / Lambda.
`aws ecr get-login-password | docker login` → `docker tag` → `docker push`. Imagens de container Lambda: imagem puxada uma vez na implantação; a imagem marcada deve estar na mesma região.
Rastrear uma requisição que se dispersa entre Lambda → DynamoDB → HTTP externo.
Segmentos X-Ray por salto de serviço, subsegmentos para chamadas downstream. O mapa de serviço visualiza topologia + latência. As regras de amostragem limitam o volume.
Anexar dados pesquisáveis vs de referência a um trace do X-Ray.
Anotações: indexadas, filtráveis no console (ex: `customerId`, `tier`). Metadados: não indexados, formato livre (corpo da requisição, corpo da resposta para depuração).
Gerar uma métrica personalizada a partir de um padrão de log (ex: contagem de `OutOfMemoryError`).
Filtro de métrica no grupo de logs. O padrão corresponde a eventos de log; o filtro cria uma métrica personalizada do CloudWatch na qual você pode configurar um alarme.
Cold starts do Lambda atingem metas de latência p99.
Provisioned Concurrency para carga previsível. SnapStart para código Java/Python com inicialização pesada. Dependências leves, use ARM/Graviton, mova inicialização pesada para fora do handler.
`TooManyRequestsException` do Lambda; limite de concorrência atingido.
Concorrência reservada por função (limites + reservas) ou solicite aumento do limite no nível da conta. Invocações assíncronas são enfileiradas e retentadas; invocações síncronas geram erro.
CloudWatch `WriteThrottleEvents` / `ReadThrottleEvents`. Mude para o modo On-Demand, aumente a capacidade provisionada ou corrija uma partição quente com um design de chave melhor.
Uma chave de partição recebe tráfego desproporcional; throttling sob baixa carga agregada.
Redesenhe a chave de partição com alta cardinalidade. Para escritas: prefixe com shard aleatório (ex: `shard#user`); para leituras: scatter-gather através de shards.
Escolha uma estratégia de cache para ElastiCache / DAX.
Carregamento lento (cache miss → DB → popular cache): apenas cacheia dados solicitados, mas propenso a dados desatualizados. Write-through (escreve no cache + DB em cada escrita): sempre atualizado, mas as escritas têm custo extra. TTL limita a obsolescência de qualquer forma.
Nível de conta padrão: 10.000 req/seg + 5.000 de burst. Overrides por estágio e por método; throttling por chave via Planos de Uso para controle de nível de parceiro.
CloudFront serve conteúdo desatualizado após uma implantação.
Invalide caminhos (`/index.html`, `/*`) - cobrado por caminho acima de 1000/mês gratuito. Melhor: nomes de arquivo versionados (`app.abc123.js`) para que o cache seja naturalmente ignorado.