问题
I've created several Lambda functions using the web based editor. So far so good. I'd now like to start extending those with modules (such as Q for promises). I can't figure out how to get the modules out to Lambda so they can be consumed by my functions.
I've read through this but it seems to involve setting up an EC2 and running Lambda functions from there. There is a mechanism to upload a zip when creating a function but that seems to involve sending up functions developed locally. Since I'm working in the web based editor that seems like a strange workflow.
How can I simply deploy some modules for use in my Lambda functions?
回答1:
You cannot load NPM modules without uploading a .zip
file, but you can actually get this process down to two quick command lines.
Here's how:
Put your Lambda function file(s) in a separate directory. This is because you install
npm
packages locally for Lambda and you want to be able to isolate and test what you will upload to Lambda.Install your NPM packages locally with
npm install packageName
while you're in your separate Lambda directory you created in step #1.Make sure your function works when running locally:
node lambdaFunc.js
(you can simply comment out the twoexport.handler
lines in your code to adapt your code to run with Node locally).Go to the Lambda's directory and compress the contents, make sure not to include the directory itself.
zip -r lambdaFunc.zip .
If you have the
aws-cli
installed, which I suggest having if you want to make your life easier, you can now enter this command:aws lambda update-function-code --function-name lambdaFunc \ --zip-file fileb://~/path/to/your/lambdaFunc.zip
(no quotes around the lambdaFunc part above in case you wonder as I did)
Now you can click test in the Lambda console.
I suggest adding a short alias for both of the above commands. Here's what I have in mine for the much longer Lambda update command:
alias up="aws lambda update-function-code --function-name lambdaFunc \ --zip-file fileb://~/path/to/your/lambdaFunc.zip"
回答2:
A .zip
file is required in order to include npm modules in Lambda. And you really shouldn't be using the Lambda web editor for much of anything- as with any production code, you should be developing locally, committing to git, etc.
MY FLOW:
1) My Lambda functions are usually helper utilities for a larger project, so I create a /aws/lambdas directory within that to house them.
2) Each individual lambda directory contains an index.js file containing the function code, a package.json file defining dependencies, and a /node_modules subdirectory. (The package.json file is not used by Lambda, it's just so we can locally run the npm install
command.)
package.json:
{
"name": "my_lambda",
"dependencies": {
"svg2png": "^4.1.1"
}
}
3) I .gitignore all node_modules directories and .zip files so that the files generated from npm installs and zipping won't clutter our repo.
.gitignore:
# Ignore node_modules
**/node_modules
# Ignore any zip files
*.zip
4) I install modules, develop and test locally
5) I .zip the lambda directory and upload it via the console.
(IMPORTANT: Do not use Mac's 'compress' utility from Finder to zip the file! You must run zip from the CLI from within the root of the directory- see here)
zip -r ../yourfilename.zip *
See also AWS Lambda Deployment Package in Node.js - AWS Lambda
NOTE:
You might run into a problem where a module like PhantomJS builds OS-specific binaries, and so the node package built locally on OSX ends up failing in Lambda.
The answer I found here was to use these scripts to build it within a Docker container.
回答3:
Hope this helps, with Serverless framework you can do something like this:
- Add these things in your serverless.yml file:
plugins:
- serverless-webpack
custom:
webpackIncludeModules:
forceInclude:
- <your package name> (for example: node-fetch)
2. Then create your Lambda function, deploy it by serverless deploy
, the package that included in serverless.yml will be there for you.
For more information about serverless: https://serverless.com/framework/docs/providers/aws/guide/quick-start/
回答4:
You can now use Lambda Layers for this matters. Simply add a layer containing the package you need and it will run perfectly.
Follow this post: https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e
回答5:
npm module has to be bundeled inside your nodejs package and upload to AWS Lambda Layers as zip, then you would need to refer to your module/js as below and use available methods from it. const mymodule = require('/opt/nodejs/MyLogger');
来源:https://stackoverflow.com/questions/34437900/how-to-load-npm-modules-in-aws-lambda