Node.js Express API(AWS EC2部署)故障时如何接收邮件通知?
API故障自动邮件通知方案(基于AWS CloudWatch + Node.js/Express)
当然可以用AWS CloudWatch实现API故障的自动邮件通知,这也是生产环境中最可靠的方案之一。以下是具体步骤和补充方案:
一、用CloudWatch + SNS实现告警通知(推荐生产环境)
这个方案依赖AWS的监控和消息服务,能覆盖应用级错误和实例级故障(比如EC2宕机),即使Node进程崩溃也能触发通知。
1. 配置CloudWatch Agent收集Express错误日志
首先要让CloudWatch能捕获到你的API错误日志:
- 确保Express的错误日志输出到本地文件(推荐用
winston或morgan标准化日志)。示例代码:
const winston = require('winston'); const logger = winston.createLogger({ level: 'error', format: winston.format.combine( winston.format.timestamp(), winston.format.printf(({ timestamp, level, message, stack }) => { return `${timestamp} [${level}]: ${message} ${stack || ''}`; }) ), transports: [new winston.transports.File({ filename: '/var/log/express-api/error.log' })] }); // Express全局错误捕获中间件 app.use((err, req, res, next) => { logger.error(`路径: ${req.path}`, { message: err.message, stack: err.stack }); res.status(500).send('服务器内部错误'); });
- 在EC2实例上安装并配置CloudWatch Agent:
- 下载Agent:
sudo yum install amazon-cloudwatch-agent(Amazon Linux)或对应系统的安装命令 - 编辑配置文件
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json:
- 下载Agent:
{ "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/var/log/express-api/error.log", "log_group_name": "/ec2/express-api-error-logs", "log_stream_name": "{instance_id}", "timestamp_format": "%Y-%m-%dT%H:%M:%S.%LZ" } ] } } } }
- 启动Agent:
sudo systemctl start amazon-cloudwatch-agent
2. 创建CloudWatch告警规则
- 登录AWS控制台,进入CloudWatch → 日志组,找到你创建的
/ec2/express-api-error-logs - 创建度量过滤器:设置过滤规则匹配错误关键词(比如
"[error]"或"Error:"),将匹配到的日志转换为CloudWatch度量 - 基于这个度量创建告警:设置触发条件(比如5分钟内错误数≥1),选择告警状态为"In Alarm"时执行动作
3. 配置SNS主题接收告警并发送邮件
- 进入SNS控制台,创建一个主题(比如
api-error-alerts) - 订阅该主题,选择"电子邮件"作为协议,输入你的接收邮箱并确认订阅
- 在CloudWatch告警的动作设置中,选择发送通知到这个SNS主题
这样,当API出现错误日志或EC2实例状态异常时,CloudWatch会触发告警,SNS会自动发送邮件通知你。
二、Node.js内部直接发送告警邮件(适合测试/轻量场景)
如果不想依赖AWS服务,也可以在Express的错误捕获逻辑中直接用邮件服务发送通知,但这个方案的局限性是:如果Node进程崩溃或EC2实例宕机,就无法触发通知。
示例代码(用nodemailer):
const nodemailer = require('nodemailer'); // 配置邮件发送器(以Gmail为例,需开启应用密码) const transporter = nodemailer.createTransport({ service: 'Gmail', auth: { user: 'your-monitor-email@gmail.com', pass: 'your-app-specific-password' } }); // 错误中间件中发送告警邮件 app.use((err, req, res, next) => { const mailContent = { from: 'API监控 <your-monitor-email@gmail.com>', to: 'your-alert-email@example.com', subject: '紧急:API发生故障', text: `时间:${new Date().toISOString()}\n请求路径:${req.path}\n错误信息:${err.message}\n堆栈跟踪:\n${err.stack}` }; transporter.sendMail(mailContent, (err) => { if (err) console.error('告警邮件发送失败:', err); }); res.status(500).send('服务器内部错误'); });
总结
生产环境优先选择CloudWatch + SNS方案,它能提供更全面的故障覆盖和更高的可靠性;轻量场景或测试环境可以用Node.js内部邮件通知,但要注意其局限性。
内容的提问来源于stack exchange,提问作者Vishal Bhosle
相关产品推荐
相关产品推荐

