使用Lambda Python(boto3)删除S3对象列表无报错但未生效求助
排查步骤与解决方案
我来帮你捋捋这个问题——代码没报错但目标桶的对象没被删除,大概率是几个容易忽略的细节出了问题,咱们一步步排查:
1. 先确认JSON文件的结构是否正确
这是最常见的坑!你的object-list.json必须是纯字符串数组,比如:
["file1.jpg", "docs/report.pdf", "assets/image.png"]
如果你的JSON是嵌套结构(比如每个对象包含Key字段),比如:
[{"Key": "file1.jpg"}, {"Key": "docs/report.pdf"}]
那循环里直接用obj作为Key参数就错了,得改成obj['Key']。
2. 检查Lambda执行角色的权限
虽然代码没报错,但可能是Lambda的执行角色没有足够权限操作目标桶。你需要确保角色有:
- 读取源桶
source-bucket中object-list.json的权限(s3:GetObject) - 删除目标桶
destination-bucket中对象的权限(s3:DeleteObject)
给角色添加类似这样的IAM政策:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::source-bucket/object-list.json" }, { "Effect": "Allow", "Action": "s3:DeleteObject", "Resource": "arn:aws:s3:::destination-bucket/*" } ] }
3. 添加调试日志,明确问题所在
你现在的代码没有任何日志,根本不知道读取到的对象列表是什么、循环里的obj是不是正确的Key。建议加入日志(用Lambda的CloudWatch日志查看),同时改用批量删除的方式——不仅效率更高,还能直接看到每个对象的删除结果。
修改后的完整代码
import boto3 import json import logging # 配置日志,方便在CloudWatch中查看执行细节 logger = logging.getLogger() logger.setLevel(logging.INFO) source_bucket_name = 'source-bucket' destination_bucket_name = 'destination-bucket' file_format = 'json' file_name = 'object-list.' + file_format region_name = 'us-east-1' def lambda_handler(event, context): s3 = boto3.client('s3', region_name=region_name) try: # 读取源桶中的JSON文件,注意解码成UTF-8字符串避免二进制解析问题 response = s3.get_object(Bucket=source_bucket_name, Key=file_name) raw_content = response['Body'].read().decode('utf-8') logger.info(f"读取到的原始JSON内容: {raw_content}") # 解析JSON为对象列表 object_list = json.loads(raw_content) logger.info(f"解析后的对象Key列表: {object_list}") # 检查列表是否为空 if not object_list: logger.warning("对象列表为空,无需执行删除操作") return {"status": "success", "message": "No objects to delete"} # 构造批量删除参数 delete_batch = { 'Objects': [{'Key': obj} for obj in object_list] } # 执行批量删除并获取结果 delete_result = s3.delete_objects(Bucket=destination_bucket_name, Delete=delete_batch) logger.info(f"批量删除结果: {delete_result}") # 检查是否有删除失败的对象 if 'Errors' in delete_result: logger.error(f"部分对象删除失败: {delete_result['Errors']}") return {"status": "partial_failure", "errors": delete_result['Errors']} else: return {"status": "success", "deleted_objects_count": len(object_list)} except Exception as e: logger.error(f"执行过程出错: {str(e)}", exc_info=True) raise e
最后几个细节检查
- S3对象Key是大小写敏感的,比如
Folder/File.txt和folder/file.txt是两个不同的对象,要确保JSON里的Key和目标桶里的完全一致 - 检查对象Key是否有多余的斜杠、空格或者特殊字符,比如
/file.txt(开头多空格)就会匹配不到对象
部署修改后的代码后,去CloudWatch查看Lambda的日志,就能清楚看到读取到的列表、删除结果,很快就能定位问题啦!
内容的提问来源于stack exchange,提问作者Praveen
相关产品推荐
相关产品推荐

