Javascript 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/

我正在尝试为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/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