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

使用AWS Lambda/SNS/S3/SES发送作业邮件时遇两类错误的排查求助

解决AWS Lambda作业通知系统的两类错误

错误1:KeyError: 'key'

排查步骤

  1. 查看assignmentupload函数的CloudWatch日志:
    • 确认日志中是否输出Assignment uploaded: {subject}, {class_section},验证s3_key是否正常提取。
    • 检查是否进入异常分支返回500状态码,确认sns.publish调用是否成功。
  2. 查看assignmentnotification函数的CloudWatch日志:
    • 在lambda_handler开头添加print(json.dumps(event)),打印完整SNS事件结构,确认event['Records'][0]['Sns']['Message']是否包含key字段。
  3. 检查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

排查步骤

  1. 定位报错逻辑:send_batch_email函数中尝试调用message['class_section'],但该函数的message参数是邮件正文字符串(来自lambda_handler的email_message),并非SNS传递的字典数据。
  2. 检查变量作用域:class_section是lambda_handler内的局部变量,send_batch_email无法直接访问该变量。

修复方法

  1. 修改send_batch_email的参数列表,传递所需的subject、class_section等数据,避免变量名冲突。
  2. 调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 06:23:19