我想从一个 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 并尝试将它们打包。根据这个建议,我强制我在 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: no such file or directory]。该文件不存在,但我不明白它为什么要查找它,因为没有调用 webpack。
有点成功?: 如果我注释掉 webpack 并使用,我就能部署 Lambdas
serverless deploy function -f <function name here>
部署 Ruby Lambda,然后取消注释 webpack 并使用相同的东西来部署 Node Lambda。
我相信有更好的方法让他们部署;我是否错过了设置中的某些内容?还有其他我没有尝试过的选择吗?
PS 我确实看到了这个拉取请求https://github.com/serverless-heaven/serverless-webpack/pull/256,但它似乎自 2017 年以来就被放弃了。