如何为AWS Lambda nodejs runtime

时间:2015-08-27 15:20:33

标签: javascript browserify webpack aws-lambda systemjs

我们正在开发一个project/framework,它有助于在AWS Lambda中部署和维护代码。我想将lambda函数的所有node.js代码构建/捆绑到一个js文件中,因为:

  • 较小的代码库有助于解决lambda冷启动问题
  • Lambda的代码zip大小限制为50MB

我们不想创建自定义捆绑器来执行此操作,因为已经存在许多选项(systemjs,browserify,webpack等)。然而,我们担心某些节点模块与捆绑器/构建器不兼容的问题。

具体而言,aws-sdkknown issues with webpack,说它有browserify support,但我已经与那些浏览过aws-sdk问题的人谈过了

我们想选择一个现有的bundler(或2),但我们希望确保它适用于尽可能多的模块/代码。我们正在尝试为JAWS创建一个插件生态系统,所以正确地做到这一点非常重要(不要因为他们使用的模块X不捆绑而关闭人员)。

问题:

  1. 我如何进行捆绑/构建以满足这些限制?
  2. 我们可以为产品的消费者提供任何指导方针,以确保他们编写/使用的代码捆绑在一起吗?例如:动态require()导致问题AFAIK。

4 个答案:

答案 0 :(得分:2)

我不想使用单个文件解决方案,而是上传包含所有代码的zip文件。我用gulp这个。以下代码仅上传生产依赖项,不包括上一次上载的开发和zip存档。您还可以使用gulp.src的参数排除测试文件夹或任何其他文件。

简而言之,aws-sdk库在我的开发依赖项中,因为AWS Lambda已经有副本;)

var gulp = require('gulp');
var lambda = require('gulp-awslambda');
var zip = require('gulp-zip');
var settings = require('./settings');
var argv = require('yargs').argv;
var p = require('./package.json');

gulp.task('default', function () {
    var profile = argv.profile;
    var src = ['**', '!*.zip', '!node_modules/aws-sdk{,/**}'];
    var i;
    for (i in p.devDependencies) {
        src.push("!node_modules/" + i + "{,/**}");
    }
    if (!profile) {
        profile = settings.aws.defaultProfile;
    }
    return gulp.src(src)
        .pipe(zip('archive.zip'))
        .pipe(lambda(settings.aws.lambda, {
            region: settings.aws.region,
            profile: profile
        }))
        .pipe(gulp.dest('.'));
});

答案 1 :(得分:2)

这不会直接回答您的问题,但serverless项目可能正是这种情况下需要的人。

它允许您使用普通的webpack样式的多文件体系结构构建项目,然后使用CLI实用程序将项目构建为Lambda优化的文件。

CLI还处理函数初始化,部署以及一些我甚至还不需要的其他函数。它甚至可以创建/配置您的触发器(例如,创建s3对象或通过AWS API服务设置新的REST API)。

我只有一些Lambda函数,但在我开始使用serverless之前,即使维护这些函数也很痛苦。

(这是一个令人讨厌的帖子,但要明确我与项目没有关系)

答案 2 :(得分:1)

aws-sdk-js现已正式supports browserify。你可以为什么这是一件好事on my blog

我已经创建了一个名为serverless-plugin-browserify的无服务器插件,它将以极少的配置完成所有繁重的工作。

要具体回答这个问题,我用这个浏览器配置解决了这个问题:

{
  disable: false, //Not an official option, used as internal option to skip browserify
  exclude: [],    //Not an option, but will use for setting browserify.exclude() if defined in yml
  ignore:  [],    //Not an option, but will use for setting browserify.ignore() if defined in yml

  basedir:          this.serverless.config.servicePath,
  entries:          [],
  standalone:       'lambda',
  browserField:     false,  // Setup for node app (copy logic of --node in bin/args.js)
  builtins:         false,
  commondir:        false,
  ignoreMissing:    true,  // Do not fail on missing optional dependencies
  detectGlobals:    true,  // We don't care if its slower, we want more mods to work
  insertGlobalVars: {      // Handle process https://github.com/substack/node-browserify/issues/1277
    //__filename: insertGlobals.lets.__filename,
    //__dirname: insertGlobals.lets.__dirname,
    process: function() {
    },
  },
  debug:            false,
}

您可以使用完整示例here

查看完整代码here

答案 3 :(得分:0)

可能的答案可能是使该函数的行为类似于引导加载程序。使该函数从S3下载打包的代码,解压缩并运行它。

以你提出的方式触摸代码似乎是个坏主意,可能导致不可预测且难以调试的错误。