¿Comenzar un nuevo proyecto de software? Consulte el código Genie: un generador de aplicaciones de pila completa que ofrece un proyecto completo sin servidor de AWS con código fuente, según su modelo de datos. Incluido:
Ejecute las API REST y otras aplicaciones web utilizando su marco de aplicación Node.js existente (Express, KOA, HAPI, Sails, etc.), además de AWS Lambda y Amazon API Gateway o función Azure.
npm install @codegenie/serverless-express¿Quieres ponerte en funcionamiento rápidamente? Echa un vistazo a nuestro ejemplo de inicio básico que incluye:
Si desea migrar una aplicación existente a AWS Lambda, se recomienda poner el ejemplo mínimo en funcionamiento primero, y luego copie la fuente de su aplicación.
El único código específico de AWS Lambda que necesita escribir es un manejador simple como a continuación. Todo el otro código que puede escribir como lo hace normalmente.
// lambda.js
const serverlessExpress = require ( '@codegenie/serverless-express' )
const app = require ( './app' )
exports . handler = serverlessExpress ( { app } )Si su aplicación necesita realizar algunas tareas de arranque comunes, como conectarse a una base de datos antes de que la solicitud sea reenviada a la API, puede usar el siguiente patrón (también disponible en este ejemplo):
// 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 El único código específico de la función Azure que necesita escribir es un simple index.js y una function.json como a continuación.
// 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 )
} El parámetro de vinculación "name": "$return" es importante para que el Servidor Express funcione.
// function.json
{
"bindings" : [
{
"authLevel" : " anonymous " ,
"type" : " httpTrigger " ,
"direction" : " in " ,
"name" : " req " ,
"route" : " {*segments} "
},
{
"type" : " http " ,
"direction" : " out " ,
"name" : " $return "
}
]
}resolutionMode para usar "CONTEXT" o "CALLBACK"isBase64Encoded automático codificado sin especificar binaryMimeTypes . Use binarySettings para personalizar. Gracias a @dougmoscrop desde https://github.com/dougmoscrop/serverless-httprespondWithErrors hace que sea más fácil depurar durante el desarrolloConsulte Actualade.md para actualizar desde AWS-Serverless-Express y @Codegenie/Serverless-Express 3.x
Determine si la respuesta debe estar codificada Base64 antes de devolverse a la fuente del evento, por ejemplo, al devolver imágenes o archivos comprimidos. Esto es necesario debido a la puerta de enlace API y otras fuentes de eventos que no son capaces de manejar las respuestas binarias directamente. La fuente del evento es responsable de volver a convertir esto en un formato binario antes de ser devuelto al cliente.
Por defecto, esto se determina en función de los encabezados content-encoding content-type devueltos por su aplicación. Si necesita control adicional sobre esto, puede especificar binarySettings .
{
binarySettings : {
isBinary : ( { headers } ) => true ,
contentTypes : [ 'image/*' ] ,
contentEncodings : [ ]
}
}Cualquier valor que proporcione aquí también debe especificarse en API Gateway API. En Sam, esto parece:
ExpressApi :
Type : AWS::Serverless::Api
Properties :
StageName : prod
BinaryMediaTypes : ['image/*']'PROMISE' ) Lambda admite tres métodos para finalizar la ejecución y devolver un resultado: contexto, devolución de llamada y promesa. De manera predeterminada, Serverless-Express usa una resolución de promesa, pero puede especificar 'contexto' o 'devolución de llamada' si necesita cambiar esto. Si especifica 'devolución de llamada', entonces context.callbackWaitsForEmptyEventLoop = false también está configurado para usted.
serverlessExpress ( {
app ,
resolutionMode : 'CALLBACK'
} )process.env.NODE_ENV === 'development' ) Establezca esto en verdadero para que el serverless-express incluya el rastreo de la pila de errores en caso de una excepción no controlada. Esto es especialmente útil durante el desarrollo. Por defecto, esto está habilitado cuando NODE_ENV === 'development' para que la traza de pila no se devuelva en la producción.
Serverless-Express es compatible con API Gateway, Alb y Lambda@Edge. Si desea utilizar Express con otros servicios de AWS integrados con Lambda, puede proporcionar sus propias asignaciones de solicitud/respuesta personalizadas a través de eventSource . Consulte el ejemplo personalizado-mapper-dynamodb.
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
}
} ) Se puede configurar una sola función para manejar tipos adicionales de eventos de AWS:
Suponiendo la siguiente configuración de la función en 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.cloudformationY la siguiente configuración:
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' ,
}
} )Alternativamente, para manejar solo eventos SNS (las teclas en el mapa son opcionales )
serverlessExpress ( {
app ,
eventSourceRoutes : {
'AWS_SNS' : '/sns' ,
}
} ) Los eventos POST en las rutas configuradas.
Además, para garantizar que los eventos se propagan a partir de un evento interno y no externamente, se recomienda encarecidamente garantizar que las coinciden el encabezado Host :
sns.amazonaws.comdynamodb.amazonaws.comsqs.amazonaws.comevents.amazonaws.comkinesis.amazonaws.com Especifique la configuración del registro que se pasan al registrador predeterminado. Actualmente, solo puede establecer el level de registro.
{
logSettings : {
level : 'debug' // default: 'error'
}
} Proporcione un objeto log personalizado con info , debug y métodos error . Por ejemplo, puede anular el valor predeterminado con una instancia de registro de Winston.
{
log : {
info ( message , additional ) {
console . info ( message , additional )
} ,
debug ( message , additional ) {
console . debug ( message , additional )
} ,
error ( message , additional ) {
console . error ( message , additional )
}
}
} Este paquete expone una función para obtener fácilmente el event y los objetos context que Lambda recibe de la fuente del evento.
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
El 30/11, la Biblioteca Express sin servidor AWS se movió de AWS a Vendia y se cambiará de marca a @codegenie/serverless-express . Del mismo modo, el paquete NPM aws-serverless-express estará desapercibido a favor de @Codegenie/Serverless-Express.
Brett Andrews, el creador original de la Biblioteca Express de Serverless, continuará manteniendo el repositorio y le dará la atención y el cuidado que merece. Al mismo tiempo, buscaremos colaboradores adicionales para participar en el desarrollo y la administración de la Biblioteca Express Servgerless. AWS y el equipo SAM permanecerán involucrados en un papel administrativo junto con Vendia, Brett y los nuevos mantenedores que se unirán al proyecto.
Creemos que este es el mejor curso de acción para garantizar que los clientes que usan esta biblioteca obtengan el mejor soporte posible en el futuro. Para obtener más información sobre este movimiento o convertirse en un mantenedor de la nueva Biblioteca Express sin servidor, comuníquese con nosotros a través de un problema de GitHub en este repositorio.
Lo mejor, el equipo sin servidor de AWS, Brett y el equipo de Vendia