我想从一个serverless.yml文件中使用Node8.10和Ruby2.5运行时部署AWS Lambda函数。
我设置了以下文件夹结构,其中/ 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
我的webpack配置:(这是基本示例,我刚遇到第一个错误时就添加了忽略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并尝试将其打包。基于this suggestion,我强制将webpack配置中的入口点设置为我的handler.js
module.exports = {
entry: "./node/handler.js",
target: "node",
...
这仅打包Node Lambda。在AWS上为Ruby Lambda创建了一个空的占位符。
失败#2: 我从serverless.yml中注释掉了webpack,并在功能包选项中添加了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/**
这将为node/node_modules/@babel/core/node_modules/.bin/parser获取一个[ENOENT:没有这样的文件或目录]。该文件不存在,但我不明白为什么要查找它,因为未调用webpack。
成功排序? 如果我注释掉webpack并使用
,则能够部署Lambda。 serverless deploy function -f <function name here>
先部署Ruby Lambda,然后再取消注释Webpack,然后使用同一件事部署Node Lambda。
我坚信,有更好的方法来部署它们;我错过了设置中的某些内容吗?还有我没有尝试过的另一种选择吗?
P.S。我确实看到了此拉取请求https://github.com/serverless-heaven/serverless-webpack/pull/256,但自2017年以来似乎已被放弃。
答案 0 :(得分:0)
serverless-webpack
不适用于非JS运行时。它劫持serverless
打包,仅部署Webpack输出。
以下是您的选择:
serverless-webpack
,而只需使用serverless
的内置包装即可。webpack
(而不是serverless-webpack
),并更改构建过程以首先使用webpack
进行编译,然后让serverless
部署输出文件夹。 P.S。 package.individually
属性是您的serverless.yml
中的根目录级属性。它不应出现在provider
或您的函数定义中。
答案 1 :(得分:0)
对于那些可能正在寻找除无服务器Webpack之外的多个运行时选项的人,我最终切换到此插件:https://www.npmjs.com/package/serverless-plugin-include-dependencies。
它可以与我的运行时(Ruby和Node)一起使用,并且如果插件遗漏某些东西,则可以在根和功能级别上单独使用package.include / exclude。