Démarrer un nouveau projet logiciel? Consultez Code Genie - un générateur d'applications de pile complet qui fournit un projet AWS sans serveur complet avec du code source, en fonction de votre modèle de données. Y compris:
Exécutez des API REST et d'autres applications Web à l'aide de votre framework d'application Node.js existant (Express, KOA, HAPI, SAILS, etc.), en plus de la passerelle AWS Lambda et Amazon API ou fonction Azure.
npm install @codegenie/serverless-expressEnvie de courir rapidement? Consultez notre exemple de démarrage de base qui comprend:
Si vous souhaitez migrer une application existante vers AWS Lambda, il est conseillé d'obtenir l'exemple minimal opérationnel en premier, puis de copier votre source d'application.
Le seul code spécifique AWS Lambda que vous devez écrire est un gestionnaire simple comme ci-dessous. Tous les autres code que vous pouvez écrire comme vous le faites normalement.
// lambda.js
const serverlessExpress = require ( '@codegenie/serverless-express' )
const app = require ( './app' )
exports . handler = serverlessExpress ( { app } )Si votre application doit effectuer des tâches d'amorçage courantes telles que la connexion à une base de données avant que la demande ne soit transmise à l'API, vous pouvez utiliser le modèle suivant (également disponible dans cet exemple):
// 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 Le seul code spécifique à la fonction Azure que vous devez écrire est un simple index.js et une function.json comme ci-dessous.
// 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 )
} Le paramètre de liaison "name": "$return" est important pour que Serverless Express fonctionne.
// function.json
{
"bindings" : [
{
"authLevel" : " anonymous " ,
"type" : " httpTrigger " ,
"direction" : " in " ,
"name" : " req " ,
"route" : " {*segments} "
},
{
"type" : " http " ,
"direction" : " out " ,
"name" : " $return "
}
]
}resolutionMode pour utiliser "CONTEXT" ou "CALLBACK"isBase64Encoded AUTOMATIQUE SANS SPÉCIFICITION DES binaryMimeTypes . Utilisez binarySettings pour personnaliser. Merci à @dougmoscrop de https://github.com/dougmoscrop/serverless-httprespondWithErrors facilite le débogage pendant le développementVoir Updgrade.md pour passer à partir de AWS-Serverless-Express et @ CodeGenie / Serverless-Express 3.x
Déterminez si la réponse doit être encodée Base64 avant d'être renvoyée à la source d'événement, par exemple, lors du retour d'images ou de fichiers compressés. Cela est nécessaire en raison de la passerelle API et d'autres sources d'événements qui ne sont pas capables de gérer directement les réponses binaires. La source de l'événement est alors responsable de la transformation en format binaire avant d'être renvoyé au client.
Par défaut, cela est déterminé en fonction des en-têtes content-encoding et content-type renvoyés par votre application. Si vous avez besoin d'un contrôle supplémentaire à ce sujet, vous pouvez spécifier binarySettings .
{
binarySettings : {
isBinary : ( { headers } ) => true ,
contentTypes : [ 'image/*' ] ,
contentEncodings : [ ]
}
}Toute valeur que vous fournissez ici doit également être spécifiée sur l'API API API. Dans Sam, cela ressemble à:
ExpressApi :
Type : AWS::Serverless::Api
Properties :
StageName : prod
BinaryMediaTypes : ['image/*']'PROMISE' ) Lambda prend en charge trois méthodes pour mettre fin à l'exécution et renvoyer un résultat: contexte, rappel et promesse. Par défaut, Serverless-Express utilise une résolution de promesses, mais vous pouvez spécifier «contexte» ou «rappel» si vous devez modifier cela. Si vous spécifiez «rappel», alors context.callbackWaitsForEmptyEventLoop = false est également défini pour vous.
serverlessExpress ( {
app ,
resolutionMode : 'CALLBACK'
} )process.env.NODE_ENV === 'development' ) Définissez ceci sur true pour avoir une express sans serveur incluez la trace de pile d'erreur en cas d'exception non gérée. Ceci est particulièrement utile pendant le développement. Par défaut, cela est activé lorsque NODE_ENV === 'development' afin que la trace de pile ne soit pas renvoyée en production.
Express sans serveur prend en charge Nativement API Gateway, Alb et Lambda @ Edge. Si vous souhaitez utiliser Express avec d'autres services AWS intégrés à Lambda, vous pouvez fournir vos propres mappages de demande / réponse personnalisés via eventSource . Voir l'exemple personnalisé-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
}
} ) Une seule fonction peut être configurée pour gérer des types supplémentaires d'événements AWS:
En supposant la configuration de la fonction suivante dans 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.cloudformationEt la configuration suivante:
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' ,
}
} )Alternativement, pour gérer uniquement les événements SNS (les clés de la carte sont facultatives )
serverlessExpress ( {
app ,
eventSourceRoutes : {
'AWS_SNS' : '/sns' ,
}
} ) Les événements POST sur les routes configurées.
De plus, pour garantir les événements propagés à partir d'un événement interne et non à l'extérieur, il est fortement recommandé de s'assurer que l'en-tête Host correspond:
sns.amazonaws.comdynamodb.amazonaws.comsqs.amazonaws.comevents.amazonaws.comkinesis.amazonaws.com Spécifiez les paramètres du journal qui sont transmis à la journalisation par défaut. Actuellement, vous ne pouvez définir que le level de journal.
{
logSettings : {
level : 'debug' // default: 'error'
}
} Fournissez un objet log personnalisé avec info , debug et des méthodes error . Par exemple, vous pouvez remplacer la valeur par défaut avec une instance de journal Winston.
{
log : {
info ( message , additional ) {
console . info ( message , additional )
} ,
debug ( message , additional ) {
console . debug ( message , additional )
} ,
error ( message , additional ) {
console . error ( message , additional )
}
}
} Ce package expose une fonction pour obtenir facilement l' event et les objets context que Lambda reçoit de la source d'événement.
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
Le 11/30, la bibliothèque AWS Serverless Express est passée d'AWS à Vendia et sera rebaptisée à @codegenie/serverless-express . De même, le package NPM aws-serverless-express sera obscurci en faveur de @ CodeGenie / Serverless-Express.
Brett Andrews, le créateur d'origine de la bibliothèque Express sans serveur, continuera de maintenir le référentiel et de lui donner l'attention et les soins qu'elle mérite. Dans le même temps, nous rechercherons des contributeurs supplémentaires pour participer au développement et à la gestion de la bibliothèque Express sans serveur. AWS et l'équipe SAM resteront impliqués dans un rôle administratif aux côtés de Vendia, Brett et des nouveaux responsables qui rejoindront le projet.
Nous pensons que c'est le meilleur plan d'action pour garantir que les clients utilisant cette bibliothèque obtiennent le meilleur support possible à l'avenir. Pour en savoir plus sur cette décision ou devenir un responsable de la nouvelle bibliothèque Express sans serveur, contactez-nous via un problème GitHub sur ce référentiel.
Meilleur, l'équipe AWS Serverless, Brett et l'équipe Vendia