3

I am working through a lambda course which was done using v8.10. I am trying to use nodejs v10.x since that is what I want to use for my project in the future.

I am not understanding why the "const uuid = require('uuid');" line is throwing an import error only in nodejs v10 but in v8.10 the code runs just fine.

Code:

const aws = require('aws-sdk');
const s3 = new aws.S3();
const uuid = require('uuid');

exports.handler = async (event) => {
    console.log("Get the event to our S3POC class - " + JSON.stringify(event));

    const newUUID = uuid.v4();

    console.log("The file name is:" + newUUID);

    //put our sentence into the s3 bucket
    return s3.putObject({
        Bucket: "helloworld-s3.arkhadbot.com",
        Key: "test" + ".json"
    });
};

Error

Response:
{
  "errorType": "Runtime.ImportModuleError",
  "errorMessage": "Error: Cannot find module 'uuid'",
  "trace": [
    "Runtime.ImportModuleError: Error: Cannot find module 'uuid'",
    "    at _loadUserApp (/var/runtime/UserFunction.js:100:13)",
    "    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
    "    at Object.<anonymous> (/var/runtime/index.js:45:30)",
    "    at Module._compile (internal/modules/cjs/loader.js:778:30)",
    "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)",
    "    at Module.load (internal/modules/cjs/loader.js:653:32)",
    "    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)",
    "    at Function.Module._load (internal/modules/cjs/loader.js:585:3)",
    "    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)",
    "    at startup (internal/bootstrap/node.js:283:19)"
  ]
}

Request ID:
"e9c300ff-d12e-47b9-a45a-996a1f78b5f5"

Function Logs:
START RequestId: e9c300ff-d12e-47b9-a45a-996a1f78b5f5 Version: $LATEST
2019-09-12T12:18:34.743Z    undefined   ERROR   Uncaught Exception  {"errorType":"Runtime.ImportModuleError","errorMessage":"Error: Cannot find module 'uuid'","stack":["Runtime.ImportModuleError: Error: Cannot find module 'uuid'","    at _loadUserApp (/var/runtime/UserFunction.js:100:13)","    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)","    at Object.<anonymous> (/var/runtime/index.js:45:30)","    at Module._compile (internal/modules/cjs/loader.js:778:30)","    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)","    at Module.load (internal/modules/cjs/loader.js:653:32)","    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)","    at Function.Module._load (internal/modules/cjs/loader.js:585:3)","    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)","    at startup (internal/bootstrap/node.js:283:19)"]}
END RequestId: e9c300ff-d12e-47b9-a45a-996a1f78b5f5
REPORT RequestId: e9c300ff-d12e-47b9-a45a-996a1f78b5f5  Duration: 5098.92 ms    Billed Duration: 5100 ms    Memory Size: 128 MB Max Memory Used: 36 MB  
XRAY TraceId: 1-5d7a3795-41360f9ed871797c8ff32c3e   SegmentId: 4f526b023d16ac66 Sampled: false  
Unknown application error occurred
Runtime.ImportModuleError
7
  • 1
    are you reinstalling your modules after node version change? Commented Sep 12, 2019 at 12:24
  • I am not sure how to do that? UUID should be built into AWS like aws-sdk is. I have not installed or done anything to add custom/3rd party libraries to lambda yet Commented Sep 12, 2019 at 12:36
  • sorry my bad i did not realise this, looking at the npm package, you need to specify what version of uuid you want. try const uuidv1 = require('uuid/v1') Commented Sep 12, 2019 at 12:43
  • same error: "errorType": "Runtime.ImportModuleError", "errorMessage": "Error: Cannot find module 'uuid/v4'", "trace": [ Commented Sep 12, 2019 at 12:46
  • 1
    Believe that uuid/v4 etc. are now external packages so you have to npm install uuid locally and bundle it with your Lambda function. Commented Sep 12, 2019 at 13:05

3 Answers 3

6

As per accepted answer, it's now required that lambda won't have third party support directly. (because Node 8 version is deprecated now which might've still accepted).

const aws = require('aws-sdk');
const s3 = new aws.S3();
// const uuid = require('uuid'); comment this out

exports.handler = async (event, context) => {
    console.log("Get the event to our S3POC class - " + JSON.stringify(event));

    // const newUUID = context.awsRequestId();
    const newUUID = context.awsRequestId;

    console.log("The file name is:" + newUUID);

    //put our sentence into the s3 bucket
    return s3.putObject({
        Bucket: "helloworld-s3.arkhadbot.com",
        Key: "test" + ".json"
    });
};

AWS Request IDs might look like so: requestId: 'daf9dc5e-1628-4437-9e2d-2998efaa73b4'

Sign up to request clarification or add additional context in comments.

Comments

5

Since node.js v10 aws lambda does not support importing libraries from lambda itself.

from the docs :

A deployment package is a ZIP archive that contains your function code and dependencies. You need to create a deployment package if you use the Lambda API to manage functions, or if you need to include libraries and dependencies other than the AWS SDK.

If your function depends on libraries other than the SDK for JavaScript, install them to a local directory with NPM, and include them in your deployment package. You can also include the SDK for JavaScript if you need a newer version than the one included on the runtime, or to ensure that the version doesn't change in the future.

More about AWS Lambda Deployment Package in Node.js

Update 02/05/2020:

node.js 8.10 is now deprecated, you should use node.js 10 or 12.

https://docs.aws.amazon.com/lambda/latest/dg/runtime-support-policy.html

enter image description here

Comments

-1

I had the same issue. What I have done was initialize npm in the lambda's respective folder and add the uuid package into it.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.