已创建CloudWatch指标,如何发送含Lambda错误日志详情的邮件?
解决方案:通过CloudWatch Logs订阅+Lambda+SES发送带日志详情的邮件
因为CloudWatch指标告警基于聚合数据,确实无法直接携带原始日志内容。要实现带日志详情的邮件通知,你可以按以下步骤操作:
1. 创建CloudWatch Logs订阅过滤器,捕获目标错误日志
- 打开CloudWatch控制台,找到你的Lambda函数对应的日志组
- 进入「订阅过滤器」页面,选择「创建订阅过滤器」
- 过滤器模式:填写匹配目标错误日志的规则,比如匹配包含特定错误关键词的日志,示例:
ERROR*Failed to process SQS message - 目标:选择「Lambda函数」,指定一个新的或已有的Lambda函数作为处理目标(该Lambda负责后续发送邮件)
2. 配置处理邮件的Lambda函数
这个Lambda需要完成两个核心动作:解析CloudWatch传递的日志内容,调用SES发送邮件。
- 权限配置:给该Lambda添加以下权限:
- 允许CloudWatch Logs调用该Lambda(创建订阅时会自动生成相关权限)
- 允许Lambda调用SES发送邮件(添加
AmazonSESFullAccess权限或更细粒度的自定义权限)
- 代码逻辑示例(Python):
import boto3 import gzip import json import base64 ses = boto3.client('ses', region_name='你的AWS区域') SENDER_EMAIL = '已在SES验证的发件邮箱' RECIPIENT_EMAIL = '收件邮箱' def lambda_handler(event, context): # 解码CloudWatch传递的日志压缩数据 payload = base64.b64decode(event['awslogs']['data']) decompressed_payload = gzip.decompress(payload) log_data = json.loads(decompressed_payload) # 提取并整理日志详情 log_events = log_data['logEvents'] log_details = "\n".join([f"{event['timestamp']}: {event['message']}" for event in log_events]) # 构造邮件内容 subject = f"Lambda错误告警:{log_data['logGroup']}" body_text = f"捕获到错误日志详情:\n\n{log_details}" # 调用SES发送邮件 try: response = ses.send_email( Source=SENDER_EMAIL, Destination={'ToAddresses': [RECIPIENT_EMAIL]}, Message={ 'Subject': {'Data': subject}, 'Body': {'Text': {'Data': body_text}} } ) print(f"邮件发送成功,MessageId: {response['MessageId']}") except Exception as e: print(f"邮件发送失败:{str(e)}")
3. 配置SES(简单邮件服务)
- 登录SES控制台,验证你的发件邮箱和收件邮箱(若使用未验证的域名,需先完成域名验证)
- 若需要发送给未验证的外部邮箱,需完成SES账号的沙盒退出流程
4. 测试验证
- 手动触发你的业务Lambda函数,生成目标错误日志
- 检查CloudWatch Logs订阅过滤器是否捕获到日志,处理邮件的Lambda是否执行成功
- 查看收件邮箱是否收到包含完整日志详情的邮件
你还可以根据需求扩展功能:比如添加日志上下文信息、过滤重复告警、将日志详情格式化为HTML邮件等。
内容的提问来源于stack exchange,提问作者deewreck
相关产品推荐
相关产品推荐

