У меня есть сервер, который был построен с нуля с использованием Serverless и Nest js, но мы хотим переместить его в ecs / ec2, потому что он должен работать круглосуточно и без выходных. Можно ли извлечь бессерверную версию или мне лучше переписать загрузочную часть приложения?
index.ts с функцией обработчика используется при развертывании sls, в то время как main.ts используется для разработки .
пакет. json:
"scripts": {
"format": "prettier --write \"**/*.ts\"",
"start": "ts-node -r tsconfig-paths/register src/main.ts",
"start:dev": "nodemon",
"prestart:prod": "rm -rf dist && tsc",
"start:prod": "rm -rf dist && tsc && node dist/main.js",
"start:hmr": "node dist/server",
"webpack": "webpack --config webpack.config.js",
"local-server": "rm -rf dist && tsc && export AWS_REGION=us-east-1 && export IS_ON_LOCAL_SERVER=true && export TZ=UTC && sls offline start --stage dev",
"local-prod-server": "rm -rf dist && tsc && export AWS_REGION=us-east-1 && export IS_ON_LOCAL_SERVER=true && export TZ=UTC && sls offline start --stage prod",
"deploy:prod": "rm -rf dist && tsc && sls deploy --stage prod",
"deploy:dev": "rm -rf dist && tsc && sls deploy --stage dev"
},
Вот мой index.ts:
import * as serverless from 'aws-serverless-express';
import * as bunyan from 'bunyan';
import * as audit from 'express-requests-logger';
import { Server } from 'http';
import { NestFactory } from '@nestjs/core';
import * as bodyParser from 'body-parser';
import { AppModule } from './app.module';
import { FasLoggerService } from './fas-logger.service';
// tslint:disable-next-line:no-var-requires
const express = require('express')();
let cachedServer: Server;
export const logger: any = bunyan.createLogger({
name: 'app',
stream: process.stdout,
level: 'debug',
serializers: {}
});
function bootstrapServer(): Promise<Server> {
return NestFactory.create(AppModule, express, {
logger: new FasLoggerService()
})
.then(app => {
app.useLogger(app.get(FasLoggerService));
app.enableCors({
allowedHeaders: ['Content-Type', 'Authorization'],
origin: '*',
methods: ['POST', 'GET', 'PUT', 'DELETE', 'HEAD', 'PATCH'],
preflightContinue: false,
optionsSuccessStatus: 204
});
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
app.use(
audit({
logger,
excludeURLs: [],
doubleAudit: false,
request: {
excludeHeaders: ['authorization'],
excludeBody: ['*']
},
response: {
excludeBody: ['*']
}
})
);
return app;
})
.then(app => app.init())
.then(() => serverless.createServer(express));
}
export const handler: any = (event: any, context: any) => {
if (!cachedServer) {
bootstrapServer().then(server => {
cachedServer = server;
return serverless.proxy(server, event, context);
});
} else {
return serverless.proxy(cachedServer, event, context);
}
};
Вот мой main.ts:
import * as bunyan from 'bunyan';
import * as audit from 'express-requests-logger';
import { NestFactory } from '@nestjs/core';
import * as bodyParser from 'body-parser';
import { AppModule } from './app.module';
import { FasLoggerService } from './fas-logger.service';
export const logger: any = bunyan.createLogger({
name: 'app',
stream: process.stdout,
level: 'debug',
serializers: {}
});
async function bootstrap() {
const app = await NestFactory.create(AppModule, {
logger: new FasLoggerService()
});
app.useLogger(app.get(FasLoggerService));
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));
app.enableCors({
allowedHeaders: ['Content-Type', 'Authorization'],
origin: '*',
methods: ['POST', 'GET', 'PUT', 'DELETE', 'HEAD', 'PATCH'],
preflightContinue: false,
optionsSuccessStatus: 204
});
app.use(
audit({
logger,
excludeURLs: [],
doubleAudit: false,
request: {
excludeHeaders: ['authorization'],
excludeBody: ['*']
},
response: {
excludeBody: ['*']
}
})
);
await app.listen(3000);
}
bootstrap();