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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:55:15