AWS CloudWatch中Serverless(NestJS)部署日志异常排查求助
解决AWS上NestJS Serverless应用CloudWatch请求日志缺失问题
问题现象
部署在AWS的NestJS Serverless应用,仅能在默认aws/lambda/x日志组看到启动阶段日志,后续请求的console.log或Nest日志无输出;自行创建的CloudWatch日志组完全为空。已在函数级别配置CloudWatch Log、API级别配置Logs模块,但均未生效。
当前日志示例:
2023-08-03T09:39:10.945+02:00 INIT_START Runtime Version: nodejs:16.v16 Runtime Version ARN: arn:aws:lambda:eu-west-2::runtime:c1983f4e9ce3930d3093fa38128e12edac2324f4fe99adfb8e0d5fb6b6afadbc 2023-08-03T09:39:34.476+02:00 START RequestId: 41d79246-7bd6-48bf-8eac-f4ab5f65e9c1 Version: $LATEST 2023-08-03T09:39:34.945+02:00 [32m[Nest] 8 - [39m08/03/2023, 7:39:34 AM [32m LOG[39m [38;5;3m[NestFactory] [39m[32mStarting Nest application...[39m controllers mapped etc... 2023-08-03T09:39:35.607+02:00 [32m[Nest] 8 - [39m08/03/2023, 7:39:35 AM [32m LOG[39m [38;5;3m[NestApplication] [39m[32mNest application successfully started[39m[38;5;3m +22ms[39m 2023-08-03T09:39:35.632+02:00 END RequestId: 41d79246-7bd6-48bf-8eac-f4ab5f65e9c1 2023-08-03T09:39:35.632+02:00 REPORT RequestId: 41d79246-7bd6-48bf-8eac-f4ab5f65e9c1 Duration: 1155.60 ms Billed Duration: 1156 ms Memory Size: 1024 MB Max Memory Used: 192 MB Init Duration: 2183.01 ms 2023-08-03T09:39:37.100+02:00 START RequestId: 8de822b4-a562-46cd-8f45-68d58df9bcc6 Version: $LATEST 2023-08-03T09:39:37.106+02:00 END RequestId: 8de822b4-a562-46cd-8f45-68d58df9bcc6 2023-08-03T09:39:37.106+02:00 REPORT RequestId: 8de822b4-a562-46cd-8f45-68d58df9bcc6 Duration: 5.27 ms Billed Duration: 6 ms Memory Size: 1024 MB Max Memory Used: 193 MB 2023-08-03T09:39:39.005+02:00 START RequestId: 4d6c8e4f-b840-4200-a1e4-b7a087f36cad Version: $LATEST 2023-08-03T09:39:39.010+02:00 END RequestId: 4d6c8e4f-b840-4200-a1e4-b7a087f36cad 2023-08-03T09:39:39.010+02:00 REPORT RequestId: 4d6c8e4f-b840-4200-a1e4-b7a087f36cad Duration: 5.00 ms Billed Duration: 5 ms Memory Size: 1024 MB Max Memory Used: 193 MB 2023-08-03T09:44:02.337+02:00 START RequestId: c5028e01-8a5f-4bc5-97dc-d99231b4bee5 Version: $LATEST 2023-08-03T09:44:02.357+02:00 END RequestId: c5028e01-8a5f-4bc5-97dc-d99231b4bee5
排查与解决步骤
1. 确认Lambda函数执行角色权限
Lambda需要具备向CloudWatch Logs写入日志的权限,检查执行角色是否包含CloudWatchLogsFullAccess或自定义权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" } ] }
如果权限不足,添加对应策略后重新部署函数。
2. 适配NestJS日志到Serverless环境
Nest默认日志在Serverless环境下可能存在缓冲问题,需确保日志直接输出到stdout/stderr:
- 禁用日志颜色:生产环境关闭颜色输出,避免控制字符干扰日志解析,在
main.ts中配置:const app = await NestFactory.create(AppModule, { logger: ['log', 'error', 'warn', 'debug', 'verbose'], loggerOptions: { disableColors: true, }, }); - 使用
console.log时,确保异步操作已完成再返回响应,避免Lambda提前终止导致日志未输出。
3. 验证API Gateway集成配置
如果通过API Gateway触发Lambda,需确认:
- 开启API Gateway日志:进入API的阶段设置,开启“CloudWatch日志”,选择日志级别为
INFO或ERROR,并确保关联IAM角色有CloudWatch写入权限。 - 检查代理集成格式:确保Lambda返回的响应符合API Gateway要求,避免因响应错误导致日志未触发。
4. 核对Lambda日志配置
- 在Lambda控制台,查看配置 -> 监控和操作工具,确认“CloudWatch Logs”已启用,日志组名称匹配(默认是
aws/lambda/[函数名])。 - 若使用自定义日志组,需在Lambda日志配置中指定该组,同时确保执行角色有写入该组的权限。
5. 确保异步操作执行完成
Lambda会在处理函数执行完成后立即终止,若请求处理包含异步逻辑(如数据库查询、HTTP请求),必须等待所有异步操作完成再返回:
@Get() async getHello() { console.log('处理请求中...'); // 等待异步操作完成 const data = await this.someService.fetchData(); console.log('请求处理完成,数据:', data); return data; }
6. 检查自定义日志组权限
自行创建的日志组需添加权限允许Lambda写入,修改日志组的权限策略(替换[Lambda角色ARN]和[自定义日志组名]):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "[Lambda角色ARN]" }, "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:[区域]:[账号ID]:log-group:[自定义日志组名]:*" } ] }
内容的提问来源于stack exchange,提问作者cwian
相关产品推荐
相关产品推荐

