2015-08-27 1 views
16

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

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

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

В частности aws-sdk имеет known issues with webpack, говорит, что это browserify support, но я разговаривал с людьми, у которых были проблемы с browserify'ing AWS-SDK

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

Вопросы:

  1. Как бы я идти о пакетирования/здания, чтобы удовлетворить эти ограничения?
  2. Есть ли какие-либо рекомендации, которые мы можем предоставить потребителям нашего продукта для обеспечения того, чтобы код, который они пишут/используют, будет связываться? Пример: Динамическое требование() вызывает проблемы AFAIK.
+0

вы пробовали browserify со следующими параметрами: '' ' { : ложные встроенные команды, commondir: ложь, browserField: ложные, detectGlobals: ложные, ignoreMi ssing: true, } '' ' – twilson63

ответ

1

aws-sdk-js теперь официально supports browserify. Вы можете, почему это замечательная вещь on my blog.

Я создал безсерверный плагин под названием 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, 
} 

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

0

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

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

2

Я предпочитаю не использовать однофайльное решение, но загружать zip-файл со всем моим упакованным кодом. Для этого я использую глоток. В приведенном ниже коде загружаются только производственные зависимости, исключая файлы разработки и 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('.')); 
}); 
+0

Он прекратил работу после обновления npm до версии v3 – dchertousov

2

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

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

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

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

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

Смежные вопросы