Интеграция Lambda с сервисами AWS

Бессерверные приложения с AWS Lambda

Claudio Canales

Senior DevOps Engineer

Цикл интеграции

  • Входящее событие.
  • Логика обработчика.
  • Вызов SDK.

Цикл: событие → обработчик → SDK

Бессерверные приложения с AWS Lambda

Триггеры и вызовы SDK

Триггер

  • Определяет, когда запускается Lambda.

Вызов SDK (внутри обработчика)

  • Читает и записывает данные в DynamoDB и S3.

Триггер и вызов SDK

Бессерверные приложения с AWS Lambda

Конкретный пример

  • Файл загружается в S3.
  • Lambda запускается.
  • Запись небольшой записи в DynamoDB.

Загрузка в S3 → Lambda → DynamoDB

Бессерверные приложения с AWS Lambda

Полезная нагрузка события: найдите нужное

{
  "Records": [{
    "s3": {
      "bucket": {"name": "…"},
      "object": {"key": "…"}
    }
  }]
}

Аннотации полезной нагрузки события S3

Бессерверные приложения с AWS Lambda

Место AWS SDK в архитектуре

  • Код вызывает SDK (boto3).
  • SDK вызывает API AWS.
  • IAM выступает привратником.

Обработчик → SDK → AWS API

Бессерверные приложения с AWS Lambda

Роль выполнения = учётные данные

  • Временные учётные данные из роли выполнения.
  • Никаких ключей доступа в коде.
  • Если роль не разрешает вызов API, SDK вернёт ошибку.

Роль выполнения предоставляет учётные данные

Бессерверные приложения с AWS Lambda

Минимальные права: ограничьте действия и ресурсы

  • Сокращает радиус последствий.
  • Предоставляйте только необходимые действия и ресурсы.
  • Избегайте маскировок, если без них можно обойтись.

Минимальные права: действия и ресурсы

Бессерверные приложения с AWS Lambda

DynamoDB: выбирайте подходящую операцию

  • PutItem — запись.
  • GetItem — чтение по ключу.
  • Query — поиск связанных элементов.
  • Предпочитайте точечные операции широким сканированиям.

Операции DynamoDB

Бессерверные приложения с AWS Lambda

S3: работа с бакетом и ключом

  • Объекты хранятся по ключу в бакете.
  • GetObject извлекает содержимое.
  • PutObject записывает новый производный файл.

Бакет и ключ S3

Бессерверные приложения с AWS Lambda

Выносите конфигурацию в переменные среды

  • Хардкодирование имён ресурсов ненадёжно.
  • Используйте переменные среды.
  • Развёртывайте один и тот же код в dev и prod.

Настройка через переменные среды

Бессерверные приложения с AWS Lambda

Код SDK: пишите компактно и тестируемо

import boto3
ddb = boto3.client("dynamodb")
def handler(event, context):
    ddb.put_item(
        TableName="files",
        Item={"pk": {"S": "1"}},
    )
  • Проверяйте входные данные, вызывайте SDK и возвращайте результат.
  • Покрывайте чистую логику юнит-тестами.

Компактный обработчик с вызовом SDK

Бессерверные приложения с AWS Lambda

Обрабатывайте ошибки SDK осознанно

  • Ошибки прав доступа часты на старте.
  • При сбое вызова делайте причину очевидной.
  • Подробные логи упрощают отладку.

Пути успеха и ошибки

Бессерверные приложения с AWS Lambda

Когда IAM настроен неверно, код выглядит исправным

AccessDeniedException
required action denied
  • Сначала исправьте IAM, затем логику обработчика.

Отказ в доступе

Бессерверные приложения с AWS Lambda

Идемпотентность: безопасные повторы и дубликаты

  • Одно событие может прийти дважды.
  • Ключи идемпотентности защищают от двойной обработки.
  • Условные записи делают повторы безопасными.

Паттерн ключа идемпотентности

Бессерверные приложения с AWS Lambda

Всё вместе: сквозная интеграция

  • Событие S3 передаёт бакет и ключ.
  • Обработчик разбирает их.
  • PutItem записывает метаданные в DynamoDB.
  • CloudWatch Logs фиксирует произошедшее.

Сквозная интеграция: итог

Бессерверные приложения с AWS Lambda

Ключевые выводы

  • Разделяйте триггеры и вызовы SDK.
  • Ограничивайте права через роль выполнения.
  • Делайте конфигурацию переносимой с помощью переменных среды.

Ключевые выводы об интеграции

Бессерверные приложения с AWS Lambda

Давайте потренируемся!

Бессерверные приложения с AWS Lambda

Preparing Video For Download...