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

在Lambda中运行Python代码发送S3附件邮件时遇错误求助

问题排查与修正方案

一、event['Records']信息不匹配的核心原因

你的需求是每日定时分享特定S3桶的文件,但当前代码是按照「S3桶新增文件触发Lambda」的逻辑编写的,依赖event['Records']获取桶和文件信息。如果用CloudWatch Events(或EventBridge)定时触发Lambda,event结构完全不同,根本不存在Records字段,自然拿不到匹配的目标桶信息。

修正方式:

直接在代码中指定目标桶和文件路径(或通过环境变量配置),替换原来从event取值的逻辑:

# 替换原代码中从event获取BUCKET_NAME、KEY的部分
BUCKET_NAME = "你的目标存储桶名称"
KEY = "要分享的文件在桶内的完整路径"  # 示例:"daily-reports/2024-05-20-report.csv"
FILE_NAME = os.path.basename(KEY)  # 此处原代码错误使用了BUCKET_NAME,需改为KEY

二、403 Forbidden错误的排查与解决

1. Lambda IAM角色权限不足

报错提示调用HeadObject被拒绝,说明执行Lambda的IAM角色缺少必要的S3权限。需给该角色添加以下权限策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:HeadObject",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::你的目标存储桶名称/*"
        },
        {
            "Effect": "Allow",
            "Action": "ses:SendRawEmail",
            "Resource": "*"
        }
    ]
}

2. S3桶策略限制

如果S3桶本身的策略拒绝了Lambda角色的访问,也会触发403错误。检查桶策略是否允许该IAM角色执行HeadObject和GetObject操作。

3. 代码缺失附件功能(潜在问题)

当前代码仅发送了邮件正文,未实现将S3文件作为附件添加到邮件的逻辑。如果需要发送附件,需在创建邮件对象后、发送邮件前添加以下代码:

# 从S3读取文件内容
try:
    s3_response = s3.get_object(Bucket=BUCKET_NAME, Key=KEY)
    file_content = s3_response['Body'].read()
except ClientError as e:
    print(f"读取S3文件失败: {e.response['Error']['Message']}")
    return

# 创建邮件附件并添加到邮件中
attachment = MIMEApplication(file_content)
attachment.add_header('Content-Disposition', 'attachment', filename=FILE_NAME)
msg.attach(attachment)

三、其他代码细节修正

  • 确保SENDER是AWS SES中已验证的邮箱/域名,若RECIPIENT为未验证邮箱,需先将SES切换到生产模式(沙箱模式仅允许发送到已验证邮箱)。
  • AWS_REGION需填写实际的AWS区域代码,例如us-east-1、ap-southeast-1等。

内容的提问来源于stack exchange,提问作者Sushmitha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:13:14