开始一个新的软件项目?查看Code Genie-完整的堆栈应用程序生成器,该生成器可根据您的数据模型提供一个带有源代码的完整无服务器项目。包括:
使用现有Node.js应用程序框架(Express,Koa,Hapi,Sails等)运行REST API和其他Web应用程序,在AWS Lambda和Amazon API Gateway或Azure功能之上。
npm install @codegenie/serverless-express想快速起床吗?查看我们的基本起动器示例,其中包括:
如果您想将现有应用程序迁移到AWS lambda,建议您首先启动并运行最小的示例,然后将您的应用程序源复制。
您需要编写的唯一AWS lambda代码是一个简单的处理程序,如下所示。您可以像平常一样编写的所有其他代码。
// lambda.js
const serverlessExpress = require ( '@codegenie/serverless-express' )
const app = require ( './app' )
exports . handler = serverlessExpress ( { app } )如果您的应用程序需要执行一些常见的引导任务,例如在请求转发到API之前连接到数据库,则可以使用以下模式(在此示例中也可用):
// lambda.js
require ( 'source-map-support/register' )
const serverlessExpress = require ( '@codegenie/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 您需要编写的唯一Azure函数是一个简单的index.js和一个function.json 。
// index.js
const serverlessExpress = require ( '@codegenie/serverless-express' )
const app = require ( './app' )
const cachedServerlessExpress = serverlessExpress ( { app } )
module . exports = async function ( context , req ) {
return cachedServerlessExpress ( context , req )
}绑定参数"name": "$return"对于无服务器Express起作用很重要。
// function.json
{
"bindings" : [
{
"authLevel" : " anonymous " ,
"type" : " httpTrigger " ,
"direction" : " in " ,
"name" : " req " ,
"route" : " {*segments} "
},
{
"type" : " http " ,
"direction" : " out " ,
"name" : " $return "
}
]
}"CONTEXT"或"CALLBACK" resolutionModeisBase64Encoded重编码而未指定binaryMimeTypes模拟。使用binarySettings来自定义。感谢https://github.com/dougmoscrop/serverless-http的@dougmoscroprespondWithErrors使得在开发过程中更容易调试请参阅upgrade.md从AWS-Serverless-express和 @codegenie/serverless-express 3.x升级
在返回事件源之前,在返回图像或压缩文件时,确定响应是否应为基本64。由于API网关和其他事件源无法直接处理二进制响应,因此这是必要的。然后,事件源负责将其转换为二进制格式,然后再返回客户。
默认情况下,这是根据您的应用程序返回的content-encoding和content-type标头确定的。如果您需要对此进行其他控制,则可以指定binarySettings 。
{
binarySettings : {
isBinary : ( { headers } ) => true ,
contentTypes : [ 'image/*' ] ,
contentEncodings : [ ]
}
}您在这里提供的任何值也应在API网关API上指定。在山姆中,这看起来像:
ExpressApi :
Type : AWS::Serverless::Api
Properties :
StageName : prod
BinaryMediaTypes : ['image/*']'PROMISE' ) Lambda支持结束执行并返回结果的三种方法:上下文,回调和承诺。默认情况下,无服务器表达式使用承诺分辨率,但是如果需要更改此问题,则可以指定“上下文”或“回调”。如果您指定“回调”,则context.callbackWaitsForEmptyEventLoop = false也为您设置。
serverlessExpress ( {
app ,
resolutionMode : 'CALLBACK'
} )process.env.NODE_ENV === 'development' )将其设置为true,以使无服务器表达式在未经治疗的异常时包含错误堆栈跟踪。这在开发过程中特别有用。默认情况下,当NODE_ENV === 'development'时,启用了这一点,以便在生产中不会返回堆栈跟踪。
无服务器表达本性支持API网关,Alb和Lambda@Edge。如果您想与与Lambda集成的其他AWS服务一起使用Express,则可以通过eventSource提供自己的自定义请求/响应映射。请参阅“自定义示例”示例。
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事件:
假设在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' ,
'AWS_S3' : '/s3' ,
'AWS_STEP_FUNCTIONS' : '/step-functions' ,
'AWS_SELF_MANAGED_KAFKA' : '/self-managed-kafka' ,
}
} )另外,仅处理SNS事件(地图中的键是可选的)
serverlessExpress ( {
app ,
eventSourceRoutes : {
'AWS_SNS' : '/sns' ,
}
} )事件将POST到配置的路线。
另外,为了确保内部事件而不是外部事件传播的事件,强烈建议确保Host标头匹配:
sns.amazonaws.comdynamodb.amazonaws.comsqs.amazonaws.comevents.amazonaws.comkinesis.amazonaws.com指定传递给默认记录器的日志设置。当前,您只能设置日志level 。
{
logSettings : {
level : 'debug' // default: 'error'
}
}提供一个自定义log对象,其中包含info , debug和error方法。例如,您可以使用Winston日志实例覆盖默认值。
{
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 ( '@codegenie/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
在11/30,AWS无服务器Express库从AWS转移到Vendia,并将重新命名为@codegenie/serverless-express 。同样,将对 @CodeGenie/serverless-express的aws-serverless-express NPM软件包进行弃用。
Serverless Express库的原始创建者Brett Andrews将继续维护存储库,并给予其应有的关注和关心。同时,我们将寻找其他贡献者,以参与无服务器Express库的开发和管理。 AWS和SAM团队将与Vendia,Brett以及将加入该项目的新维护者一起参与行政职务。
我们认为,这是确保使用此图书馆的客户在将来获得最佳支持的最佳行动。要了解有关此举的更多信息或成为新的无服务器Express库的维护者,请通过此存储库的GitHub问题与我们联系。
最好的是AWS无服务器团队,Brett&Vendia团队