我想将 Express.js 从 AWS Lightsail/EC2 迁移到无服务器应用程序中,因为这是典型的做法,Lambda 是我的首选。然而,一个整个框架和其上面的应用程序可能会有点笨重,不能被认为是一个函数,因此可能不适合在 AWS Lambda、Google 或 Azure Functions 上运行。虽然我相信它是可行的,但这是一个好主意吗?这种设置会破坏效率并复杂化处理会话状态等事情,最终会使无服务器函数失去意义吗?
回答您的问题取决于您当前和未来的需求。我认为您应该始终提前规划,并确保您将要实现的当前基础设施可以升级以满足未来的需求。
您应该问自己以下这些问题:
出于许多原因,在lambda中使用Express.js并不是一个好主意:
在Lambda上使用Express.js更加昂贵,因为您需要将任何方法代理到您的Lambda中,并使用API Gateway REST API而不是使用API Gateway HTTP API
HTTP APIs与REST APIs相比,更便宜高达71%
Lambda并不能像他们所宣传的那样,在没有服务器的情况下神奇地执行您的代码。当事件发生时,AWS将启动一个docker容器,等待其完全加载所有依赖项,然后运行处理程序。
对于在AWS EC2或AWS ECS上的普通Node.js服务器,这是一次性成本,因为您的服务器始终在运行,并且已经加载了所有依赖项,但不适用于lambda。
正如AWS所说:
这种方法[Express.js并代理所有请求到您的lambda]通常是不必要的,通常最好利用API Gateway中可用的本机路由功能。在许多情况下,Lambda函数中不需要Web框架,这会增加部署包的大小。 API Gateway还能够验证参数,减少了使用自定义代码检查参数的需要。它还可以提供对未经授权访问的保护以及一系列其他更适合在服务级别处理的功能。
为了简化您的生活,我建议您使用SAM CLI。使用它非常简单。
如果您遵循Express应用程序的MVC模式,则只需要获取包含核心逻辑的服务文件
──src-ts
├───handlers
│ getEvent.ts
│
├───tests
│ │ getEvent.tests.ts
│ │
│ └───utils
│ utils.ts
│
└───utils
utils.ts
validation.ts
你的处理程序返回三个东西很重要:
你还需要一个 template.yml
文件来描述你的 Lambda 需要的基础设施。
AWSTemplateFormatVersion: 2010-09-09
Description: Describe the lambda goal
Transform:
- AWS::Serverless-2016-10-31
Resources:
# API Gateway
LambdaAPI:
Type: AWS::Serverless::Api
Properties:
StageName: StageName
Cors:
AllowMethods: "'POST, GET, OPTIONS'"
AllowHeaders: "'*'"
AllowOrigin: "'*'"
# IAM Role
LambdaRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Action:
- 'sts:AssumeRole'
Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
- arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess
- arn:aws:iam::aws:policy/AmazonAPIGatewayInvokeFullAccess
GetEvent:
Type: AWS::Serverless::Function
Properties:
Runtime: nodejs12.x
Timeout: 180
FunctionName: youLambdaName
Handler: src/handlers/getEvent.handler
Role: !GetAtt LambdaRole.Arn
Events:
Get:
Type: Api
Properties:
RestApiId: !Ref LambdaAPI
Path: /events/{eventid}
Method: GET
注意:我使用 TypeScript,但编译后会创建一个 src
文件夹。
以下是一些有助于更深入了解的资源:
使用不含 Express 的 Lambda 优点:
使用不含 Express 的 Lambda 缺点:
充分利用 AWS 基础设施,不要试图反其道而行。AWS 服务之间以无缝和低延迟的方式协同工作。如果您想要实现“无服务器”,则应从基础架构中删除 Express。