使用Python boto3在Lambda中按前缀列举S3对象仅返回1个如何解决
问题排查及修复方案
- 首先检查基础语法缺陷:你当前贴出的代码
try块未闭合,缺少except/finally分支,也没有定义mybucket变量,如果实际运行代码和贴出的一致,会在执行阶段抛出异常,大概率迭代第一个对象打印后就触发异常终止,导致只输出1条结果。 - 补充异常捕获定位问题:在代码中添加完整的异常捕获逻辑,打印错误信息排查是否有权限、资源不存在等运行时错误,参考修改代码:
import boto3 s3 = boto3.resource('s3') # 提前定义存储桶名称,注意替换为实际的桶名 MY_BUCKET = "你的实际存储桶名称" def lambda_handler(event, context): try: bucket = s3.Bucket(MY_BUCKET) # 如果要匹配output/group1目录下的所有对象,建议前缀加末尾斜杠,避免匹配到类似output/group1_test这类前缀的对象 obj_count = 0 for obj in bucket.objects.filter(Prefix='output/group1/'): print(obj.key) obj_count +=1 print(f"匹配到的对象总数量:{obj_count}") except Exception as e: print(f"运行出错:{str(e)}") raise e
- 替换低层级Client接口避免封装问题:boto3的
bucket.objects.filter默认已经实现了自动分页迭代,不需要手动处理分页标记,如果你确认有多条匹配对象但仍然返回不全,可以改用低层级的client接口手动处理分页,规避资源层的封装限制,参考代码:
import boto3 s3_client = boto3.client('s3') MY_BUCKET = "你的实际存储桶名称" def lambda_handler(event, context): try: paginator = s3_client.get_paginator('list_objects_v2') page_iterator = paginator.paginate(Bucket=MY_BUCKET, Prefix='output/group1/') obj_count = 0 for page in page_iterator: if 'Contents' in page: for obj in page['Contents']: print(obj['Key']) obj_count +=1 print(f"匹配到的对象总数量:{obj_count}") except Exception as e: print(f"运行出错:{str(e)}") raise e
- 其他排查点:
- 确认S3存储桶前缀大小写匹配,S3对象键大小写敏感
- 确认Lambda执行角色拥有
s3:ListBucket权限,权限资源需要包含对应存储桶的ARN - 如果存储桶开启了版本控制需要列出所有版本,可以改用
bucket.object_versions.filter方法
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

