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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:55:29