새로운 소프트웨어 프로젝트 시작? Code Genie- 데이터 모델을 기반으로 소스 코드를 사용하여 완전한 AWS 서버리스 프로젝트를 제공하는 전체 스택 앱 생성기 인 Code Genie를 확인하십시오. 포함:
AWS Lambda 및 Amazon API Gateway 또는 Azure 기능 위에있는 기존 Node.js 응용 프로그램 프레임 워크 (Express, KOA, HAPI, SAILS 등)를 사용하여 REST API 및 기타 웹 응용 프로그램을 실행하십시오.
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" Serverless Express가 작동하는 것이 중요합니다.
// function.json
{
"bindings" : [
{
"authLevel" : " anonymous " ,
"type" : " httpTrigger " ,
"direction" : " in " ,
"name" : " req " ,
"route" : " {*segments} "
},
{
"type" : " http " ,
"direction" : " out " ,
"name" : " $return "
}
]
}"CONTEXT" 또는 "CALLBACK" 사용하도록 resolutionMode 지정할 수 있습니다.binaryMimeTypes 지정하지 않고 자동 isBase64Encoded . binarySettings 사용하여 사용자 정의하십시오. https://github.com/dougmoscrop/serverless-http의 @dougmoscrop에 감사드립니다respondWithErrors 사용하면 개발 중에 디버깅을보다 쉽게 디버깅 할 수 있습니다AWS-Serverless-Express 및 @CodeGenie/Serverless-Express 3.X에서 업그레이드하려면 업그레이드 .md를 참조하십시오
예를 들어 이미지 또는 압축 파일을 반환 할 때 이벤트 소스로 반환되기 전에 응답이 Base64 인코딩되어야하는지 확인하십시오. 이는 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는 실행을 종료하고 결과를 반환하는 세 가지 방법을 지원합니다 : 컨텍스트, 콜백 및 약속. 기본적으로 Serverless-Express는 약속 해상도를 사용하지만 변경 해야하는 경우 '컨텍스트'또는 '콜백'을 지정할 수 있습니다. '콜백'을 지정하면 context.callbackWaitsForEmptyEventLoop = false 도 설정됩니다.
serverlessExpress ( {
app ,
resolutionMode : 'CALLBACK'
} )process.env.NODE_ENV === 'development' ) 서버가없는 예외가 발생한 경우 오류 스택 추적이 포함되도록이를 true로 설정하십시오. 이것은 개발 중에 특히 유용합니다. 기본적으로 이것은 스택 트레이스가 생산에서 반환되지 않도록 NODE_ENV === 'development' 인 경우 활성화됩니다.
Serverless-Express는 기본적으로 API 게이트웨이, ALB 및 Lambda@Edge를 지원합니다. Lambda와 통합 된 다른 AWS 서비스와 함께 Express를 사용하려면 eventSource 통해 고유 한 사용자 정의 요청/응답 매핑을 제공 할 수 있습니다. Custom-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
}
} ) 추가 종류의 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'
}
} info , debug 및 error 방법으로 사용자 정의 log 객체에 제공하십시오. 예를 들어 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 객체를 쉽게 가져 오는 기능을 노출시킵니다.
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 Serverless Express Library는 AWS에서 Vendia로 이동하여 @codegenie/serverless-express 로 브랜드를 변경합니다. 마찬가지로 aws-serverless-express NPM 패키지는 @CodeGenie/Serverless-Express에 유리하게 더 이상 사용되지 않습니다.
Serverless Express Library의 최초 제작자 인 Brett Andrews는 저장소를 계속 유지하고 그럴만 한 관심과 치료를 제공 할 것입니다. 동시에, 우리는 Serverless Express Library의 개발 및 청지기 직분에 참여할 추가 기여자를 찾고 있습니다. AWS와 SAM 팀은 Vendia, Brett 및 프로젝트에 참여할 새로운 관리자와 함께 관리 역할에 계속 참여할 것입니다.
우리는 이것이이 라이브러리를 사용하는 고객이 미래에 최상의 지원을받을 수 있도록 최선의 조치라고 생각합니다. 이 움직임에 대해 자세히 알아 보거나 새로운 Serverless Express Library의 관리자가 되려면이 저장소의 GitHub 문제를 통해 우리에게 연락하십시오.
Best, AWS Serverless 팀, Brett & Vendia 팀