Как создать один файл 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, распакуйте его и запустите.
Прикосновение к коду так, как вы предлагаете, похоже на плохую идею, которая может привести к непредсказуемым и трудным для отладки ошибок.