在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
相关产品推荐
相关产品推荐

