从零开始使用 aws serverless 部署

207 阅读1分钟

Serverless是一种云计算模型,它允许开发人员构建和运行应用程序,而无需管理底层服务器或虚拟机。在Serverless模型中,云服务提供商负责自动扩展、管理和维护基础架构,开发人员只需关注编写应用程序代码。

获取一个需要部署的项目

> nest new nestjs-serverless-demo

image.png

安装依赖

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

image.png

接下来测试接口

image.png

image.png

sls deploy --stage prod

image.png

sls logs --function main --stage prod

image.png

执行成功 image.png

拿到这个地址,在postman中替换掉原来的dev 的路径再执行 g2y7hlwaw9.execute-api.us-east-1.amazonaws.com/prod/

这个过程也是一波三折,总结一下,主要踩了两个坑,一个是 serverless 执行命令的环境需要进行配置,这个配置要从aws 中获取用户的 credential(),并赋予操作lambda 的权限,另外一个就是配置serverless.yml 文件中的runtime 是一个枚举值,如下图

image.png

部署完成后S3 中保存了历次部署的版本

image.png