使用Boto3调用S3 list_objects_v2无返回对象求助
解决AWS Lambda通过Boto3获取S3存储桶对象为空的问题
问题描述
使用AWS Lambda Python脚本调用Boto3获取S3存储桶zachs-taxi的键列表时,无论使用list_objects_v2直接调用还是分页器,均返回空结果。该存储桶为公开状态,本地可正常访问,桶内存在content文件夹及其中的.png文件。
相关代码片段:
import json, boto3, os def getConfig(): cfg = { "aws_key_id": os.getenv("AWS_KEY_ID", ""), "aws_secret": os.getenv("AWS_SECRET", ""), } return cfg def lambda_handler(event, context): cfg = getConfig() bucket_name = "zachs-taxi" session = boto3.Session( aws_access_key_id=cfg.get('aws_key_id'), aws_secret_access_key=cfg.get('aws_secret') ) s3 = session.client('s3') # 尝试方式1 response = s3.list_objects_v2(Bucket=bucket_name) for content in response.get('Contents', []): print(content['Key']) # 尝试方式2 paginator = s3.get_paginator("list_objects_v2") for page in paginator.paginate(Bucket=bucket_name): for content in page.get('Contents', ()): print(content['Key'])
解决方案
以下是几种可行的解决方向:
1. 修正Lambda权限配置
尽管存储桶为公开状态,Lambda执行角色仍需具备s3:ListBucket权限才能调用API获取对象列表:
- 进入IAM控制台,找到Lambda关联的执行角色
- 添加自定义策略,允许对目标桶执行
s3:ListBucket操作:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::zachs-taxi" } ] }
2. 指定对象前缀
S3中的文件夹是虚拟前缀,默认list_objects_v2仅返回根目录下的对象。若目标文件在content/前缀下,需显式指定:
修改直接调用方式:
response = s3.list_objects_v2( Bucket=bucket_name, Prefix='content/' ) for content in response.get('Contents', []): print(content['Key'])
修改分页器方式:
paginator = s3.get_paginator("list_objects_v2") for page in paginator.paginate(Bucket=bucket_name, Prefix='content/'): for content in page.get('Contents', ()): print(content['Key'])
3. 简化凭证获取逻辑
Lambda运行时会自动通过IAM角色获取临时凭证,无需手动传入环境变量中的密钥。可移除手动创建Session的代码,直接使用默认客户端:
def lambda_handler(event, context): bucket_name = "zachs-taxi" s3 = boto3.client('s3') # 后续调用逻辑不变
这能避免因环境变量配置错误导致的权限问题。
4. 指定存储桶区域
若Lambda所在区域与S3存储桶区域不一致,需在创建S3客户端时明确指定区域:
s3 = session.client('s3', region_name='us-east-1') # 替换为你的存储桶实际区域
内容的提问来源于stack exchange,提问作者Zach Samuels
相关产品推荐
相关产品推荐

