Back

Explore Courses Blog Tutorials Interview Questions
0 votes
2 views
in AWS by (19.1k points)

I'm using Gulp to compress a zip file and then upload it to AWS Lambda. The upload zip file is done manually. Only the process of compressing is handled by Gulp.

Here is my gulpfile.js

var gulp = require('gulp');

var zip = require('gulp-zip');

var del = require('del');

var install = require('gulp-install');

var runSequence = require('run-sequence');

var awsLambda = require("node-aws-lambda");

gulp.task('clean', function() {

  return del(['./dist', './dist.zip']);

});

gulp.task('js', function() {

  return gulp.src('index.js')

    .pipe(gulp.dest('dist/'));

});

gulp.task('npm', function() {

  return gulp.src('./package.json')

    .pipe(gulp.dest('dist/'))

    .pipe(install({production: true}));

});

gulp.task('zip', function() {

  return gulp.src(['dist/**/*', '!dist/package.json'])

    .pipe(zip('dist.zip'))

    .pipe(gulp.dest('./'));

});

gulp.task('deploy', function(callback) {

  return runSequence(

    ['clean'],

    ['js', 'npm'],

    ['zip'],

    callback

  );

});

After running the deploy task, a zip folder named dist.zip is created consists of an index.js file and a node_modules folder. The node_modules folder contains only a lodash library.

This is index.js

var _ = require('lodash');

console.log('Loading function');

exports.handler = (event, context, callback) => {

    //console.log('Received event:', JSON.stringify(event, null, 2));

    var b = _.chunk(['a', 'b', 'c', 'd', 'e'], 3);

    console.log(b);

    callback(null, event.key1);  // Echo back the first key-value

    //callback('Something went wrong');

};

After using AWS lambda console to upload the dist.zip folder. There is an error showing that the lodash library cannot be found

{

  "errorMessage": "Cannot find module 'lodash'",

  "errorType": "Error",

  "stackTrace": [

    "Function.Module._load (module.js:276:25)",

    "Module.require (module.js:353:17)",

    "require (internal/module.js:12:17)",

    "Object.<anonymous> (/var/task/index.js:1:71)",

    "Module._compile (module.js:409:26)",

    "Object.Module._extensions..js (module.js:416:10)",

    "Module.load (module.js:343:32)",

    "Function.Module._load (module.js:300:12)",

    "Module.require (module.js:353:17)"

  ]

}

But in the zip folder, there is a node_modules directory that contains the lodash lib.

dist.zip

|---node_modules

    |--- lodash

|---index.js

When I zip the node_modules directory and the file index.js manually, it works fine.

Does anyone have an idea what is wrong? Maybe when compressing using Gulp, there is a misconfigured for the lib path?

1 Answer

0 votes
by (44.4k points)

This worked fine:

gulp

    .src(['sourceDir/**'],         {nodir: true, dot: true} )

    .pipe(zip('target.zip'))

    .pipe(gulp.dest('build/'));

This is the 2nd parameter of the above:

{nodir: true, dot: true}

We have to include dotfiles for the ZIP (ex: .exe, .config, .whatever)

Related questions

Want to get 50% Hike on your Salary?

Learn how we helped 50,000+ professionals like you !

Browse Categories

...