Comment puis-je construire un seul fichier js pour L'exécution D'AWS Lambda nodejstime
Nous travaillons sur un projet/cadre cela facilite le déploiement et le maintien du code dans L'AWS Lambda. Je veux construire / regrouper tous les noeuds.code js pour une fonction lambda dans un fichier js parce que:
- de plus petites bases de données aident avec les problèmes de démarrage à froid lambda
- Lambda a un code zip De 50MB
nous ne voulons pas créer un bundler personnalisé pour faire cela parce qu'il y a de nombreuses options déjà disponibles (systemjs, browserify,webpack etc.) Cependant, nous sommes préoccupés par les problèmes avec certains modules de noeud qui ne fonctionnent pas bien avec les bundlers/builders.
spécifiquement aws-sdk
a problèmes connus avec webpack, dit qu'il a browserify support mais j'ai parlé à des gens qui ont eu des problèmes avec browserify avec aws sdk
nous voulons choisir un bundler existant (ou 2), mais nous voulons nous assurer qu'il fonctionne pour autant de modules/code que possible. Nous essayons de créer un plugin pour l'écosystème JAWS, donc obtenir ce droit est important (ne veulent pas éteindre les gens parce que le module X ils utilisent wont bundle).
Questions:
- Comment pourrais-je regrouper/construire pour satisfaire ces contraintes?
- y a-t-il des lignes directrices que nous pouvons donner aux consommateurs de notre produit pour s'assurer que le code qu'ils écrivent/utilisent sera regroupé? Ex: Dynamique require()s entraîner des problèmes autant que je sache.
4 réponses
je préfère ne pas utiliser la solution de fichier simple, mais pour télécharger le fichier zip avec tout mon code emballé. J'utilise gulfp 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 test ou tout autre fichier en utilisant les paramètres de gulp.src
.
Juste pour signaler, aws-sdk
bibliothèque est mon point de dépendances comme 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('.'));
});
ceci ne répond pas directement à votre question, mais le sans serveur projet pourrait être exactement ce que quelqu'un dans cette situation doit.
il vous permet de construire des projets dans une architecture multi-fichiers de type webpack, puis utilise un utilitaire CLI pour construire votre(s) projet (s) dans des fichiers Lambda-optimisés.
le CLI gère également l'initialisation des fonctions, le déploiement, et une litanie d'autres fonctions dont je n'ai même pas encore eu besoin. Il va même créer/configurer vos déclencheurs (par exemple, création d'objet s3 ou configuration d'une nouvelle API REST à travers un service API AWS).
Je n'ai que quelques fonctions Lambda, mais même les maintenir était une douleur jusqu'à ce que je commence à utiliser serverless
.
(c'est un obséquieux post, mais pour être clair, je ne suis pas affilié w/ le projet)
aws-sdk-js maintenant officiellement supporte browserify. Vous pouvez pourquoi c'est une grande chose sur mon blog.
j'ai créé un plugin serverless appelé sans serveur-plugin-browserify cela fera tout le levage lourd avec une configuration très minime.
pour répondre spécifiquement à la question, j'ai résolu le problème avec ce 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,
}
Vous pouvez voir mon code complet ici avec un exemple complet ici
la réponse Possible pourrait être de faire en sorte que la fonction se comporte comme un bootloader. Faites la fonction télécharger le code empaqueté de S3, déballez - le et lancez-le.
avoir à toucher le code comme vous le proposez semble être une mauvaise idée qui pourrait entraîner des bugs imprévisibles et difficiles à déboguer.