Когда я начинал заниматься облачной разработкой и все еще пытался найти лучший и самый быстрый способ протестировать и развернуть свой код, я узнал о лямбда-слоях.
Первоначально основное удовлетворение, которое они доставили, заключалось в том, что я мог видеть код Lambda непосредственно в консоли AWS, поскольку они извлекали зависимости, которые я использую, что сделало мой код лямбда меньше, чем он должен быть. Это позволило мне отлаживать и изменять собственный написанный лямбда-код напрямую с консоли (не делайте этого в среде prod, это не очень хорошая практика) - позже я узнал, как лучше отлаживать и тестировать свою лямбда-код локально с помощью SAM, а иногда и Localstack.
Это был побочный эффект использования Lambda Layer, а не цель. В этом посте мы рассмотрим несколько преимуществ использования слоев, где мы вместе построим лямбду со слоем.
Основные цели использования слоев:
- Уменьшение размера пакета развертывания Lambda, что ускоряет развертывание.
- Совместное использование кода несколькими лямбда-выражениями (например, пакетами, двоичными файлами и т. Д.)
Чтобы продемонстрировать эти варианты использования, я буду использовать большую JS-библиотеку momentjs в качестве зависимости в моей лямбда-выражении (обратите внимание, что в документации momentjs рекомендуется не использовать ее, когда это возможно - из их документации: We now generally consider Moment to be a legacy project in maintenance mode. It is not dead, but it is indeed done.
).
Создать лямбду без слоев
Наша лямбда будет принимать дату и форматировать ее (2021–05–09 = ›09 мая 2021 г.)
- Выполните следующую команду для инициализации бессерверного приложения:
sam init
- конечно, на вашем компьютере должен быть установлен SAM CLI. После этого вам будет предложено несколько вопросов. Выберите NodeJS в качестве среды выполнения, добавьте имя проекта и выберите шаблон Hello World. - Обновите template.yml, чтобы отразить правильные значения - в основном, изменив имя с hello-world на date-formatter, удалив свойство «Events» лямбда-выражения, поскольку мы не хотим запускать его через API-шлюз или другие средства (мы ' Я запускаю его вручную) и удаляя выходные данные, так как они нам не понадобятся. Таким образом, template.yml будет выглядеть следующим образом:
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: date-formatter Resources: DateFormatterFunction: Type: AWS::Serverless::Function Properties: CodeUri: src/ Handler: app.lambdaHandler Runtime: nodejs12.x FunctionName: date-formatter
- В сгенерированных папках и файлах измените имя папки «hello-world» на «src», чтобы оно соответствовало CodeUri, добавленному в template.yml.
- Внутри папки «src» запустите:
npm i moment
- Обновите файл app.js следующим образом:
const moment = require(monent); exports.lambdaHandler = async (event, context) => { try { const { date } = event; const formattedDate = moment(date).format('DD MMM YYYY'); console.log(formattedDate); } catch (err) { console.log(err); } };
- Разверните приложение: `sam deploy - guided`. Вам будет предложено несколько вопросов - введите имя стека, а остальные оставьте по умолчанию.
- Откройте консоль и протестируйте лямбда-выражение - в разделе «Источник кода» может появиться информационное окно, в котором отображается «Пакет развертывания вашей лямбда-функции слишком велик для включения встроенного редактирования кода. Однако вы по-прежнему можете вызывать свою функцию ». - Что более важно, так это размер лямбда, который отображается в разделе «Свойства кода» - ** Размер пакета показывает 1,1 МБ **. Также потребовалось 32 секунды, чтобы этот код был загружен и развернут в моем оптоволоконном соединении.
Добавьте слой в нашу лямбду
Согласно документации AWS, слой Lambda - это файловый архив .zip, который может содержать дополнительный код или данные. Слой может содержать библиотеки, настраиваемую среду выполнения, файлы данных или конфигурации. Слои способствуют совместному использованию кода и разделению обязанностей, чтобы вы могли быстрее выполнять итерацию при написании бизнес-логики.
Теперь мы объединим momentjs в слой, а затем мы сможем использовать его в нашей лямбде:
- Создайте новую папку рядом с папкой date-formatter:
cd .. && mkdir ./layer/nodejs
- В папке layer / Node.js запустите
npm init
, затемnpm i moment
- это инициализирует пакет npm и установит momentjs. - Вернитесь к файлу template.yml, добавьте следующий ресурс
Momentlayer: Type: AWS::Serverless::LayerVersion Properties: LayerName: moment-layer-2-29-1 Description: Moment layer 2.29.1 ContentUri: ../layer CompatibleRuntimes: - nodejs12.x
- Запустите
sam deploy
, чтобы развернуть шаблон sam и создать слой - После этого перейдите в консоль AWS и найдите в разделе «Слои» только что созданный слой. Или просто запустите
aws lambda list-layers
в командной строке
Обратите внимание, что слой должен быть создан по пути Node.js / node_modules в соответствии с документацией AWS, если вы не хотите самостоятельно указывать PATH среды выполнения. Итак, в нашем примере у нас есть node_modules в папке Node.js, а свойство ContentUri в файле шаблона указывает на эту папку.
Это потрясающе. Перейдите к лямбда-выражению в консоли AWS, проверьте его, передав объект JSON со свойством «date», и убедитесь, что дата напечатана в формате ДД Месяц ГГГГ.
Должны ли мы использовать слои?
Если мы посмотрим на наш размер лямбда, то перед переходом на другой уровень в размере пакета отображается 277,0 байт вместо 1,1 МБ. Предположим, нам нужно повторно использовать этот код (в нашем примере это momentjs) в другой лямбде. Теперь мы могли ссылаться на слой - отличный способ поделиться кодом между лямбда-функциями.
Однако использование слоев имеет несколько недостатков:
- Тестирование лямбда становится немного сложнее, так как содержимое уровня требуется во время выполнения модульных и интеграционных тестов.
- Использование слоев со статическими языками (например, Java, C #), поскольку они требуют зависимостей вместе с кодом приложения во время компиляции.
Стоит взвесить преимущества слоев со сложностью, которую они привносят в ваш процесс. Обычно хорошим вариантом использования является совместное использование большой базы кода несколькими функциями (наш пример выше не является хорошим вариантом использования слоев, а просто простой способ продемонстрировать их использование).
Надеюсь, вам понравился пост, и с нетерпением жду ваших отзывов.
Вы можете найти код проекта по адресу:
Больше контента на plainenglish.io