เริ่มโครงการซอฟต์แวร์ใหม่หรือไม่? ตรวจสอบ Code Genie - เครื่องกำเนิดแอพสแต็กเต็มรูปแบบที่ให้โครงการ AWS Serverless ที่สมบูรณ์พร้อมซอร์สโค้ดตามรูปแบบข้อมูลของคุณ รวมทั้ง:
เรียกใช้ REST APIs และเว็บแอปพลิเคชันอื่น ๆ โดยใช้กรอบแอปพลิเคชัน Node.js ที่มีอยู่ของคุณ (Express, KOA, Hapi, Sails ฯลฯ ) บน AWS Lambda และ Amazon API Gateway หรือ Azure Gateway
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 } )หากแอปพลิเคชันของคุณต้องการดำเนินงาน bootstrap ทั่วไปเช่นการเชื่อมต่อกับฐานข้อมูลก่อนที่คำขอจะส่งต่อไปยัง 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 "
}
]
}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 Gateway และแหล่งเหตุการณ์อื่น ๆ ที่ไม่สามารถจัดการการตอบสนองแบบไบนารีได้โดยตรง แหล่งที่มาของเหตุการณ์จะรับผิดชอบในการเปลี่ยนสิ่งนี้กลับเป็นรูปแบบไบนารีก่อนที่จะถูกส่งกลับไปยังไคลเอนต์
โดยค่าเริ่มต้นสิ่งนี้จะถูกกำหนดตามส่วนหัว content-encoding และ content-type ที่ส่งคืนโดยแอปพลิเคชันของคุณ หากคุณต้องการการควบคุมเพิ่มเติมเกี่ยวกับเรื่องนี้คุณสามารถระบุ binarySettings
{
binarySettings : {
isBinary : ( { headers } ) => true ,
contentTypes : [ 'image/*' ] ,
contentEncodings : [ ]
}
}ค่าใด ๆ ที่คุณให้ไว้ที่นี่ควรระบุไว้ใน API Gateway API ในแซมดูเหมือนว่า:
ExpressApi :
Type : AWS::Serverless::Api
Properties :
StageName : prod
BinaryMediaTypes : ['image/*']'PROMISE' ) แลมบ์ดาสนับสนุนสามวิธีในการยุติการดำเนินการและส่งคืนผลลัพธ์: บริบทการโทรกลับและสัญญา โดยค่าเริ่มต้น Serverless-Express ใช้การแก้ไขสัญญา แต่คุณสามารถระบุ 'บริบท' หรือ 'การโทรกลับ' หากคุณต้องการเปลี่ยนสิ่งนี้ หากคุณระบุ 'callback' ดังนั้น context.callbackWaitsForEmptyEventLoop = false ก็ถูกตั้งค่าให้คุณด้วย
serverlessExpress ( {
app ,
resolutionMode : 'CALLBACK'
} )process.env.NODE_ENV === 'development' ) ตั้งค่านี้เป็นจริงเพื่อให้ Serverless-Express รวมถึงการติดตามข้อผิดพลาดสแต็กในกรณีที่มีข้อยกเว้นที่ไม่ได้รับการจัดการ สิ่งนี้มีประโยชน์อย่างยิ่งในระหว่างการพัฒนา โดยค่าเริ่มต้นสิ่งนี้จะเปิดใช้งานเมื่อ NODE_ENV === 'development' เพื่อให้การติดตามสแต็กไม่ได้ส่งคืนในการผลิต
Serverless-Express รองรับ API Gateway, ALB และ Lambda@Edge หากคุณต้องการใช้ Express กับบริการ AWS อื่น ๆ ที่รวมเข้ากับแลมบ์ดาคุณสามารถให้การแมปคำขอ/ตอบสนองที่กำหนดเองของคุณเองผ่าน eventSource ดูตัวอย่างที่กำหนดเอง-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'
}
} จัดเตรียมวัตถุ log ที่กำหนดเองด้วย info วิธี debug และ error ตัวอย่างเช่นคุณสามารถแทนที่ค่าเริ่มต้นด้วยอินสแตนซ์ของ Winston Log
{
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
เมื่อวันที่ 11/30 ห้องสมุด AWS Serverless Express ย้ายจาก AWS ไปยัง Vendia และจะถูกเปลี่ยนใหม่เป็น @codegenie/serverless-express ในทำนองเดียวกันแพ็คเกจ NPM aws-serverless-express จะเลิกใช้เพื่อสนับสนุน @codegenie/serverless-express
Brett Andrews ผู้สร้างดั้งเดิมของ Library Serverless Express จะยังคงรักษาพื้นที่เก็บข้อมูลและให้ความสนใจและใส่ใจที่สมควรได้รับ ในเวลาเดียวกันเราจะมองหาผู้มีส่วนร่วมเพิ่มเติมเพื่อเข้าร่วมในการพัฒนาและการดูแลห้องสมุด Serverless Express AWS และทีม SAM จะยังคงมีส่วนร่วมในบทบาทการบริหารควบคู่ไปกับ Vendia, Brett และผู้ดูแลใหม่ที่จะเข้าร่วมโครงการ
เราเชื่อว่านี่เป็นแนวทางที่ดีที่สุดเพื่อให้แน่ใจว่าลูกค้าที่ใช้ห้องสมุดนี้ได้รับการสนับสนุนที่ดีที่สุดในอนาคต หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการเคลื่อนไหวนี้หรือเป็นผู้ดูแลห้องสมุด Express Serverless ใหม่ติดต่อเราผ่านปัญหา GitHub ในที่เก็บนี้
ดีที่สุดทีม AWS Serverless, Brett & The Vendia Team