无服务器快递 文迪亚
使用您的已有程序运行 REST API 和其他网络应用程序 节点.js 应用程序框架(Express, Koa, Hapi, Sails等),顶部 AWS 兰布达 财务报告和审定财务报表 亚马逊 API 网关 或者说 Azure 函数。 。 。 .
npm install @vendia/serverless-express
快速启动/实例
想起来跑快吗? 检查我们的基本启动例 包括:
- Lambda 函数
- 快捷应用程序
- 无服务器应用程序模型( SAM)编号 :云阵 模板
- 配置、部署和管理应用程序的帮助脚本
如果您想要将一个已有的应用程序迁移到AWS Lambda,建议它先将最小的示例上并运行,然后复制您的应用程序源.
自动取款机
最小Lambda 处理器包装器
您需要写的唯一 AWS Lambda 具体代码是像下面这样简单的处理器. 所有其他的代码,你可以像平常一样写.
// lambda.js
const serverlessExpress = require('@vendia/serverless-express')
const app = require('./app')
exports.handler = serverlessExpress({ app })
Async 设置了 Lambda 处理器
如果您的应用程序需要执行一些常见的靴子陷阱任务, 如在请求转发到 API 之前连接到数据库, 您可以使用以下模式( 也可在 此示例:
// lambda.js
require('source-map-support/register')
const serverlessExpress = require('@vendia/serverless-express')
const app = require('./app')
let serverlessExpressInstance
function asyncTask () {
return new Promise((resolve) => {
setTimeout(() => resolve('connected to database'), 1000)
})
}
async function setup (event, context) {
const asyncValue = await asyncTask()
console.log(asyncValue)
serverlessExpressInstance = serverlessExpress({ app })
return serverlessExpressInstance(event, context)
}
function handler (event, context) {
if (serverlessExpressInstance) return serverlessExpressInstance(event, context)
return setup(event, context)
}
exports.handler = handler
阿苏雷
Async Azure 函数 v3/v4 处理器包装器
您需要写的唯一 Azure 函数特定代码是简单的 index.js (单位:千美元) function.json 就像下面一样.
// index.js
const serverlessExpress = require('@vendia/serverless-express')
const app = require('./app')
const cachedServerlessExpress = serverlessExpress({ app })
module.exports = async function (context, req) {
return cachedServerlessExpress(context, req)
}
这个 外键 参数 "name": "$return" 对无服务器快车的工作很重要.
// function.json
{
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"route": "{*segments}"
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
]
}
4.x (中文(简体) )
- 改进的 API - 终端用户使用和配置的更简单.
- 默认承诺解析模式 。 可指定
resolutionMode用于"CONTEXT"或者说"CALLBACK" - 其他事件来源 - API Gateway V1(REST API),API Gateway V2(HTTP API),ALB,Lambda@Edge
- 自定义事件源 - 如果您有其他事件源, 您想要使用我们不本地支持的源, 请检查 DynamoDB 示例
- 执行使用模拟请求/响应对象,而不是运行本地套接字上的服务器。 感谢@dougmoscrop来自 https://github.com/dougmoscrop/serverless-http 互联网档案馆的存檔,存档日期2011-12-21
- 自动
isBase64Encoded不指定binaryMimeTypes启用binarySettings来定制。 感谢@dougmoscrop来自 https://github.com/dougmoscrop/serverless-http 互联网档案馆的存檔,存档日期2011-12-21 respondWithErrors在开发期间更容易调试- 节点.js 12+
- 改进对自定义域名的支持
见 升级 从aws-serverless-express和@vendia/serverless-express 3.x升级
API 密码
二进制设置
确定在返回事件源之前,例如返回图像或压缩文件之前,是否应当将响应编码为基数64. 之所以有必要,是因为API Gateway和其他事件源无法直接处理二进制响应. 然后事件源负责在返回客户端之前将它回转为二进制格式.
默认情况下,根据 content-encoding 财务报告和审定财务报表 content-type 您的应用程序返回了信头 。 如果您需要额外的控制, 您可以指定 binarySettings。 。 。 .
{
binarySettings: {
isBinary: ({ headers }) => true,
contentTypes: ['image/*'],
contentEncodings: []
}
}
您在此提供的任何值也应在 API Gateway API 上指定 。 在SAM,这看起来像:
ExpressApi:
Type: AWS::Serverless::Api
Properties:
StageName: prod
BinaryMediaTypes: ['image/*']
解析模式( 默认 ): 'PROMISE'(中文(简体) )
Lambda支持三种方法来结束行刑并返回结果:上下文,召回和许诺. 默认情况下,无服务器表达会使用承诺解析度,但是如果需要更改,可以指定"CONTEXT"或"CALLBACK". 如果你指定"CALLBACK",那么 context.callbackWaitsForEmptyEventLoop = false 也为您设定.
serverlessExpress({
app,
resolutionMode: 'CALLBACK'
})
带有错误的响应( 默认 ): process.env.NODE_ENV === 'development'(中文(简体) )
设定为 true 以包含在未处理的例外情况下的错误堆栈跟踪 。 这在发展过程中特别有用。 默认情况下,当 NODE_ENV === 'development' 这样堆栈追踪就不会恢复生产.
高级 API
来源
服务器无表达本地支持 API Gateway, ALB, 和 Lambda@ Edge. 如果您想与其他与 Lambda 整合的 AWS 服务使用 Express , 您可以通过 eventSource见 自定义- mapper- dinamodb 实例。 。 。 .
function requestMapper ({ event }) {
// Your logic here...
return {
method,
path,
headers
}
}
function responseMapper ({
statusCode,
body,
headers,
isBase64Encoded
}) {
// Your logic here...
return {
statusCode,
body,
headers,
isBase64Encoded
}
}
serverlessExpress({
app,
eventSource: {
getRequest: requestMapper,
getResponse: responseMapper
}
})
源代码
可以配置一个单一的函数来处理更多类型的 AWS 事件 :
- 简讯
- 迪纳摩DB流
- 质量
- 事件布里奇事件(前云表事件)
假设以下函数配置在 serverless.yml数字 :
functions:
lambda-handler:
handler: src/lambda.handler
events:
- http:
path: /
method: get
- sns:
topicName: my-topic
- stream:
type: dynamodb
arn: arn:aws:dynamodb:us-east-1:012345678990:table/my-table/stream/2021-07-15T15:05:51.683
- sqs:
arn: arn:aws:sqs:us-east-1:012345678990:myQueue
- eventBridge:
pattern:
source:
- aws.cloudformation
且配置如下:
serverlessExpress({
app,
eventSourceRoutes: {
'AWS_SNS': '/sns',
'AWS_DYNAMODB': '/dynamodb',
'AWS_SQS': '/sqs'
'AWS_EVENTBRIDGE': '/eventbridge',
'AWS_KINESIS_DATA_STREAM': '/kinesis',
}
})
或者,只处理 SNS 事件(地图中的密钥是 选项(中文(简体) )
serverlessExpress({
app,
eventSourceRoutes: {
'AWS_SNS': '/sns',
}
})
活动将 POST 到已配置的路径.
另外,为了确保从内部活动而不是从外部宣传这些活动 高度建议 改为
确保 Host 页眉匹配 :
- 师曰:
sns.amazonaws.com - 迪纳摩DB:
dynamodb.amazonaws.com - 质量 :
sqs.amazonaws.com - 事件桥 :
events.amazonaws.com - KinesisData 史图:
kinesis.amazonaws.com
日志设置
指定传输到默认日志的日志设置。 目前, 您只能设置日志 level。 。 。 .
{
logSettings: {
level: 'debug' // default: 'error'
}
}
日志
提供自定义 log 对象为 info, (中文(简体) ), debug 财务报告和审定财务报表 error 方法。 。 。 例如,您可以用一个 温斯顿日志 举个例子.
{
log: {
info (message, additional) {
console.info(message, additional)
},
debug (message, additional) {
console.debug(message, additional)
},
error (message, additional) {
console.error(message, additional)
}
}
}
访问事件和上下文对象
此软件包会显示一个功能, 以方便获取 event 财务报告和审定财务报表 context lambda从事件源得到的物体.
const { getCurrentInvoke } = require('@vendia/serverless-express')
app.get('/', (req, res) => {
const { event, context } = getCurrentInvoke()
res.json(event)
})
为什么在无服务器的环境中运行快递
装入测试
npx loadtest --rps 100 -k -n 1500 -c 50 https://xxxx.execute-api.us-east-1.amazonaws.com/prod/users
AWS 无服务器快递已移动
11/30日,AWS无服务器快递库从AWS移动至 文迪亚 将被重新命名为 @vendia/serverless-express同样 aws-serverless-express 国家防范机制一揽子计划 将作有利于 @ vendia/ serverles- express。 。 。 .
布莱特,"无服务器快递"库的原始创建者,将继续维护库并给予其应有的关注和关怀. 同时,我们将寻求更多的捐助者参与无服务器快递图书馆的开发和管理。 自动取款机和 SAM小组 将与Vendia、Brett和加入该项目的新维护者一起继续参与行政工作.
我们认为,这是确保使用该图书馆的客户今后获得最佳支持的最佳行动方针。 要更多地了解这一举动或成为新的"无服务器快递"库的维护者,通过这个寄存器上的GitHub问题与我们联系.
最好这样, AWS 无服务器团队 Brett & Vendia团队