Amazon Web ServicesCloud

lambda-local: 命令行工具 用于在本地计算机上运行Amazon Lambda函数

Lambda-local


Lambda-local允许您在本地机器上测试nodejsamazon Lambda函数,方法是提供一个简单的API和command-line工具。

它的目标并不是像serverless-offline或docker-lambda那样完美地证明特性,而是保持非常轻(它仍然提供一个完全构建的Context,处理其所有参数和函数,并且所有的东西都可以轻松地定制)。

主要目标是单元测试和本地运行lambda函数。

Install

npm install -g lambda-local

Build

make build

Or

npm install
npm install --only=dev
npm run build

Usage


  • 作为API:也可以在脚本中直接使用Lambda local。例如,为了获得测试覆盖率,在MochaJS测试套件中很有趣。
  • 作为命令行工具:可以使用Lambda-local作为命令行工具。

About: API


LambdaLocal

API可通过以下方式访问:

const lambdaLocal = require("lambda-local");

或者在TypeScript上(支持1.7.0+):

import lambdaLocal = require("lambda-local");

lambdaLocal.execute(options)

执行给定options对象的lambda,该对象是一个字典,其中的键可能是:

lambdaLocal.setLogger(logger)

lambdaLocal.getLogger()

这些函数允许访问lambda-local使用的winston记录器。

API examples


在这里的测试文件中可以找到很多例子,尤其是在摩卡中使用的例子

基本用法:使用承诺

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);
});

基本用法:使用回调

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'})
});

About: CLI


Available Arguments

    -l, --lambda-path <lambda index path>(必需)指定Lambda函数文件名。
    -e, --event-path <event path>(必需)指定事件数据文件名。
    -h, --handler <handler name>(可选)Lambda函数处理程序名称。默认为“处理程序”。
    -t, --timeout <timeout>(可选)秒,直到lambda函数超时。默认值为3秒。
    -r, --region <aws region>(可选)设置AWS区域,默认为us-east-1。
    -P, --profile-path <aws profile name>(可选)读取指定的AWS凭据文件。
    -p, --profile <aws profile name>(可选)与-P一起使用:读取文件的AWS配置文件。
    -E, --environment <JSON {key:value}>(可选)为lambda设置额外的环境变量
    --wait-empty-event-loop(可选)Sets callbackitsforemptyeventloop=True=>将在返回之前等待空循环。默认情况下,这是错误的,因为我们的实现并不完美,只“模拟”它。
    --envdestroy(可选)关闭时销毁添加的环境。默认为false
    -v, --verboselevel <3/2/1/0>(可选)默认值3。级别2消除handler()文本,级别1消除lambda-local文本,级别0也消除结果。
    --envfile <path/to/env/file>(可选)从env文件设置额外的环境变量
    --inspect [[host:]port](可选)使用NodeJS检查器启动lambda-local(在NodeJS>8.0.0中提供)
    -W, --watch [port](可选)在监视模式下启动lambda-local,监听指定的端口[1-65535]。

CLI examples

# 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"}'

将lambda函数作为HTTP服务器运行

一种简单的方法可以在本地运行lambda函数,而不需要创建任何特殊的模板文件(比如serverlessplugin和SAM所需的),只需添加参数--watch。它将引发一个监听指定端口的http服务器(默认值为8008),然后您可以通过请求体将事件负载传递给处理程序。

lambda-local -l examples/handler_helloworld.js -h handler --watch 8008

curl --request POST \
  --url http://localhost:8008/ \
  --header 'content-type: application/json' \
  --data '{
"event": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
}'

About: Definitions


Event data

事件示例数据被放在examples文件夹中-请随意使用此处的文件,或创建您自己的事件数据。事件数据只是导出的JSON对象:

// Sample event data
module.exports = {
	foo: "bar"
};

Context

context对象是从在AWS上运行实际Lambda函数时可见的内容中取样的,以及可用的文档,它们可能会更改该对象的内部结构,Lambda-local并不保证与实际上下文对象总是up-to-date。

AWS-SDK

由于Amazon Lambda可以在不安装的情况下加载AWS-SDKnpm,Lambda-local还将AWS-SDK打包在其依赖项中。如果您想使用这个,请在aws凭证文件中使用-p-P选项(或它们的API对应项)。更多信息请点击:http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-config-files