Serverless是一种云计算模型,它允许开发人员构建和运行应用程序,而无需管理底层服务器或虚拟机。在Serverless模型中,云服务提供商负责自动扩展、管理和维护基础架构,开发人员只需关注编写应用程序代码。
获取一个需要部署的项目
> nest new nestjs-serverless-demo
安装依赖
pnpm add @vendia/serverless-express aws-lambda
pnpm add -D @types/aws-lambda serverless-offline
增加启动和配置文件
#/src/serverless.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import serverlessExpress from '@vendia/serverless-express';
import { Callback, Context, Handler} from 'aws-lambda';
let server:Handler;
async function bootstrap() {
const app = await NestFactory.create(AppModule);
//await app.listen(3000);
app.init();
const expressApp = app.getHttpAdapter().getInstance();
return serverlessExpress({app: expressApp})
}
export const handler: Handler = async(
event: any,
context: Context,
callback: Callback
)=>{
server = server??(await bootstrap());
return server(event, context, callback);
}
# serverless.yaml
service: nestjs-serverless-api
useDotenv: true
plugins:
- serverless-offline
provider:
name: aws
runtime: nodejs12.x
environment:
...=${env:env-value}
functions
main:
handler: dist/serverless.handler
events:
-http:
method: ANY
path: /
- http:
method: ANY
path: '{proxy+}'
#tsconfig.json
rules:{
...
+ "esModuleInterop": true
...
}
> npm i -g serverless
> sls offline
接下来测试接口
sls deploy --stage prod
sls logs --function main --stage prod
执行成功
拿到这个地址,在postman中替换掉原来的dev 的路径再执行 g2y7hlwaw9.execute-api.us-east-1.amazonaws.com/prod/
这个过程也是一波三折,总结一下,主要踩了两个坑,一个是 serverless 执行命令的环境需要进行配置,这个配置要从aws 中获取用户的 credential(),并赋予操作lambda 的权限,另外一个就是配置serverless.yml 文件中的runtime 是一个枚举值,如下图
部署完成后S3 中保存了历次部署的版本