arkad
arkad

Reputation: 127

Lambda code works on node v8.10 but not nodejs v10.x

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

Upvotes: 3

Views: 6805

Answers (3)

sagara
sagara

Reputation: 107

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.

Upvotes: -1

Rohan Kumar
Rohan Kumar

Reputation: 862

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'

Upvotes: 6

Amit Baranes
Amit Baranes

Reputation: 8122

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

Upvotes: 5

Related Questions