新しいソフトウェアプロジェクトを開始しますか? Code Genieをチェックしてください - データモデルに基づいて、ソースコードを使用して完全なAWSサーバーレスプロジェクトを提供するフルスタックアプリジェネレーター。含む:
既存のnode.jsアプリケーションフレームワーク(Express、Koa、Hapi、Sailsなど)を使用して、AWS LamdaおよびAmazon API GatewayまたはAzure関数の上に、REST APIおよびその他のWebアプリケーションを実行します。
npm install @codegenie/serverless-expressすぐに立ち上がって走りたいですか?以下を含む基本的なスターターの例をご覧ください。
既存のアプリケーションをAWS Lambdaに移行したい場合は、最小限の例を最初に稼働させてから、アプリケーションソースをコピーすることをお勧めします。
あなたが書く必要がある唯一のAWSラムダ固有のコードは、以下のようなシンプルなハンドラーです。あなたが通常どおりに書くことができる他のすべてのコード。
// 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"サーバーレスエクスプレスが機能するために重要です。
// function.json
{
"bindings" : [
{
"authLevel" : " anonymous " ,
"type" : " httpTrigger " ,
"direction" : " in " ,
"name" : " req " ,
"route" : " {*segments} "
},
{
"type" : " http " ,
"direction" : " out " ,
"name" : " $return "
}
]
}"CONTEXT"または"CALLBACK"を使用するためのresolutionModeを指定できますisBase64Encoded binaryMimeTypesを指定せずに。 binarySettingsを使用してカスタマイズします。 https://github.com/dougmoscrop/serverless-httpの@dougmoscropに感謝しますrespondWithErrorsにより、開発中にデバッグが簡単になります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 Gateway APIでも指定する必要があります。サムでは、これは次のように見えます。
ExpressApi :
Type : AWS::Serverless::Api
Properties :
StageName : prod
BinaryMediaTypes : ['image/*']'PROMISE' ) Lambdaは、実行を終了し、結果を返すための3つの方法をサポートしています。コンテキスト、コールバック、および約束です。デフォルトでは、ServerLess-ExpressはPromise Resolutionを使用しますが、これを変更する必要がある場合は「コンテキスト」または「コールバック」を指定できます。 「コールバック」を指定する場合、 context.callbackWaitsForEmptyEventLoop = falseも設定されています。
serverlessExpress ( {
app ,
resolutionMode : 'CALLBACK'
} )process.env.NODE_ENV === 'development' )これをtrueに設定して、未処理の例外が発生した場合のサーバーレスexpressにエラースタックトレースを含めます。これは、開発中に特に役立ちます。デフォルトでは、これはNODE_ENV === 'development'の場合に有効になり、スタックトレースが生産時に返されないようにします。
ServerLess-Expressは、API Gateway、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ライブラリはAWSからVendiaに移動し、 @codegenie/serverless-expressにブランド変更されます。同様に、 aws-serverless-express NPMパッケージは、 @CodeGenie/ServerLess-Expressを支持して非推奨されます。
Serverless Expressライブラリの元の作成者であるBrett Andrewsは、リポジトリを維持し続け、それにふさわしい注意とケアを与えます。同時に、サーバーレスエクスプレスライブラリの開発とスチュワードシップに参加するための追加の貢献者を探しています。 AWSとSAMチームは、Vendia、Brett、およびプロジェクトに参加する新しいメンテナーとともに、管理上の役割に関与し続けます。
これは、このライブラリを使用している顧客が将来可能な限り最高のサポートを得ることができるようにするための最良の行動方針であると考えています。この動きの詳細を学ぶか、新しいServerless Expressライブラリのメンテナーになるには、このリポジトリのGitHub問題を通じて私たちに連絡してください。
Best、AWS Serverlessチーム、Brett&The Vendiaチーム