I try to use layers of AWS Lambda, watched a tutorial about it, but I get an error "cannot find module ..."
service: aws-nodejs
package:
exclude:
- .gitignore
- package.json
- .git/**
provider:
name: aws
profile: sandbox
runtime: nodejs12.x
layers:
testLayer:
path: testLayer
compatibleRuntimes:
- nodejs12.x
allowedAccounts:
- '*'
functions:
hello:
handler: handler.hello
layers:
- arn:aws:lambda:us-east-1:*:layer:testLayer:15
events:
- http:
path: test
method: get
cors: true
When i deploy it, i don't have any errors in my terminal, and on AWS, i see my layer and when i download it, i have my package.json
with moment dependency, and the node_modules folder with moment
my handler.js looks like this :
'use strict';
module.exports.hello = async (event, context) => {
const moment = require('moment')
const a = moment('2016-01-01')
return {
statusCode: 200,
body: JSON.stringify({
message: 'Hey' + a
}),
};
};
My files structure :
testLayer/
node_modules/
moment/
package.json
serverless.yml
handler.js
package.json
Do you have any idea of what i doing wrong ?
The Lambda runtime serializes the response object into JSON and sends it to the API. The API parses the response and uses it to create an HTTP response, which it then sends to the client that made the original request.
Invocation errors can be caused by issues with request parameters, event structure, function settings, user permissions, resource permissions, or limits. If you invoke your function directly, you see any invocation errors in the response from Lambda.
You upload the . zip file archive to your layer from Amazon Simple Storage Service (Amazon S3) or your local machine. Lambda extracts the layer contents into the /opt directory when setting up the execution environment for the function.
Yes, it's possible that your node modules are there in your lambda layer and yet lambda is throwing error of "cannot find module..".
This may be happening because the zip that you have created is not as per directory structure mentioned in AWS documentation.
As per official documentation :
Including Library Dependencies in a Layer You can move runtime dependencies out of your function code by placing them in a layer. Lambda runtimes include paths in the /opt directory to ensure that your function code has access to libraries that are included in layers.
To include libraries in a layer, place them in one of the folders supported by your runtime.
Node.js – nodejs/node_modules, nodejs/node8/node_modules (NODE_PATH)
Example AWS X-Ray SDK for Node.js
nodejs/node_modules/aws-xray-sdk
Make sure your zip contains correct directory structure else try importing your modules from /opt/your_node_module_directory
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With