Memulai proyek perangkat lunak baru? Lihat Code Genie - generator aplikasi tumpukan lengkap yang memberikan proyek AWS Serverless lengkap dengan kode sumber, berdasarkan model data Anda. Termasuk:
Jalankan API REST dan aplikasi web lainnya menggunakan kerangka aplikasi Node.js yang ada (Express, KOA, HAPI, Sails, dll.), Di atas AWS Lambda dan Amazon API Gateway atau fungsi Azure.
npm install @codegenie/serverless-expressIngin bangun dan berlari dengan cepat? Lihat contoh starter dasar kami yang meliputi:
Jika Anda ingin memigrasikan aplikasi yang ada ke AWS Lambda, disarankan untuk mendapatkan contoh minimal dan berjalan terlebih dahulu, dan kemudian menyalin sumber aplikasi Anda.
Satu -satunya kode spesifik AWS Lambda yang perlu Anda tulis adalah penangan sederhana seperti di bawah ini. Semua kode lain yang dapat Anda tulis seperti biasanya.
// lambda.js
const serverlessExpress = require ( '@codegenie/serverless-express' )
const app = require ( './app' )
exports . handler = serverlessExpress ( { app } )Jika aplikasi Anda perlu melakukan beberapa tugas bootstrap umum seperti menghubungkan ke database sebelum permintaan maju ke API, Anda dapat menggunakan pola berikut (juga tersedia dalam contoh ini):
// 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 Satu -satunya kode spesifik fungsi Azure yang perlu Anda tulis adalah index.js sederhana dan function.json seperti di bawah ini.
// 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 )
} Parameter yang mengikat "name": "$return" penting bagi Expressless Express untuk bekerja.
// function.json
{
"bindings" : [
{
"authLevel" : " anonymous " ,
"type" : " httpTrigger " ,
"direction" : " in " ,
"name" : " req " ,
"route" : " {*segments} "
},
{
"type" : " http " ,
"direction" : " out " ,
"name" : " $return "
}
]
}resolutionMode untuk menggunakan "CONTEXT" atau "CALLBACK"isBase64Encoded Otomatis tanpa menentukan binaryMimeTypes . Gunakan binarySettings untuk menyesuaikan. Terima kasih kepada @dougmoscrop dari https://github.com/dougmoscrop/serverless-httprespondWithErrors memudahkan debug selama pengembanganLihat upgrade.md untuk meningkatkan dari AWS-server-express dan @codegenie/serverless-express 3.x
Tentukan apakah responsnya harus dikodekan 64 sebelum dikembalikan ke sumber acara, misalnya, ketika mengembalikan gambar atau file terkompresi. Ini diperlukan karena API Gateway dan sumber acara lainnya yang tidak mampu menangani respons biner secara langsung. Sumber acara kemudian bertanggung jawab untuk mengubahnya kembali menjadi format biner sebelum dikembalikan ke klien.
Secara default, ini ditentukan berdasarkan header content-encoding dan content-type yang dikembalikan oleh aplikasi Anda. Jika Anda memerlukan kontrol tambahan atas ini, Anda dapat menentukan binarySettings .
{
binarySettings : {
isBinary : ( { headers } ) => true ,
contentTypes : [ 'image/*' ] ,
contentEncodings : [ ]
}
}Nilai apa pun yang Anda berikan di sini juga harus ditentukan pada API Gateway API. Di Sam, ini terlihat seperti:
ExpressApi :
Type : AWS::Serverless::Api
Properties :
StageName : prod
BinaryMediaTypes : ['image/*']'PROMISE' ) Lambda mendukung tiga metode untuk mengakhiri eksekusi dan mengembalikan hasil: konteks, panggilan balik, dan janji. Secara default, Express-Express menggunakan resolusi janji, tetapi Anda dapat menentukan 'konteks' atau 'panggilan balik' jika Anda perlu mengubahnya. Jika Anda menentukan 'Callback', maka context.callbackWaitsForEmptyEventLoop = false juga ditetapkan untuk Anda.
serverlessExpress ( {
app ,
resolutionMode : 'CALLBACK'
} )process.env.NODE_ENV === 'development' ) Atur ini ke true agar pengekspres server-neek mencakup jejak tumpukan kesalahan jika terjadi pengecualian yang tidak ditangani. Ini sangat berguna selama pengembangan. Secara default, ini diaktifkan ketika NODE_ENV === 'development' sehingga jejak tumpukan tidak dikembalikan dalam produksi.
Serverless-Express secara asli mendukung API Gateway, ALB, dan Lambda@Edge. Jika Anda ingin menggunakan Express dengan Layanan AWS lain yang terintegrasi dengan Lambda, Anda dapat memberikan pemetaan permintaan/respons khusus Anda sendiri melalui eventSource . Lihat contoh kustom-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
}
} ) Satu fungsi dapat dikonfigurasi untuk menangani jenis acara AWS tambahan:
Dengan asumsi konfigurasi fungsi berikut di 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.cloudformationDan konfigurasi berikut:
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' ,
}
} )Atau, hanya untuk menangani peristiwa SNS (kunci di peta adalah opsional )
serverlessExpress ( {
app ,
eventSourceRoutes : {
'AWS_SNS' : '/sns' ,
}
} ) Acara akan POST ke rute yang dikonfigurasi.
Juga, untuk memastikan peristiwa yang disebarkan dari acara internal dan tidak secara eksternal, sangat disarankan untuk memastikan header Host cocok:
sns.amazonaws.comdynamodb.amazonaws.comsqs.amazonaws.comevents.amazonaws.comkinesis.amazonaws.com Tentukan pengaturan log yang diteruskan ke logger default. Saat ini, Anda hanya dapat mengatur level log.
{
logSettings : {
level : 'debug' // default: 'error'
}
} Berikan objek log khusus dengan info , metode debug dan error . Misalnya, Anda dapat mengesampingkan default dengan instance log Winston.
{
log : {
info ( message , additional ) {
console . info ( message , additional )
} ,
debug ( message , additional ) {
console . debug ( message , additional )
} ,
error ( message , additional ) {
console . error ( message , additional )
}
}
} Paket ini memperlihatkan fungsi untuk dengan mudah mendapatkan objek event dan context yang diterima Lambda dari sumber acara.
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
Pada 11/30, pustaka Express AWS Serverless Express pindah dari AWS ke Vendia dan akan diganti nama menjadi @codegenie/serverless-express . Demikian pula, paket NPM aws-serverless-express akan digunakan untuk mengekspresikan @codegenie/serverless-express.
Brett Andrews, pencipta asli dari Perpustakaan Express Tanpa Server, akan terus mempertahankan repositori dan memberikan perhatian dan kepedulian yang layak. Pada saat yang sama, kami akan mencari kontributor tambahan untuk berpartisipasi dalam pengembangan dan pengelolaan perpustakaan Express tanpa server. AWS dan tim SAM akan tetap terlibat dalam peran administratif bersama Vendia, Brett, dan pengelola baru yang akan bergabung dengan proyek.
Kami percaya ini adalah tindakan terbaik untuk memastikan bahwa pelanggan yang menggunakan perpustakaan ini mendapatkan dukungan terbaik di masa depan. Untuk mempelajari lebih lanjut tentang langkah ini atau menjadi pemelihara perpustakaan Express tanpa server baru, hubungi kami melalui masalah GitHub di repositori ini.
Terbaik, tim AWS Serverless, Brett & The Vendia Team