AWS Lambda的打包代码

时间:2017-12-20 11:45:20

标签: 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模块foonode_modules/foo/index.js):

export default { x: 1 };

我有自己的代码('index.js'):

import foo from 'foo';

export const handler = (event, context, callback) => {
  console.log(foo); // Will appear in CloudWatch logs
  callback(null, 'OK');
};

输出将是这样的('dist / bundle.js'):

var foo = { x: 1 };

exports.handler = function(event, context, callback) {
  console.log(foo);
  callback(null, 'OK');
};

我应该能够在AWS Lambda上传和运行bundle.js而无需进一步修改。

如何使用现有的JS工具实现这一目标?

2 个答案:

答案 0 :(得分:4)

您可以将serverlessserverless-webpack

一起使用

然后使用serverless deploy

部署捆绑包

答案 1 :(得分:1)

事实证明这是可能的,但它需要一些棘手的配置才能实现。我创建了一个boiler-plate repo供其他人使用。

以下是重要的内容......

首先,您需要一个.babelrc,其目标是Node.js 6.10

{
  "presets": [
    [
      "env", {
        "targets": {
          "node": "6.10"
        }, 
        "loose": false,
        "spec": true
      }
    ]
  ]
}

接下来,您需要配置Webpack以生成定位commonjs的{​​{1}}库:

node

请注意,您要忽略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 }) ] }; 文件夹,因为这会阻止静态链接。

如果您想使用现代JS功能,node_modules插件也很重要。

您的实际处理程序代码应该具有与您在AWS控制台中设置的名称相匹配的babel-polyfill

export

这样做!

export const handler = (event, context, callback) => callback(null, 'OK');

打包代码时,请务必将// Bad! export default { handler: (event, context, callback) => callback(null, 'OK'), }; 添加到zip的顶层:

index.js