从零开始构建NestJS(AWS Lambda)

由于NestJS最近升级为V8,因此我决定重新搭建整个项目,从头开始进行确认。
我基本上按照官方文档的指示进行组装。

环境

PCOSmacm1 Big Sur 11.4
toolversion
nodejsv16.8.0 ※ここは14に合わせる方が良いかと。aws-cli2.2.21
awsversionLambdanode v14.x
deployServerless Framework

创建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"}

没办法看了,就算先看了模拟器确认也没有。

总结

按照公式进行操作,事情相当顺利地进行了。
最近的做法非常仔细,让人感激。

只剩下一个问题,这是怎么利用它呢?只是提供参考。

广告
将在 10 秒后关闭
bannerAds