Запуск нового программного проекта? Проверьте Code Genie - полный генератор приложений стека, который обеспечивает полный проект AWS без сервера с исходным кодом на основе вашей модели данных. Включая:
Запустите API REST и другие веб -приложения, используя свой существующий фреймворк приложения Node.js (Express, KOA, HAPI, паруса и т. Д.), Помимо 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" важен для работы Server Express для работы.
// function.json
{
"bindings" : [
{
"authLevel" : " anonymous " ,
"type" : " httpTrigger " ,
"direction" : " in " ,
"name" : " req " ,
"route" : " {*segments} "
},
{
"type" : " http " ,
"direction" : " out " ,
"name" : " $return "
}
]
}resolutionMode для использования "CONTEXT" или "CALLBACK"isBase64Encoded без указания binaryMimeTypes . Используйте binarySettings для настройки. Спасибо @dougmoscrop от https://github.com/dougmoscrop/serverless-httprespondWithErrors упрощают отладки во время разработкиСм. Upgrade.md для обновления от AWS-Serverless-Express и @Codegenie/Serverless-Express 3.x
Определите, должен ли ответ быть закодирован BASE64, прежде чем возвращать в источник события, например, при возврате изображений или сжатых файлов. Это необходимо из -за того, что API -шлюз и другие источники событий не способны напрямую обрабатывать бинарные ответы. Источник событий является тогда ответственным за превращение этого в бинарный формат, прежде чем его возвращают клиенту.
По умолчанию это определяется на основе заголовков content-encoding и content-type возвращаемых вашим приложением. Если вам нужен дополнительный контроль над этим, вы можете указать binarySettings .
{
binarySettings : {
isBinary : ( { headers } ) => true ,
contentTypes : [ 'image/*' ] ,
contentEncodings : [ ]
}
}Любое значение, которое вы здесь предоставляете, также должно быть указано на API API API. В Сэме это выглядит как:
ExpressApi :
Type : AWS::Serverless::Api
Properties :
StageName : prod
BinaryMediaTypes : ['image/*']'PROMISE' ) Lambda поддерживает три метода, чтобы положить конец исполнению и вернуть результат: контекст, обратный вызов и обещание. По умолчанию, Server-Express использует разрешение перспективы, но вы можете указать «контекст» или «обратный вызов», если вам нужно изменить это. Если вы указываете «обратный вызов», то context.callbackWaitsForEmptyEventLoop = false также установлен для вас.
serverlessExpress ( {
app ,
resolutionMode : 'CALLBACK'
} )process.env.NODE_ENV === 'development' ) Установите это в True для того, чтобы иметь Server-Express, включите трасю стека ошибок в случае нездорового исключения. Это особенно полезно во время разработки. По умолчанию это включено при NODE_ENV === 'development' , так что трассировка стека не возвращается в производство.
Server-Express Necally поддерживает API Gateway, Alb и Lambda@Edge. Если вы хотите использовать Express с другими службами AWS, интегрированными с Lambda, вы можете предоставить свои собственные пользовательские сопоставления запроса/ответа через eventSource . См. Пример пользовательского маппер-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
}
} ) Одна функция может быть настроена для обработки дополнительных видов событий 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 с помощью debug info 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
30/30 библиотека AWS Serverless Express переместилась с AWS в Вендию и будет переименована в @codegenie/serverless-express . Аналогичным образом, пакет NPM aws-serverless-express будет устарел в пользу @Codegenie/Serverless-Express.
Бретт Эндрюс, оригинальный создатель библиотеки без серверов, продолжит поддерживать репозиторий и уделять ему внимание и заботу, которых он заслуживает. В то же время мы будем искать дополнительных участников для участия в разработке и управлении библиотекой без серверов Express. AWS и команда SAM останутся вовлеченными в административную роль наряду с Вендией, Бреттом и новыми сопровождающими, которые присоединятся к проекту.
Мы считаем, что это лучший курс действий, чтобы клиенты, использующие эту библиотеку, получают наилучшую возможную поддержку в будущем. Чтобы узнать больше об этом ходе или стать сопровождающим новой библиотеки без серверов, обратитесь к нам через проблему GitHub в этом репозитории.
Лучшая команда AWS Serverless, Brett & The Vendia Team