aws + serverless + webpack => cannot find module xxx in prod

Costin picture Costin · Mar 20, 2017 · Viewed 8.2k times · Source

I want to create a package to deploy on AWS using serverless and webpack.

In serverless.yml I want to declare all the resources (mainly DynamoDb tables) and the functions. I want to use external node.js libraries.

The folder structure is:

|- serverless.yml
|- webpack.config.js
|- package.json
|- src 
  \ - file1.js
  | - file2.js

Extract from serverless.yml

functions:
  function1:
    handler: src/file1.f1
  function2:
    handler: src/file2.f2

Extract from webpack.congfig.js

module.exports = {
  entry: {
    file1: './src/file1.js',
    file2: './src/file2.js',
  },
  target: 'node',
  output: {
    libraryTarget: 'commonjs',
    path: path.join(__dirname, '.webpack'),
    filename: '[name].js',
  },
  module: {
    loaders: [
      {
        test: /\.json$/,
        loaders: ['json-loader'],
      },
    ],
  },
};

When doing a serverless deploy everything is ok, but when testing the lambda I get an error:

{
  "errorMessage": "Cannot find module '/var/task/src/file1'",
  "errorType": "Error",
  "stackTrace": [
    "Function.Module._load (module.js:276:25)",
    "Module.require (module.js:353:17)",
    "require (internal/module.js:12:17)"
  ]
}

Can you tell me what am I doing wrong?

Given that I am a newbie with serverless, can you suggest me some "better practice" for the code and development organisation? (serverless and nodejs are imposed, webpack and everything else is not)

Answer

marcusmolchany picture marcusmolchany · Mar 20, 2017

I would recommend using the serverless-webpack plugin. It's hard to tell without seeing the entire serverless.yml file, but I would assume that serverless is trying to deploy the functions listed under functions:, which in your case are written in a syntax not understood by the Node.js 4.3 runtime on AWS lambda.

A good walk through on how to set up a project using the serverless-webpack plugin has been detailed by Serverless Stack:

  1. Setup the Serverless Framework
  2. Add Support for ES6 JavaScript