Я хочу развернуть функции 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: [Ошибка компиляции веб-пакета] Ошибка синтаксического анализа модуля
Ошибка № 1: По сути, веб-пакет предполагаетвсе функции .js и пытается упаковать их как таковые.Исходя из этого предложения , я заставил мою точку входа в конфигурации webpack быть моим handler.js
module.exports = {
entry: "./node/handler.js",
target: "node",
...
Это упаковывает ТОЛЬКО Node Lambda.В AWS создается пустой заполнитель для Ruby Lambda.
Ошибка № 2: Я закомментировал веб-пакет из 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.Этого файла нет, но я не понимаю, почему он его ищет, поскольку веб-пакет не вызывается.
Вроде успеха?: Мне удалось доставить Lambdas вразвертывание, если я закомментировал веб-пакет и использовал
serverless deploy function -f <function name here>
для развертывания Ruby Lambda, а затем раскомментировал веб-пакет и использовал то же самое для развертывания Node Lambda.
Я убежденчто есть лучший способ заставить их развернуться;Я что-то пропустил в моей настройке?Есть ли другой вариант, который я не пробовал?
PS Я видел этот запрос на получение https://github.com/serverless-heaven/serverless-webpack/pull/256,, но он, похоже, был отклонен с 2017 года.