You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:
{
  "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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:06:28