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

Официальный способ развертывания AWS Lambda с javascript - использование package и deploy api AWS Cloudformation, подробности доступны в Документах AWS.

Хорошая вещь в этом подходе заключается в том, что он позволяет нам управлять нашим AWS Lambda с помощью шаблонов Cloudformation, что, среди прочего, способствует воспроизводимости развертываний и отслеживаемости.

Однако я считаю такой подход нежелательным по нескольким причинам:

  1. Он создает большой zip-файл, поскольку заархивирует все из корня проекта, включая весь каталог node_modules. Кроме того, вы не можете удалить node_modules перед упаковкой, потому что именно так среда выполнения разрешает зависимости.
  2. Это затрудняет управление версиями, поскольку публикует zip-файл со сгенерированным именем (например, bucket_name / c3cb48f377d29b5d6129d776993240c1), что затрудняет ссылку на файл по версии (например, myapp-0.0.1.js).
  3. Он объединяет упаковку и развертывание, разделение может быть выполнено, но это не очень просто, поскольку шаблон, используемый для развертывания, создается командой упаковки.

Размер кода обычно не является проблемой для лямбда-выражения javascript, если он не превышает установленного лимита. Однако есть некоторые исключения, например:

  • Проекты со многими статическими активами, такими как изображения для документации
  • Проекты с несколькими точками входа для различных лямбда-функций, которые могут использовать устранение мертвого кода перед развертыванием
  • Организации, которые часто публикуют лямбда-выражения AWS: разница в размере кода может быстро увеличиться на S3!

Решение: связать javascript через Webpack

Webpack - популярное программное обеспечение для связывания javascript, оно также предоставляет множество полезных функций, таких как транспиляция и встряхивание дерева (удаление мертвого кода). В этой статье я сосредоточусь на комплектации.

Установить Webpack

Webpack обычно используется как инструмент командной строки. Прежде чем мы начнем, нам нужно установить его:

> cd <project_dir> 
> npm install --save-dev webpack 
> npm install --save-dev webpack-cli

Приведенная выше команда устанавливает Webpack локально в ваш проект, замените --save-dev на --global, если вы хотите установить его глобально.

Создать файл конфигурации Webpack

Перед объединением мы должны сообщить Webpack особенности нашего проекта, чтобы он мог нам помочь, это достигается путем создания файла конфигурации.

Ниже представлена ​​минимальная конфигурация Webpack, которая позволяет нам создавать javascript для нашей среды AWS Lambda.

const path = require('path'); 
module.exports = { 
    target: "node", // aws lambda run on Node.js 
    entry: "./src/app.js", // entry point of app 
    output: { 
        // umd allows our code to be run by AWS Lambda 
        libraryTarget: 'umd', 
        path: path.resolve(__dirname, "lib"), 
        filename: "bundle.js" 
    }
};

Это очень упрощенный файл конфигурации Webpack, наиболее важным битом является значение module.exports.output.libraryTarget, он должен быть umd, чтобы его можно было запускать в среде AWS Lambda.

Создать файл пакета

> webpack ... 
> ls lib/ bundle.js

По целевому пути будет создан связанный файл javascript.

Опубликовать код javascript с версией

Используя Webpack для объединения нашего кода, мы решаем проблему раздутого размера кода.

Другая проблема с aws cloudformation package заключается в том, что он загружает zip-файл с нечитаемым именем, что затрудняет управление версиями, чем необходимо.

Это можно решить следующими способами:

  • Архивирование и загрузка нашего кода в S3 напрямую с версией как частью имени файла
  • Развертывание в AWS Lambda с использованием шаблона Cloudformation определенной версии

Этот рабочий процесс также решает проблему связывания с командами package и deploy.

Опубликовать javascript в S3 с версией

Заархивировать и загрузить наш связанный код так же просто, как:

> zip lib/bundle.js app-0.1.zip 
> aws s3 cp app-<version>.zip s3://my-bucket/my-dir/app-0.1

Разверните AWS Lambda с определенной версией

Мы можем управлять нашим развертыванием с помощью шаблона Cloudformation, который принимает параметр version, например:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Parameters:
  LambdaVersion:
    Type: String
Resources:
  TestFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs6.10
      CodeUri:
              Bucket: "my-bucket"
              Key: !Sub "my-dir/app-${LambdaVersion}"
      Environment:
        Variables: 
          S3_BUCKET: bucket-name

Затем вы можете развернуть конкретную версию своей лямбды следующим образом:

> aws cloudformation deploy \ 
  --template-file <your_file> \ 
  --stack-name <a_name> \ 
  --parameter-overrides LambdaVersion=0.1

Заключение

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

Многие из этих улучшений могут быть выполнены с помощью Serverless Framework, проверьте его, если ваш лямбда-проект сложен. Однако, когда все просто, я рекомендую иметь меньше зависимостей.