Сжатый справочник архитектурных шаблонов, проверяемых на экзамене DVA-C02. Читайте сверху вниз или переходите к нужному разделу.
Разработка с использованием сервисов AWS
Стабильная цель вызова во время загрузки нового кода Lambda.
Публикуйте нумерованные, неизменяемые версии; создавайте алиас, который указывает на версию. Вызывающие стороны используют ARN алиаса.
Почему: Версии - это замороженные снимки кода + конфигурации; алиасы обеспечивают косвенность, поэтому вызывающие стороны никогда не вызывают `$LATEST` напрямую.
Постепенное развертывание новой версии Lambda с автоматическим откатом при ошибках.
Алиас с маршрутизацией версий по весам (например, 90/10). CodeDeploy `LambdaCanary10Percent5Minutes` или `LambdaLinear*` перенаправляет трафик и отслеживает CloudWatch alarms.
Почему: Встроенное перенаправление трафика + откат по тревоге устраняет необходимость в написании собственной логики canary.
Внедрение конфигурации (URL базы данных, feature flags) без повторного развертывания.
Переменные среды Lambda. KMS-зашифрованы в состоянии покоя; для дополнительного шифрования при передаче во время извлечения используйте пользовательский CMK.
Lambda должна потреблять поток Kinesis / DynamoDB Stream / очередь SQS / тему MSK.
Event source mapping (pull-based). Lambda опрашивает; размер пакета + максимальное окно пакетирования настраивают пропускную способность по сравнению с задержкой. Сбой → DLQ через On-Failure destination.
Почему: Для pull-источников сервис не может напрямую вызывать Lambda; маппинг - это адаптер опроса Lambda.
Проверить пользовательский токен (не Cognito, не IAM) перед маршрутизацией запроса.
Lambda authorizer. Тип TOKEN считывает заголовок; тип REQUEST считывает полный контекст запроса. Возвращает политику IAM + principalId. Кэшируется для каждой идентичности на срок TTL.
Требуется дополнительный шаблон доступа помимо первичного ключа.
GSI: альтернативный ключ раздела + сортировки, в конечном итоге консистентный, отдельная емкость, может быть добавлен в любое время. LSI: тот же ключ раздела, альтернативный ключ сортировки, опция строгой консистентности, должен быть создан при создании таблицы.
Надежная загрузка большого файла (≫100 МБ) из SDK.
`CreateMultipartUpload` → параллельный `UploadPart` → `CompleteMultipartUpload`. Высокоуровневый менеджер передачи SDK автоматически управляет размером частей.
Почему: Требуется >5 ГБ; рекомендуется ≥100 МБ. Неудавшиеся части загружаются повторно независимо. Настройте жизненный цикл на прерывание незавершенных многочастных загрузок для освобождения хранилища.
Вход пользователя с общедоступного мобильного/веб-клиента без отправки пароля.
Cognito User Pool с потоком `USER_SRP_AUTH`. Клиент вычисляет SRP доказательство; backend никогда не видит пароль. Возвращает ID + access + refresh tokens.
Standard: длительный (≤1 год), ровно один раз, $0.025/1k переходов, полная история. Express: ≤5 мин, хотя бы один раз или не более одного раза, оплата за запрос + длительность; для высокопроизводительных ETL/streaming.
Шаг рабочего процесса завершается сбоем; требуется повторная попытка с экспоненциальной задержкой и маршрутизация в состояние восстановления.
Массив `Retry` (на состояние, с `BackoffRate` + `MaxAttempts`) и `Catch` для маршрутизации при окончательном сбое. Сопоставление по `ErrorEquals` (например, `States.TaskFailed`, пользовательские имена ошибок).
Обработка сообщений строго по порядку для каждого клиента, с дедупликацией.
Очередь SQS FIFO. `MessageGroupId` разделяет порядок (параллелизм на группу); `MessageDeduplicationId` (или дедупликация на основе содержимого) отбрасывает дубликаты в течение 5 минут.
Потребитель извлекает сообщение, но аварийно завершает работу до его удаления.
Сообщение скрывается на VisibilityTimeout секунд, затем снова появляется для повторной доставки. Настройте на самое длительное ожидаемое время обработки + буфер.
Почему: Слишком короткое → дублирующая обработка. Слишком длинное → медленное восстановление при сбое. ChangeMessageVisibility продлевает время в пути, если это необходимо.
Коду на EC2 / ECS task / Lambda требуется доступ к AWS - без встроенных ключей.
Прикрепите роль IAM через instance profile (EC2) или task/execution role (ECS/Lambda). SDK извлекает временные учетные данные из службы метаданных; автоматически обновляет их.
`sts:AssumeRole` от вызывающего principal. Политика доверия целевой роли указывает вызывающего как `Principal`. Возвращает временные учетные данные (максимум 12 часов).
Меж-аккаунтный AssumeRole завершается неудачей - разрешения кажутся правильными.
Должны быть установлены оба: политика доверия на целевой роли указывает вызывающего как Principal; политика идентичности вызывающего разрешает `sts:AssumeRole` на ARN целевой роли.
Почему: Доверие = кто может принять роль. Разрешение = что они могут делать после принятия роли. Отсутствие любого из них → AccessDenied.
Позволить команде самостоятельно управлять ролями IAM, но ограничить, какие разрешения они могут предоставлять.
Политика permission boundary на роли создателя команды. Любая роль, которую они создают с boundary, имеет пересечение политики идентичности + boundary как эффективные разрешения.
Различать токены Cognito ID token vs Access token vs Refresh token.
ID = утверждения личности пользователя (использовать на клиенте). Access = ограниченная авторизация для API. Refresh = получение новых токенов ID/access. Все JWT, кроме Refresh.
Готовый UI для входа/регистрации без создания форм.
Cognito Hosted UI. Поток авторизационного кода OAuth2: перенаправление на `/oauth2/authorize` → URL обратного вызова с `code` → обмен в `/oauth2/token`.
Зашифровать небольшой секрет (≤4 КБ) напрямую с помощью KMS.
`kms:Encrypt` возвращает ciphertext blob, содержащий ARN ключа. `kms:Decrypt` восстанавливает plaintext, если у вызывающего есть разрешение и (если указано) `EncryptionContext` совпадает.
Непрямое обращение к ключу KMS, чтобы базовый CMK мог ротироваться без изменения кода.
Используйте `alias/my-key` (или `arn:aws:kms:region:acct:alias/my-key`). Обновите алиас, чтобы он указывал на новый CMK; потребители продолжают работать.
Secrets Manager: встроенная ротация, нативная интеграция с RDS/Redshift/DocumentDB, $0.40/секрет/мес. Parameter Store SecureString: бесплатный уровень (Standard), нет встроенной ротации, стратифицированные пути `/app/env/key`.
Нативная ротация Secrets Manager (управляемая Lambda) для Aurora/RDS/DocumentDB/Redshift. Паттерн master/user использует отдельный мастер-секрет для ротации пользовательского секрета.
Хранить значение конфигурации с KMS-шифрованием в состоянии покоя в Parameter Store.
Тип параметра SecureString. Укажите `--key-id` для пользовательского CMK; в противном случае используется `aws/ssm`. Для дешифрования требуется `kms:Decrypt` на CMK.
Ограничить доступ к CloudFront для аутентифицированных пользователей.
Подписанные URL (один ресурс) или подписанные cookies (несколько ресурсов, SPAs/streaming). Подписывайте с помощью пары ключей CloudFront, хранящейся как публичный ключ в группе ключей CloudFront.
SSE-S3 (управляемый AES-256, по умолчанию), SSE-KMS (CMK, аудит через CloudTrail, политика ключей), SSE-C (ключи, предоставленные клиентом, управляете вы), DSSE-KMS (двухслойное для высокой соответствия).
Переменная среды Lambda содержит конфиденциальное значение.
Lambda по умолчанию шифрует переменные среды в состоянии покоя с помощью KMS. Для контроля при передаче/расшифровке настройте пользовательский CMK и используйте встроенные помощники шифрования в консоли для отправки предварительно зашифрованного текста.
Браузер → API Gateway с заголовком `Authorization` блокируется предварительным запросом.
Добавьте метод OPTIONS (mock integration). Разрешите `Authorization` в `Access-Control-Allow-Headers`; разрешите вызывающим сторонам в `Access-Control-Allow-Origin`.
Доступ к S3 запрещен, хотя политика IAM разрешает его.
Оцениваются как политика бакета, так и политика идентичности. Явный отказ где-либо имеет приоритет. Настройки Block Public Access также могут отменять разрешение.
`buildspec.yml` в корне репозитория. Фазы: `install`, `pre_build`, `build`, `post_build`. Выходные данные: `artifacts.files`, `cache.paths`. Переменные среды через `env.variables` или ссылки на Parameter Store/Secrets Manager.
CodeDeploy Compute Platform = ECS. Создает зеленый набор задач; ALB переключает слушателя на зеленую целевую группу; опциональное ручное утверждение перед переключением трафика и перед завершением синей группы.
Развертывание на месте с конфигурациями `OneAtATime` / `HalfAtATime` / `AllAtOnce`. Хуки Auto Scaling Group приостанавливают запуск новых экземпляров во время развертывания.
Размещать Git-репозитории внутри AWS с IAM-контролируемым доступом.
CodeCommit. Аутентификация: SSH-ключи для каждого пользователя IAM, HTTPS Git-учетные данные для каждого пользователя IAM или помощник по учетным данным AWS CLI. Триггеры через SNS / Lambda при push.
CDK: языки программирования (TS/Python/Java/Go/.NET), полные конструкты приложения, шаблоны нескольких ресурсов. SAM: YAML-расширение CFN, ориентированное на serverless, проще. Оба компилируются в CloudFormation.
`App` содержит один или несколько `Stack`ов. Каждый Stack содержит конструкты (L1/L2/L3). `cdk synth` → CFN шаблон. `cdk deploy` развертывает через CFN.
L1 = сырой CFN (`CfnXxx`). L2 = курируемые обертки с безопасными значениями по умолчанию (наиболее распространены). L3 = паттерны, объединяющие несколько ресурсов для полных архитектур (например, `LambdaRestApi`).
CloudFormation автоматически откатывается, если `DisableRollback` не установлен в true. Застряли в `UPDATE_ROLLBACK_FAILED`? Используйте `ContinueUpdateRollback` с `ResourcesToSkip`.
Предотвратить случайное обновление критического ресурса (например, RDS DB) во время обновлений стека.
Политика стека: JSON, запрещающий `Update:Replace` и `Update:Delete` для логического ID ресурса. Обход с явным переопределением при конкретном обновлении.
Повторное использование инфраструктуры между стеками.
Вложенные стеки (`AWS::CloudFormation::Stack` с `TemplateURL`) для повторного использования, принадлежащие одному родителю. Межстековые через Outputs + `Fn::ImportValue` для более тесной связи между отдельными стеками.
Внедрить значение Parameter Store или секрет Secrets Manager в шаблон CFN.
`{{resolve:ssm:/path/to/param}}`, `{{resolve:ssm-secure:/path}}`, `{{resolve:secretsmanager:secret-id:SecretString:json-key}}`. Разрешается во время развертывания.
Все сразу (самый быстрый, простой), Rolling (без дополнительных экземпляров, частичная емкость), Rolling с дополнительной партией (без потери емкости, дополнительные затраты), Immutable (новая ASG, самый безопасный), Blue/Green (отдельная среда, обмен CNAME).
Настроить среду Elastic Beanstalk (пакеты, файлы, команды контейнеров).
`.ebextensions/*.config` YAML в исходном пакете. Новые платформы: `.platform/hooks/...` shell-скрипты для жизненного цикла prebuild/predeploy/postdeploy.
Требуется стабильный, никогда не изменяющийся артефакт Lambda.
Опубликовать нумерованную версию. Код + большая часть конфигурации (память, таймаут, переменные среды, слои) замораживаются. `$LATEST` изменяемый; нумерованные версии - нет.
Загрузить Docker образ в ECR для ECS / EKS / Lambda.
`aws ecr get-login-password | docker login` → `docker tag` → `docker push`. Образы контейнеров Lambda: образ извлекается один раз при развертывании; помеченный образ должен быть в том же регионе.
Отследить запрос, который распределяется по Lambda → DynamoDB → внешнему HTTP.
X-Ray сегменты на каждом шаге сервиса, подсегменты для нижестоящих вызовов. Карта сервисов визуализирует топологию + задержку. Правила семплирования ограничивают объем.
Прикрепить к трассировке X-Ray поисковые данные vs справочные данные.
Annotations: индексируются, фильтруются в консоли (например, `customerId`, `tier`). Metadata: не индексируются, свободная форма (тело запроса, тело ответа для отладки).
Сгенерировать пользовательскую метрику из шаблона лога (например, количество `OutOfMemoryError`).
Метрический фильтр для группы логов. Шаблон соответствует событиям логов; фильтр создает пользовательскую метрику CloudWatch, по которой можно настроить тревогу.
Provisioned Concurrency для предсказуемой нагрузки. SnapStart для кода Java/Python с тяжелой инициализацией. Уменьшите зависимости, используйте ARM/Graviton, вынесите тяжелую инициализацию за пределы обработчика.
Выбрать объем памяти Lambda для наилучшего соотношения стоимости/задержки.
Память также масштабирует CPU + сеть. Используйте конечный автомат AWS Lambda Power Tuning для перебора памяти и нахождения оптимального значения для вашей рабочей нагрузки.
Длительный вызов Lambda достигает жесткого лимита в 15 минут.
Разбить на Step Functions; перенести на Fargate (длительные задачи) или Batch (HPC). Максимальное время Lambda составляет 900 секунд; не подлежит обсуждению.
`TooManyRequestsException` от Lambda; достигнут лимит параллелизма.
Reserved concurrency на функцию (ограничивает + резервирует) или запросить увеличение лимита на уровне аккаунта. Асинхронные вызовы ставятся в очередь и повторяются; синхронные вызовы выдают ошибку.
CloudWatch `WriteThrottleEvents` / `ReadThrottleEvents`. Переключитесь в режим On-Demand, увеличьте provisioned capacity или исправьте "горячий" раздел с помощью лучшего дизайна ключей.
Один ключ раздела получает непропорционально большой трафик; троттлинг при низкой общей нагрузке.
Перепроектировать ключ раздела с высокой кардинальностью. Для записи: добавить префикс со случайным шардом (например, `shard#user`); для чтения: scatter-gather по шардам.
Выбрать стратегию кэширования для ElastiCache / DAX.
Ленивая загрузка (промах кэша → DB → заполнение кэша): кэширует только запрошенные данные, но подвержена устареванию. Сквозная запись (запись в кэш + DB при каждой записи): всегда свежие данные, но записи имеют дополнительные затраты. TTL ограничивает устаревание в любом случае.
По умолчанию на уровне аккаунта: 10 000 запросов/с + 5 000 burst. Переопределения на уровне stage и метода; регулирование на ключ через Usage Plans для контроля уровня партнеров.
Временные ошибки сервиса AWS при высокой нагрузке.
SDK AWS автоматически повторяет попытки с экспоненциальной задержкой + jitter. Настройте `RetryMode = adaptive` или `standard`; настройте `maxAttempts`.
CloudFront выдает устаревший контент после развертывания.
Инвалидация путей (`/index.html`, `/*`) - оплачивается за путь свыше 1000/месяц бесплатно. Лучше: версионированные имена файлов (`app.abc123.js`), чтобы кэш обходился естественным образом.