Javascript AWS Lambda包装规范
我正在尝试为AWS Lambda打包代码。Lambda有各种限制,例如使用Node 6.10,并且没有像AWS EB那样的构建步骤。我也在使用NPM模块,所以这些模块需要与AWS Lambda处理程序捆绑在一起 以下是我想做的:Javascript AWS Lambda包装规范,javascript,node.js,amazon-web-services,aws-lambda,Javascript,Node.js,Amazon Web Services,Aws Lambda,我正在尝试为AWS Lambda打包代码。Lambda有各种限制,例如使用Node 6.10,并且没有像AWS EB那样的构建步骤。我也在使用NPM模块,所以这些模块需要与AWS Lambda处理程序捆绑在一起 以下是我想做的: 定义和使用NPM模块(仅限纯JS模块) 将所有代码(包括NPM模块)传输到Node 6.10支持的JS版本 静态地将所有NPM模块链接到一个大JS文件中 将单个文件上载到AWS Lambda 例如,假设我有一个NPM模块foo(node\u modules/foo/
- 定义和使用NPM模块(仅限纯JS模块)
- 将所有代码(包括NPM模块)传输到Node 6.10支持的JS版本
- 静态地将所有NPM模块链接到一个大JS文件中
- 将单个文件上载到AWS Lambda
foo
(node\u modules/foo/index.js
):
我有自己的代码('index.js'):
输出如下('dist/bundle.js'):
我应该能够上传并在AWS Lambda上运行bundle.js
,无需进一步修改
如何使用现有的JS工具实现这一点 您可以使用
然后使用serverless deploy
部署捆绑包。事实证明,这是可能的,但需要一些复杂的配置才能实现。我已经创建了一个供其他人使用的
这里是重要的部分
首先,您需要一个面向Node.js的.babelrc
:
{
"presets": [
[
"env", {
"targets": {
"node": "6.10"
},
"loose": false,
"spec": true
}
]
]
}
接下来,您需要配置Webpack以生成一个指向节点的commonjs
库:
const path = require('path');
const webpack = require('webpack');
const debug = process.env.NODE_ENV !== 'production';
module.exports = {
context: __dirname,
entry: [ 'babel-polyfill', './index.js' ],
output: {
path: path.join(__dirname, 'out'),
filename: 'index.js',
libraryTarget: 'commonjs'
},
devtool: debug ? 'source-map' : false,
module: {
rules: [
{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: {
babelrc: true,
compact: !debug
}
}
}
],
},
target: 'node',
plugins: [
new webpack.DefinePlugin({ 'global.GENTLY': false })
]
};
请注意,您不希望忽略节点\u modules
文件夹,因为这样会阻止静态链接
如果你想使用现代JS功能,babel polyfill的插件也是至关重要的
您的实际处理程序代码应该有一个命名的export
,它与您在AWS控制台中设置的内容相匹配:
export const handler = (event, context, callback) => callback(null, 'OK');
不要这样做
// Bad!
export default {
handler: (event, context, callback) => callback(null, 'OK'),
};
打包代码时,请确保将index.js
添加到zip的顶层:
zip -j bundle.zip ./out/index.js
我知道您想创建一个大bundle.js文件,但对AWS Lambda来说更实际的是压缩项目结构,包括所有js文件以及整个node_模块文件夹。您可以直接将zip文件上载到Lambda,或者如果zip文件太大,您可以将其上载到S3,并在创建Lambda函数时引用它。现有工具可能无法使用一个大的捆绑文件,但如果您正在使用该插件,则该插件将有很大帮助(与模块结合使用)。(单独查看软件包选项)加上一个用于无服务器网页
。
export const handler = (event, context, callback) => callback(null, 'OK');
// Bad!
export default {
handler: (event, context, callback) => callback(null, 'OK'),
};
zip -j bundle.zip ./out/index.js