使用AWS Lambda/SNS/S3/SES发送作业邮件时遇两类错误的排查求助
解决AWS Lambda作业通知系统的两类错误
错误1:KeyError: 'key'
排查步骤
- 查看
assignmentupload函数的CloudWatch日志:- 确认日志中是否输出
Assignment uploaded: {subject}, {class_section},验证s3_key是否正常提取。 - 检查是否进入异常分支返回500状态码,确认
sns.publish调用是否成功。
- 确认日志中是否输出
- 查看
assignmentnotification函数的CloudWatch日志:- 在
lambda_handler开头添加print(json.dumps(event)),打印完整SNS事件结构,确认event['Records'][0]['Sns']['Message']是否包含key字段。
- 在
- 检查
assignmentupload中sns_message的构造逻辑:原代码硬编码了消息内容,未使用实际上传的文件信息,若上传文件触发异常,可能导致消息结构缺失。
修复方法
将assignmentupload中的sns_message改为动态生成,使用从S3事件中提取的真实数据:
# 替换原硬编码的sns_message sns_message = { 'key': s3_key, 'subject': subject, 'class_section': class_section, 'bucket': s3_bucket, }
错误2:Error sending email: name 'class_section' is not defined
排查步骤
- 定位报错逻辑:
send_batch_email函数中尝试调用message['class_section'],但该函数的message参数是邮件正文字符串(来自lambda_handler的email_message),并非SNS传递的字典数据。 - 检查变量作用域:
class_section是lambda_handler内的局部变量,send_batch_email无法直接访问该变量。
修复方法
- 修改
send_batch_email的参数列表,传递所需的subject、class_section等数据,避免变量名冲突。 - 调整
lambda_handler中调用send_batch_email的方式,传入正确参数。
修正后的assignmentnotification关键代码片段:
# 修改lambda_handler中的调用逻辑 send_batch_email(batch_recipients, subject_line, email_message, message['bucket'], message['key'], subject, class_section) # 修改send_batch_email函数定义与内部逻辑 def send_batch_email(recipients, subject, email_body, bucket, key, subject_name, class_section): try: attachment_data = s3.get_object(Bucket=bucket, Key=key)['Body'].read() response = ses.send_email( Source='abc@xyz.com', Destination={'ToAddresses': recipients}, Message={ 'Subject': {'Data': subject}, 'Body': {'Text': {'Data': email_body}}, }, Attachments=[ { 'FileName': f"{subject_name}_{class_section}_assignment.pdf", 'Data': attachment_data } ] ) print(f"Sent email to {', '.join(recipients)}") except Exception as e: print(f"Error sending email: {str(e)}")
额外优化建议
- 在
assignmentnotification的lambda_handler中添加文件名格式校验,避免因文件名分割后字段不足导致崩溃:
try: parts = message['key'].split('_') subject = parts[0] class_section = parts[1] except IndexError: print(f"Invalid filename format: {message['key']}") return {'statusCode': 400, 'body': 'Invalid filename format'}
- 确认
emaillistbucket中的email_mapping.json结构正确,需包含principals数组、students字典(键为学生邮箱,值包含parent_email字段)。
内容的提问来源于stack exchange,提问作者raj
相关产品推荐
相关产品推荐

