Інтеграція Lambda з сервісами AWS

Безсерверні застосунки з AWS Lambda

Claudio Canales

Senior DevOps Engineer

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

  • Подія надходить.
  • Логіка обробника.
  • Виклик SDK.

Цикл подія -> обробник -> SDK

Безсерверні застосунки з AWS Lambda

Тригери проти викликів SDK

Тригер

  • Визначає, коли запускається Lambda.

Виклик SDK (всередині обробника)

  • Читає й записує сервіси, як-от DynamoDB та S3.

Тригер vs виклик 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 викликає AWS API.
  • IAM — це контролер доступу.

Обробник -> SDK -> AWS API

Безсерверні застосунки з AWS Lambda

Роль виконання = облікові дані

  • Тимчасові облікові дані з ролі виконання.
  • Жодних ключів доступу в коді.
  • Якщо роль не може викликати API, виклик SDK завершується помилкою.

Роль виконання надає облікові дані

Безсерверні застосунки з AWS Lambda

Найменші привілеї: обмежуйте дії й ресурси

  • Зменшує потенційну шкоду.
  • Надавайте лише потрібні дії й ресурси.
  • Уникайте підстановок, якщо вони не справді потрібні.

Найменші привілеї: дії та ресурси

Безсерверні застосунки з AWS Lambda

DynamoDB: обирайте правильну операцію

  • PutItem записує.
  • GetItem читає за ключем.
  • Query знаходить повʼязані елементи.
  • Віддавайте перевагу прицільним операціям, а не широким скануванням.

Операції DynamoDB

Безсерверні застосунки з AWS Lambda

S3: працюйте з bucket + key

  • Обʼєкти зберігаються за bucket + key.
  • GetObject отримує вміст.
  • PutObject записує новий похідний файл.

S3: bucket і key

Безсерверні застосунки з 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

Збираємо все докупи (end to end)

  • Подія S3 містить bucket і key.
  • Обробник розбирає їх.
  • PutItem записує метадані в DynamoDB.
  • У CloudWatch Logs видно, що відбулося.

Підсумок наскрізної інтеграції

Безсерверні застосунки з AWS Lambda

Головні висновки

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

Головні висновки інтеграції

Безсерверні застосунки з AWS Lambda

Давайте потренуємось!

Безсерверні застосунки з AWS Lambda

Preparing Video For Download...