Как использовать поддержку образов контейнера и что это значит для нас

Недавно AWS объявила, что теперь они предлагают поддержку образов контейнера для функций Lambda.

Раньше единственным способом развернуть лямбда-функцию было заархивировать код. Эта новая поддержка означает, что теперь мы можем использовать контейнерный образ в качестве источника для развертывания и локальной разработки.

В этой статье я кратко рассмотрю обновление и простой пример создания и развертывания образа для Node.js Lambda. Я также поделюсь некоторыми преимуществами и недостатками.

Некоторые ключевые моменты

Прежде чем мы начнем, я хочу перечислить некоторые ключевые моменты обновления, чтобы дать немного больше контекста.

Теперь вы можете использовать образ контейнера, содержащий код, в качестве источника лямбда-функций. Образ контейнера можно создать из одного из базовых образов, предоставляемых AWS, в котором уже реализованы различные среды выполнения.

Вы также можете создать свой собственный образ, но он должен реализовывать Lambda Runtime API, чтобы это работало.

Эта поддержка позволяет развернуть образ размером до 10 ГБ. Вы также можете использовать Lambda Extension API для интеграции с такими инструментами, как Datadog или CloudWatch для мониторинга.

Все базовые образы AWS поставляются с эмулятором интерфейса времени выполнения Lambda, который предоставляет вам URL-адрес для локального тестирования Lambda.

Создание контейнера лямбда

Здесь у меня есть базовая лямбда-функция с именем lambda.js с файлом зависимостей package.json:

Сама Lambda просто имеет простой консольный журнал, выводящий строку и полезную нагрузку. Но в реальном мире здесь будет более сложный код и больше зависимостей в package.json.

Для создания образа у нас есть Dockerfile:

Первая строка - это базовый образ, предоставленный AWS. Мы хотим использовать среду выполнения node:12 для запуска Lambda. Вы можете использовать и другие базовые образы, и все они размещены в Docker Hub или Общедоступной галерее ECR.

Затем мы копируем package.json и lambda.js в контейнер и запускаем npm install. Это установит все необходимые Lambda зависимости.

Строка 5 затем установит команду изображения для обработчика функции. Это можно изменить как параметр при настройке функции. Чтобы вызвать этот контейнер, создайте еще один docker-compose.yaml файл в том же каталоге:

Этот файл создает службу Lambda с помощью только что созданного файла Docker, и он предоставляет порт 9000 для нашего использования. Запуск docker-compose up --build теперь создаст образ и запустит контейнер для локальной разработки.

Чтобы запустить эту функцию, вы можете использовать Lambda Runtime API, отправив HTTP-запрос на публикацию по адресу: http://localhost:9000/2015-03-31/functions/function/invocations с любыми полезными данными JSON. Вы должны увидеть, что ваша функция Lambda сработала, и вы можете увидеть вывод журнала.

Теперь вы можете начать использовать эту лямбду в других ваших службах и протестировать ее локально.

Развертывание функции

Чтобы развернуть функцию, мы должны отправить наш образ в AWS ECR, после чего его можно будет выбрать при настройке Lambda. Давайте создадим сценарий оболочки для обработки всего этого.

Этот код использует AWS-CLI v2. Если вы хотите продолжить, убедитесь, что он установлен и настроены учетные данные AWS.

Первая команда строит созданный нами образ и маркирует его именем lambda-container.

Вторая команда предназначена для создания репозитория в ECR. Здесь мы можем указать имя репо и конфигурацию сканирования изображения. Я установил для scanOnPush значение true, что заставит ECR сканировать изображения при обнаружении известных уязвимостей.

Третья команда следует за документацией по отправке образов Docker. Нам нужно пометить образ Docker, который мы хотим отправить, с реестром ECR. Имя после косой черты должно следовать за именем только что созданного репозитория, то есть lambda-container.

Затем нам нужно пройти аутентификацию с помощью ECR, используя функцию get-login-password. Затем результат передается в следующую команду для входа в Docker. Подробно это изложено в документации.

Последняя команда отправит изображение в репозиторий ECR:

После запуска сценария ваше изображение должно быть отправлено в ECR, и вы сможете увидеть его на консоли управления. Теперь мы готовы создать функцию.

Создание функции

Создание лямбда-выражения с использованием нашего созданного образа в качестве источника может быть выполнено на консоли или с помощью AWS-CLI.

Консольный способ очень прост. Перейдите к Lambda -> Create Function и выберите опцию «образ контейнера». Затем вы можете ввести имя для лямбды. Нажмите «Обзор изображений», чтобы найти загруженное изображение в ECR:

Вы также можете переопределить конфигурации образа контейнера или изменить роль выполнения.

Наконец, вы можете нажать кнопку «Создать функцию», и ваша лямбда будет размещена в облаке.

За и против

Теперь поговорим о преимуществах:

  1. Наличие способа развертывания Lambdas как образов контейнеров значительно упрощает развертывание, особенно если ваша организация уже использует множество контейнерных сервисов по конвейеру.
  2. Теперь у вас может быть централизованный репозиторий, в котором хранятся все лямбда-изображения для выполнения определенных «разовых» задач, таких как отправка электронной почты. Каждый раз, когда эта функция необходима, вы можете просто вытащить изображение и использовать его в разработке.
  3. Теперь вы можете связать свою лямбду с гораздо более сложными и крупными зависимостями, такими как модули машинного обучения.

Однако есть и большой недостаток: многие разработчики полагаются на localstack при моделировании среды AWS при локальной разработке.

Наличие Lambda в отдельном от localstack контейнере означает потерю возможности запускать функцию из других источников, таких как SQS или SNS. Поэтому в некоторых случаях использование образа контейнера может не помочь вам в разработке на местном уровне.

Но с другой стороны, эта дополнительная поддержка по-прежнему отлично подходит для любых проектов, которые полагаются только на Lambdas.

Заключение

Вкратце, это новая поддержка изображений контейнера для Lambdas, а также мои два цента.

Надеюсь, вы нашли это полезным!