Когда я начинал заниматься облачной разработкой и все еще пытался найти лучший и самый быстрый способ протестировать и развернуть свой код, я узнал о лямбда-слоях.

Первоначально основное удовлетворение, которое они доставили, заключалось в том, что я мог видеть код 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