Как создать один файл js для AWS Lambda nodejs runtime

Мы работаем над проектом/каркасом, который помогает развертывать и поддерживать код в AWS Lambda. Я хочу построить/объединить все node.js код для лямбда-функции в один файл js, потому что:

  • Меньшие кодовые базы помогают при проблемах с холодным запуском лямбды
  • Lambda имеет ограничение на размер почтового индекса в размере 50 МБ

Мы не хотим создавать настраиваемый набортор, чтобы сделать это, потому что там уже много вариантов (systemjs, browserify, webpack и т.д.). ОДНАКО нас беспокоят проблемы с некоторыми модулями node, которые не очень хорошо работают со сборщиками/сборщиками.

В частности aws-sdk имеет известные проблемы с веб-пакетом, говорит, что он браузера поддержки, но я разговаривал с людьми, у которых были проблемы с браузером aws-sdk

Мы хотим выбрать существующий комплект (или 2), но мы хотим убедиться, что он работает как можно больше модулей/кода. Мы пытаемся создать экосистему плагинов для JAWS, поэтому получение этого права важно (не хотите отключать людей, потому что модуль X, который они используют, не имеет пучка).

Вопросы:

  • Как я могу связать/построить, чтобы удовлетворить эти ограничения?
  • Есть ли какие-либо рекомендации, которые мы можем дать потребителям нашего продукта, чтобы убедиться, что код, который они пишут/использует, будет связываться? Пример: Dynamic require() s вызывает проблемы AFAIK.

Ответы

Ответ 1

aws-sdk-js теперь официально поддерживает браузеру, Вы можете, почему это замечательная вещь в моем блоге.

Я создал безсерверный плагин под названием serverless-plugin-browserify, который будет выполнять весь тяжелый подъем с минимальной конфигурацией.

Чтобы ответить на вопрос конкретно, я решил проблему с этим браузером config:

{
  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,
}

Вы можете увидеть мой полный код здесь с полным примером здесь

Ответ 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('.'));
});

Ответ 3

Это не дает прямого ответа на ваш вопрос, но проект serverless может быть именно тем, кто нуждается в этой ситуации.

Он позволяет создавать проекты в обычной многопоточной архитектуре в стиле webpack, а затем использует утилиту CLI для создания вашего проекта (ов) в файлы с оптимизацией Lambda.

CLI также обрабатывает инициализацию, развертывание и множество других функций, которые мне еще не нужны. Он даже создаст/настроит ваши триггеры (например, создание объекта s3 или создание нового REST API через службу AWS API).

У меня есть только несколько функций лямбда, но даже поддержание их было больно, пока я не начал использовать serverless.

(это заговорщик, но, чтобы быть ясным, я не связан с проектом)

Ответ 4

Возможный ответ может заключаться в том, что функция ведет себя как загрузчик. Сделайте функцию загрузки упакованного кода с S3, распакуйте его и запустите.

Прикосновение к коду так, как вы предлагаете, похоже на плохую идею, которая может привести к непредсказуемым и трудным для отладки ошибок.