Как настроить 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
упаковывает и развертывает ТОЛЬКО выход веб-пакета.
Вот ваши варианты:
- Не использовать
serverless-webpack
и просто использоватьserverless
встроенная упаковка. - Ты можешь использовать
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 на уровне корня и функций, если плагин что-то пропустит.