2015-08-27 2 views
16

Nous travaillons sur un project/framework qui facilite le déploiement et la maintenance du code dans AWS Lambda. Je veux construire/regrouper tout le code de Node.js pour une fonction lambda dans un fichier js parce que:Comment créer un seul fichier js pour AWS Lambda nodejs runtime

  • petites codebases aider avec lambda démarrage à froid problèmes
  • Lambda a le code 50MB limite de taille zip de

Nous ne souhaitons pas créer un bundler personnalisé pour cela, car il existe déjà de nombreuses options (systemjs, browserify, webpack, etc.). TOUTEFOIS, nous sommes préoccupés par des problèmes avec certains modules de nœuds qui ne jouent pas bien avec les bundlers/constructeurs.

Plus précisément aws-sdk a known issues with webpack, dit qu'il a browserify support mais j'ai parlé à des gens qui ont eu des problèmes avec browserify'ing aws-sdk

Nous voulons choisir un Bundler existant (ou 2), mais nous voulons pour s'assurer que cela fonctionne pour autant de modules/code que possible. Nous essayons de créer un écosystème de plugins pour JAWS, donc il est important de le faire correctement (ne voulez pas désactiver les gens parce que le module X qu'ils utilisent n'est pas groupé).

Questions:

  1. Comment pourrais-je aller sur le regroupement/bâtiment pour répondre à ces contraintes?
  2. Y a-t-il des directives que nous pouvons donner aux consommateurs de notre produit pour s'assurer que le code qu'ils écrivent/utilisent sera regroupé? Ex: Dynamic require() s cause des problèmes AFAIK.
+0

Avez-vous essayé browserify avec les options suivantes: '' ' { builtins: false, commondir: false, BrowserField: faux, detectGlobals: faux, ignoreMi ssing: true, } '' ' – twilson63

Répondre

1

aws-sdk-js officiellement supports browserify. Vous pouvez pourquoi c'est une bonne chose on my blog.

J'ai créé un plugin sans serveur appelé serverless-plugin-browserify qui fera tout le travail lourd avec une configuration minimale.

Pour répondre précisément à la question, je résolu le problème avec cette config 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, 
} 

Vous pouvez voir mon code complet here avec un exemple complet here

0

La réponse possible pourrait être que la fonction se comporte comme un chargeur de démarrage. Faire la fonction télécharger le code emballé de S3, décompressez-le et exécutez-le.

Avoir à toucher le code comme vous le proposez semble être une mauvaise idée qui pourrait entraîner des bogues imprévisibles et difficiles à corriger.

2

Je préfère ne pas utiliser une solution de fichier unique, mais de télécharger le fichier zip avec tout mon code emballé. J'utilise gulp pour ça. Le code ci-dessous ne télécharge que les dépendances de production, à l'exclusion des dépendances de développement et des archives zip du téléchargement précédent. Vous pouvez également exclure votre dossier de test ou tout autre fichier en utilisant les paramètres gulp.src.

Juste pour mentionner, bibliothèque aws-sdk est dans mes dépendances de développement AWS Lambda a déjà une copie;)

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

Il a cessé de fonctionner après la mise à jour de npm vers v3 – dchertousov

2

Cela ne répond pas directement à votre question, mais le projet serverless pourrait être exactement ce que quelqu'un cette situation a besoin.

Il vous permet de créer des projets dans une architecture multi-fichiers de style webpack normale, puis utilise un utilitaire CLI pour générer votre projet (s) dans des fichiers optimisés Lambda. L'interface CLI gère également l'initialisation des fonctions, le déploiement et une multitude d'autres fonctions dont je n'ai pas encore besoin. Il va même créer/configurer vos déclencheurs (par exemple, création d'objet s3 ou mise en place d'une nouvelle API REST via le service API AWS).

Je n'ai que quelques fonctions Lambda, mais même le maintien de ces fonctions était pénible jusqu'à ce que je commence à utiliser serverless.

(ce qui est un poste de flagornerie, mais pour être clair, je ne suis pas affilié w/projet)