reviews-analysis
Version:
Analyse public vehicle reviews via ML (Aylien) and save the data into a Document Store (Mongo). Supports Classifications and Document and Aspect level Sentiment Analysis.
223 lines (172 loc) • 8.08 kB
Markdown
# Lambda-local
[](https://travis-ci.org/ashiina/lambda-local)
Lambda-local lets you test Amazon Lambda functions on your local machine with sample event data.
The `context` of the Lambda function is already loaded so you do not have to worry about it.
You can pass any `event` JSON object as you please.
## Install
```bash
npm install -g lambda-local
```
## Usage
### As a command line tool
You can use Lambda-local as a command line tool.
```bash
# Simple usage
lambda-local -l index.js -h handler -e examples/s3-put.js
# Input environment variables
lambda-local -l index.js -h handler -e examples/s3-put.js -E '{"key":"value","key2":"value2"}'
```
### In another node.js script
You can also use Lambda local directly in a script. For instance, it is interesting in a [MochaJS][1] test suite in order to get test coverage.
See [API](#about-api) for more infos
## About: CLI
### Command
* -l, --lambda-path <lambda index path> (required) Specify Lambda function file name.
* -e, --event-path <event path> (required) Specify event data file name.
* -h, --handler <handler name> (optional) Lambda function handler name. Default is "handler".
* -t, --timeout <timeout> (optional) Seconds until lambda function timeout. Default is 3 seconds.
* -r, --region <aws region> (optional) Sets the AWS region, defaults to us-east-1.
* -P, --profile-path <aws profile name> (optional) Read the specified AWS credentials file.
* -p, --profile <aws profile name> (optional) Use with **-P**: Read the AWS profile of the file.
* -E, --environment <JSON {key:value}> (optional) Set extra environment variables for the lambda
* --wait-empty-event-loop (optional) Sets callbackWaitsForEmptyEventLoop=True => will wait for an empty loop before returning. This is false by default because our implementation isn\'t perfect and only "emulates" it.
* --envdestroy (optional) Destroy added environment on closing. Defaults to false
* -v, --verboselevel <3/2/1/0>', (optional) Default 3. Level 2 dismiss handler() text, level 1 dismiss lambda-local text and level 0 dismiss also the result.
* --envfile <path/to/env/file> (optional) Set extra environment variables from an env file
* --inspect [[host:]port] (optional) Starts lambda-local using the NodeJS inspector (available in nodejs > 8.0.0)
### Event data
Event sample data are placed in `examples` folder - feel free to use the files in here, or create your own event data.
Event data are just JSON objects exported:
```js
// Sample event data
module.exports = {
foo: "bar"
};
```
### Context
The `context` object has been directly extracted from the source visible when running an actual Lambda function on AWS.
They may change the internals of this object, and Lambda-local does not guarantee that this will always be up-to-date with the actual context object.
### AWS-SDK
Since the Amazon Lambda can load the AWS-SDK npm without installation, Lambda-local has also packaged AWS-SDK in its dependencies.
If you want to use this, please use the "-p" option with the aws credentials file. More infos here:
http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-config-files
## About: API
### LambdaLocal
#### `execute(options)`
Executes a lambda given the `options` object where keys are:
- `event` - requested event as a json object
- `lambdaPath` - requested path to the lambda function
- `lambdaFunc` - pass the lambda function. You cannot use it at the same time as lambdaPath
- `profilePath` - optional, path to your AWS credentials file
- `profileName` - optional, aws profile name. Must be used with
- `lambdaHandler` - optional handler name, default to `handler`
- `region` - optional, AWS region, default to `us-east-1`
- `callbackWaitsForEmptyEventLoop` - optional, default to `false`. Setting it to True will wait for an empty loop before returning.
- `timeoutMs` - optional, timeout, default to 3000 ms
- `environment` - optional, extra environment variables for the lambda
- `envfile` - optional, load an environment file before booting
- `envdestroy` - optional, destroy added environment on closing, default to false
- `verboseLevel` - optional, default 3. Level 2 dismiss handler() text, level 1 dismiss lambda-local text and level 0 dismiss also the result.
- `callback` - optional, lambda third parameter [callback][1]. When left out a Promise is returned
- `clientContext` - optional, used to populated clientContext property of lambda second parameter (context)
#### `setLogger(logger)`
If you are using [winston](https://www.npmjs.com/package/winston), this pass a winston logger instead of the console.
## Example Usage for API
#### Basic: In another node.js script
```js
const lambdaLocal = require('lambda-local');
var jsonPayload = {
'key': 1,
'another_key': "Some text"
}
lambdaLocal.execute({
event: jsonPayload,
lambdaPath: path.join(__dirname, 'path_to_index.js'),
profilePath: '~/.aws/credentials',
profileName: 'default',
timeoutMs: 3000,
callback: function(err, data) {
if (err) {
console.log(err);
} else {
console.log(data);
}
},
clientContext: JSON.stringify({clientId: 'xxxx'})
});
```
##### Using Promises
```js
const lambdaLocal = require('lambda-local');
var jsonPayload = {
'key': 1,
'another_key': "Some text"
}
lambdaLocal.execute({
event: jsonPayload,
lambdaPath: path.join(__dirname, 'path_to_index.js'),
profilePath: '~/.aws/credentials',
profileName: 'default',
timeoutMs: 3000
}).then(function(done) {
console.log(done);
}).catch(function(err) {
console.log(err);
});
```
### Use lambda-local to Mock
You can use Lambda local to mock your lambda then run it, using [MochaJS][1] and [SinonJS][2]
In this sample, we assume that you got a test function like this:
```js
/*
* Lambda function used to test mocking.
*/
exports.getData = function getData(){
return "WrongData";
}
exports.handler = function(event, context) {
context.done(null, exports.getData());
};
```
Then you will be able to use in your test.js mocha file, something like:
```js
//An empty event
var jsonPayload = {
}
var done, err;
before(function (cb) {
var lambdalocal = require('lambda-local');
lambdalocal.setLogger(your_winston_logger);
var lambdaFunc = require("path_to_test-function.js");
//For instance, this will replace the getData content
sinon.mock(lambdaFunc).expects("getData").returns("MockedData");
//see on sinonjs page for more options
lambdalocal.execute({
event: jsonPayload,
lambdaFunc: lambdaFunc, //We are directly passing the lambda function
lambdaHandler: "handler",
callbackWaitsForEmptyEventLoop: true,
timeoutMs: 3000,
callback: function (_err, _done) { //We are storing the results and finishing the before() call => one lambda local call for multiple tests
err = _err;
done = _done;
cb();
},
verboseLevel: 1 //only prints a JSON of the final result
});
});
describe("Your first test", function () {
it("should return mocked value", function () {
assert.equal(done, "MockedData");
});
});
... Other tests
```
[1]: https://mochajs.org/
[2]: http://sinonjs.org/
## Development
* Run `make` to install npm modules. (Required to develop & test lambda-local)
* Run `make test` to execute the mocha test.
## License
This library is released under the MIT license.
[1]: http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html