Iniciando um novo projeto de software? Confira o código Genie - um gerador de aplicativos de pilha completa que fornece um projeto completo sem servidor da AWS com código -fonte, com base no seu modelo de dados. Incluindo:
Execute APIs REST e outros aplicativos da Web usando sua estrutura de aplicativos Node.js existente (Express, Koa, Hapi, Sails etc.), em cima da função AWS Lambda e Amazon API Gateway ou Azure.
npm install @codegenie/serverless-expressQuer subir e funcionar rapidamente? Confira nosso exemplo básico de partida que inclui:
Se você deseja migrar um aplicativo existente para a AWS Lambda, é aconselhável colocar o exemplo mínimo em funcionamento primeiro e copiar sua fonte de aplicativo.
O único código específico da AWS Lambda que você precisa escrever é um manipulador simples como abaixo. Todo o outro código que você pode escrever como normalmente faz.
// lambda.js
const serverlessExpress = require ( '@codegenie/serverless-express' )
const app = require ( './app' )
exports . handler = serverlessExpress ( { app } )Se o seu aplicativo precisar executar algumas tarefas comuns de bootstrap, como conectar -se a um banco de dados antes que a solicitação seja encaminhada para a API, você poderá usar o seguinte padrão (também disponível neste exemplo):
// 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 O único código específico da função do Azure que você precisa escrever é um simples index.js e uma function.json como abaixo.
// 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 )
} O parâmetro de ligação "name": "$return" é importante para o Express sem servidor funcionar.
// function.json
{
"bindings" : [
{
"authLevel" : " anonymous " ,
"type" : " httpTrigger " ,
"direction" : " in " ,
"name" : " req " ,
"route" : " {*segments} "
},
{
"type" : " http " ,
"direction" : " out " ,
"name" : " $return "
}
]
}resolutionMode para usar "CONTEXT" ou "CALLBACK"isBase64Encoded automático desconhecido sem especificar binaryMimeTypes . Use binarySettings para personalizar. Obrigado a @dougmoscrop de https://github.com/dougmoscrop/serverless-httprespondWithErrors facilita a depuração durante o desenvolvimentoConsulte Upgrade.md para atualizar do AWS-Serverless-Express e @codegenie/serverless-express 3.x
Determine se a resposta deve ser baseada em Base64 antes de ser devolvida à fonte do evento, por exemplo, ao retornar imagens ou arquivos compactados. Isso é necessário devido ao gateway da API e outras fontes de eventos que não são capazes de lidar diretamente com as respostas binárias. A fonte do evento é então responsável por transformar isso de volta em um formato binário antes de ser devolvido ao cliente.
Por padrão, isso é determinado com base nos cabeçalhos content-encoding e content-type retornados pelo seu aplicativo. Se você precisar de controle adicional sobre isso, poderá especificar binarySettings .
{
binarySettings : {
isBinary : ( { headers } ) => true ,
contentTypes : [ 'image/*' ] ,
contentEncodings : [ ]
}
}Qualquer valor que você fornecer aqui também deve ser especificado na API Gateway API. Em Sam, isso se parece:
ExpressApi :
Type : AWS::Serverless::Api
Properties :
StageName : prod
BinaryMediaTypes : ['image/*']'PROMISE' ) A Lambda suporta três métodos para encerrar a execução e retornar um resultado: contexto, retorno de chamada e promessa. Por padrão, o servidor sem servidor usa a resolução da promessa, mas você pode especificar 'contexto' ou 'retorno de chamada' se precisar alterar isso. Se você especificar 'retorno de chamada', então context.callbackWaitsForEmptyEventLoop = false também está definido para você.
serverlessExpress ( {
app ,
resolutionMode : 'CALLBACK'
} )process.env.NODE_ENV === 'development' ) Defina isso como TRUE para ter o Express sem servidor incluir o rastreamento da pilha de erros no caso de uma exceção não tratada. Isso é especialmente útil durante o desenvolvimento. Por padrão, isso é ativado quando NODE_ENV === 'development' , para que o rastreamento da pilha não seja retornado na produção.
O servidor sem servidor suporta nativamente o gateway da API, alb e lambda@edge. Se você deseja usar o Express com outros serviços da AWS integrados ao Lambda, poderá fornecer seus próprios mapeamentos de solicitação/resposta personalizados via eventSource . Consulte o exemplo 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
}
} ) Uma única função pode ser configurada para lidar com os tipos adicionais de eventos da AWS:
Assumindo a seguinte configuração de função em 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.cloudformationE a seguinte configuração:
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' ,
}
} )Como alternativa, para lidar com apenas eventos SNS (as chaves no mapa são opcionais )
serverlessExpress ( {
app ,
eventSourceRoutes : {
'AWS_SNS' : '/sns' ,
}
} ) Os eventos serão POST nas rotas configuradas.
Além disso, para garantir que os eventos propagados a partir de um evento interno e não externamente, é altamente recomendável garantir que o cabeçalho Host corresponda:
sns.amazonaws.comdynamodb.amazonaws.comsqs.amazonaws.comevents.amazonaws.comkinesis.amazonaws.com Especifique as configurações de log que são passadas para o logger padrão. Atualmente, você pode definir apenas o level de log.
{
logSettings : {
level : 'debug' // default: 'error'
}
} Forneça um objeto log personalizado com info , debug e métodos error . Por exemplo, você pode substituir o padrão por uma instância de log 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 pacote expõe uma função para obter facilmente o event e os objetos context que Lambda recebe da fonte do 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
Em 30/11, a biblioteca expresso sem servidor da AWS mudou da AWS para a VENDIA e será renomeada para @codegenie/serverless-express . Da mesma forma, o pacote aws-serverless-express NPM será obsoleto em favor do @CodeGenie/Serverless-Express.
Brett Andrews, o criador original da biblioteca expresso sem servidor, continuará mantendo o repositório e dará a atenção e os cuidados que merecem. Ao mesmo tempo, procuraremos colaboradores adicionais para participar do desenvolvimento e da administração da biblioteca expressa sem servidor. A AWS e a equipe do SAM permanecerão envolvidas em uma função administrativa ao lado de Vendia, Brett e os novos mantenedores que ingressarão no projeto.
Acreditamos que este é o melhor curso de ação para garantir que os clientes que usam essa biblioteca obtenham o melhor suporte possível no futuro. Para saber mais sobre esse movimento ou se tornar um mantenedor da nova biblioteca expressa sem servidor, entre em contato conosco por meio de um problema do GitHub neste repositório.
Melhor, a equipe sem servidor da AWS, Brett & the Vendia Team