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:

  1. W Jaki Sposób miałbym łączyć/budować, aby zaspokoić te ograniczenia?
  2. 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.
Author: rynop, 2015-08-27

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('.'));
});
 2
Author: dchertousov,
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.

Jest to jeden z najbardziej popularnych postów na świecie.]}
 2
Author: Brandon,
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

 1
Author: rynop,
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.

 0
Author: kixorz,
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