Jak zbudować pojedynczy plik js dla AWS Lambda NodeJS runtime
Pracujemy nad projektem / frameworkiem , który pomaga we wdrożeniu i utrzymaniu kodu w AWS Lambda. Chcę zbudować / połączyć wszystkie węzły.kod js dla funkcji lambda w jednym pliku js ponieważ:
- mniejsze bazy kodów pomagają w problemach z zimnym startem lambda
- Lambda ma limit rozmiaru kodu zip 50MB
Nie chcemy tworzyć niestandardowego bundlera, aby to zrobić, ponieważ istnieje wiele opcji (systemjs, browserify, webpack itp.). Jakkolwiek jesteśmy dotyczy problemów z niektórymi modułami węzłów, które nie grają dobrze z bundlerami/budowniczymi.
W szczególności aws-sdk
mA Znane problemy z webpack , mówi, że ma browserify wsparcie ale rozmawiałem z ludźmi, którzy mieli problemy z browserify ' ING aws-sdk
Chcemy wybrać istniejący bundler (lub 2), ale chcemy się upewnić, że działa ON dla jak największej liczby modułów / kodu. Staramy się stworzyć ekosystem wtyczek dla JAWS, więc uzyskanie tego prawa jest ważne (nie chcesz wyłączyć ludzi, ponieważ moduł X używają wont bundle).
Pytania:
- W Jaki Sposób miałbym łączyć/budować, aby zaspokoić te ograniczenia?
- czy są jakieś wytyczne, które możemy dać konsumentom naszego produktu, aby upewnić się, że kod, który piszą / używają, będzie się wiązał? Ex: Dynamic require()s powoduje problemy AFAIK.
4 answers
Wolę nie używać rozwiązania pojedynczego pliku, ale przesłać plik zip z całym moim kodem spakowanym. Używam do tego łykania. Poniższy kod pobiera tylko zależności produkcyjne, z wyłączeniem deweloperskich i archiwów zip z poprzedniego uploadu. Możesz również wykluczyć swój folder testowy lub dowolny inny plik używając parametrów gulp.src
.
Żeby tylko wspomnieć, aws-sdk
Biblioteka jest w moich zależnościach programistycznych, ponieważ AWS Lambda ma już kopię ;)
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('.'));
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-25 15:09:34
To nie odpowiada bezpośrednio na twoje pytanie, ale projekt bezserwerowy może być dokładnie tym, czego ktoś w tej sytuacji potrzebuje.
Pozwala na budowanie projektów w normalnej architekturze wielu plików w stylu webpack, a następnie używa narzędzia CLI do budowania projektów w plikach zoptymalizowanych pod kątem Lambda.
CLI obsługuje również inicjalizację funkcji, wdrażanie i litanię innych funkcji, których jeszcze nie potrzebowałem. Będzie nawet tworzyć / konfigurować wyzwalacze (np. tworzenie obiektów lub konfigurowanie nowego REST API poprzez usługę AWS API).
Mam tylko kilka funkcji Lambda, ale nawet utrzymywanie ich było bolesne, dopóki nie zacząłem używać serverless
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-14 14:05:18
Aws-sdk-js teraz oficjalnie obsługuje browserify . Możesz to zrobić na moim blogu .
Stworzyłem bezserwerową wtyczkę o nazwie serverless-plugin-browserify , która wykona wszystkie ciężkie operacje przy bardzo minimalnej konfiguracji.
Aby odpowiedzieć na pytanie konkretnie, rozwiązałem problem z tym 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,
}
Możesz zobaczyć mój pełny kod tutaj z pełnym przykładem tutaj
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-05 15:04:24
Możliwą odpowiedzią może być spowodowanie, że funkcja będzie zachowywać się jak bootloader. Spraw, aby funkcja pobierała spakowany kod z S3, rozpakowywała go i uruchamiała.
Dotykanie kodu w sposób, który proponujesz, wydaje się złym pomysłem, który może skutkować nieprzewidywalnymi i trudnymi do debugowania błędami.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-30 18:08:10