Как настроить serverless.yml и webpack.config для многоразовой службы AWS Lambda

Я хочу развернуть функции AWS Lambda с Node8.10 и средами исполнения Ruby2.5 из одного файла serverless.yml.

Я установил следующую структуру папок, где / node и / ruby ​​содержат соответствующие обработчики.

 -/nodeRubyLambdas
  -/node
    -handler.js
    -package.json, package-lock.json, /node_modules
  -/ruby
    -rubyRijndaelEncryption.rb
    -Gemfile, Gemfile.lock, /vendor
  -serverless.yml
  -webpack.config.js
  -package.json for serverless-webpack

Вот мой serverless.yml

service: nodeRubyLambdas

plugins:
  - serverless-webpack
  - serverless-offline

custom:
  webpack:
    webpackConfig: ./webpack.config.js
    includeModules: true

provider:
  name: aws
  stage: dev
  region: us-west-2
  iamRoleStatements:
    - Effect: Allow
      Action:
        - lambda:InvokeFunction
      Resource: "*"

  package:
    individually: true

functions:
  nodeMain:
    handler: node/handler.main
    runtime: nodejs8.10
    events:
      - http:
          path: main
          method: get
    package:
      individually: true
  rubyEncryption:
    handler: ruby/rubyRijndaelEncryption.lambda_handler
    runtime: ruby2.5
    environment:
      RIJNDAEL_PASSWORD: 'a string'
    package:
      individually: true

Моя конфигурация веб-пакета: (Это базовый пример, я просто добавил бит, чтобы игнорировать файлы ruby, когда получил свою первую ошибку.)

const slsw = require("serverless-webpack");
const nodeExternals = require("webpack-node-externals");

module.exports = {
  entry: slsw.lib.entries,
  target: "node",
  // Generate sourcemaps for proper error messages
  devtool: 'source-map',
  // Since 'aws-sdk' is not compatible with webpack,
  // we exclude all node dependencies
  externals: [nodeExternals()],
  mode: slsw.lib.webpack.isLocal ? "development" : "production",
  optimization: {
   // We do not want to minimize our code.
   minimize: false
  },
  performance: {
    // Turn off size warnings for entry points
    hints: false
  },
  // Run babel on all .js files and skip those in node_modules
  module: {
    rules: [
      {
        test: /\.js$/,
        loader: "babel-loader",
        include: __dirname,
        exclude: [/node_modules/, /\.rb$/]
      }
    ]
  }
};

Ошибка № 0: [Ошибка компиляции Webpack] Сбой при разборе модуля

Ошибка № 1: По сути, webpack предполагает, что все функции являются.js, и пытается упаковать их как таковые. Исходя из этого предложения, я заставил мою точку входа в конфигурации webpack быть моим handler.js

 module.exports = {
  entry: "./node/handler.js",
  target: "node",
  ...

Это пакеты ТОЛЬКО Node Lambda. В AWS создается пустая метка-заполнитель для Ruby Lambda.

Ошибка № 2: Я закомментировал webpack из serverless.yml и добавил операторы include и exclude в опциях пакета функций.

functions:
  nodeMain:

    package:
      individually: true
      include:
        - node/**
        - handler.js
      exclude:
        - ruby/**
        - rubyLambda/**
  rubyEncryption:

    package:
      individually: true
      include:
        - vendor/**
        - rubyRijndaelEncryption.rb
      exclude:
        - Gemfile
        - Gemfile.lock
        - node/**

Это получает [ENOENT: нет такого файла или каталога] для node/node_modules/@babel/core/node_modules/.bin/parser. Этого файла нет, но я не понимаю, зачем он его ищет, так как не вызывается webpack.

Вроде успеха?: Я смог заставить Lambdas развернуться, если я закомментировал веб-пакет и использовал

    serverless deploy function -f <function name here>

развернуть Ruby Lambda, а затем раскомментировать веб-пакет и использовать то же самое для развертывания Node Lambda.

Я убежден, что есть лучший способ заставить их развернуть; Я что-то пропустил в моей настройке? Есть ли другой вариант, который я не пробовал?

PS Я видел этот запрос на извлечение https://github.com/serverless-heaven/serverless-webpack/pull/256, но, похоже, он был отклонен с 2017 года.

2 ответа

Решение

serverless-webpack не предназначен для не-JS. Это угоняет serverless упаковывает и развертывает ТОЛЬКО выход веб-пакета.

Вот ваши варианты:

  1. Не использовать serverless-webpack и просто использовать serverlessвстроенная упаковка.
  2. Ты можешь использовать webpack напрямую (не serverless-webpack), и измените процесс сборки для компиляции, используя webpack сначала а потом пусть serverless развернуть выходную папку.

PS The package.individually свойство является корневым свойством в вашем serverless.yml, Это не должно быть в provider или в ваших определениях функций.

Для тех, кто может искать варианты для нескольких сред выполнения, отличных от serverless-webpack, я закончил тем, что переключился на этот плагин: https://www.npmjs.com/package/serverless-plugin-include-dependencies.
Он работает с моими средами исполнения (Ruby и Node) и позволяет вам использовать package.individual с package.include/exclude на уровне корня и функций, если плагин что-то пропустит.

Другие вопросы по тегам