18

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

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

我们不想创建自定义捆绑器来执行此操作,因为已经有很多选项(systemjs、browserify、webpack 等)。然而,我们担心一些节点模块不能很好地与捆绑器/构建器一起使用的问题。

特别是 webpackaws-sdk已知问题,说它有browserify支持,但我已经和那些对 browserify 的 aws-sdk 有问题的人谈过

我们想选择一个现有的捆绑器(或 2 个),但我们想确保它适用于尽可能多的模块/代码。我们正在尝试为 JAWS 创建一个插件生态系统,因此正确处理这一点很重要(不想让人们关闭,因为他们使用的模块 X 不会捆绑)。

问题:

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

4 回答 4

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('.'));
});
于 2015-11-25T15:09:34.400 回答
2

这并不能直接回答您的问题,但无服务器项目可能正是这种情况下某人所需要的。

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

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

我只有几个 Lambda 函数,但在我开始使用serverless.

(这是一个奉承的帖子,但要明确的是,我不隶属于该项目)

于 2016-06-14T14:05:18.333 回答
1

aws-sdk-js现在正式支持 browserify您可以在我的博客上了解为什么这是一件好事。

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

为了具体回答这个问题,我用这个 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,
}

您可以在此处查看我的完整代码以及此处的完整示例

于 2017-01-05T15:04:24.283 回答
0

可能的答案可能是使函数表现得像引导加载程序。使函数从 S3 下载打包的代码,解压并运行它。

必须以您提议的方式接触代码似乎是一个坏主意,可能会导致无法预测且难以调试的错误。

于 2015-10-30T18:08:10.713 回答