从零开始构建NestJS(AWS Lambda)
由于NestJS最近升级为V8,因此我决定重新搭建整个项目,从头开始进行确认。
我基本上按照官方文档的指示进行组装。
环境
nodejsv16.8.0 ※ここは14に合わせる方が良いかと。aws-cli2.2.21
创建Nest项目
前期准备
包管理随便你喜欢的。
Node使用当前最新版本。
项目中使用yarn。
节点
可以在后续提及,Lambda的Node运行时采用最新的v14版本,因此建议与之相适应。
asdf global nodejs 16.8.0
node -v
> v16.8.0
npm i -g npm
npm i -g yarn
npm i -g @nestjs/cli
nest -v
8.1.1
亚马逊命令行界面
由于在m1芯片上出现了一些问题而无法正常工作,所以我们这边使用brew。
brew install aws-cli
项目创建
请参考 https://docs.nestjs.com/。
nest new project-name
>yarn
cd project-name
# プロジェクトでのnodejsバージョン設定。(なぜかv付けない)
asdf local nodejs 16.8.0
检查启动
npm run start
http://localhost:3000/
>Hello World!
很快就完成了。
用于Serverless Framework的配置
参考以下链接:https://docs.nestjs.com/faq/serverless
模块安装
yarn add @vendia/serverless-express aws-lambda
yarn add @types/aws-lambda serverless-offline
创建serverless.yaml文件
在这里,我想起了lambda仅支持到nodejs14的事实。参考链接:https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html
如果继续这样下去,一旦这样下去。
其结果虽然可以,但还是最好进行一些调整。虽然会被转译成JS,应该没问题,但为了安全起见(环境方面出现故障会很麻烦),还是做些准备比较好。
echo "service:
name: serverless-example
plugins:
- serverless-offline
provider:
name: aws
runtime: nodejs14.x
functions:
main:
handler: dist/index.handler
events:
- http:
method: ANY
path: /
- http:
method: ANY
path: '{proxy+}'" > serverless.yaml
我改变了运行时版本和处理程序的名称。
创建用于Lambda的入口点的文件
echo "import { NestFactory } from '@nestjs/core';
import serverlessExpress from '@vendia/serverless-express';
import { Callback, Context, Handler } from 'aws-lambda';
import { AppModule } from './app.module';
let server: Handler;
async function bootstrap(): Promise<Handler> {
const app = await NestFactory.create(AppModule);
await 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);
};" > src/index.ts
我正在使用更改的处理程序名称创建文件。
在tsconfig.json中添加esModuleInterop的设置。
{
"compilerOptions": {
...
"esModuleInterop": true
}
}
搭建并确认了构建和本地验证环境。
npm run build
npx serverless offline
有什么东西出现了。
需要安装以下程序包:
serverless
可以继续吗?(是 / 否)
听说如果使用了未导入的包会出现警告。
使用y。(如果出错了,那就在那里解决,想着顺利解决了)
我在这里看到了解说。
https://blog.watilde.com/2020/10/14/npm-v7的主要变更点总结/
以下的访问
http://localhost:3000/dev
错误,
似乎无法解决以/为路径。
http://localhost:3000/dev//
>Hello World!
这样搞定了。
好的。(由于已经设置了密码并确认过了,所以没问题。)
在AWS上进行部署
假设已经安装了aws-cli,并设置了配置文件。
npx serverless deploy --stage dev --aws-profile profile_name
无服务器:堆栈更新已完成…
服务信息
服务:无服务器示例
阶段:dev
地区:us-east-1
堆栈:serverless-example-dev
资源:12
API 密钥:
无
端点:
任意 – https://4w1holtb8e.execute-api.us-east-1.amazonaws.com/dev/
任意 – https://4w1holtb8e.execute-api.us-east-1.amazonaws.com/dev/{proxy+}
函数:
主要:serverless-example-dev-main
图层:
无
取得了目标的结果。
实现了预期的成果。
获得了胜利的结果。
达到了预定的目标。
完成了既定的目标。
取得了成功的成绩。
https://4w1holtb8e.execute-api.us-east-1.amazonaws.com/dev/
>Hello World!
好的。
打掃
npx serverless remove --aws-profile profile_name
https://4w1holtb8e.execute-api.us-east-1.amazonaws.com/dev/
>{"message":"Forbidden"}
没办法看了,就算先看了模拟器确认也没有。
总结
按照公式进行操作,事情相当顺利地进行了。
最近的做法非常仔细,让人感激。
只剩下一个问题,这是怎么利用它呢?只是提供参考。