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

使用boto3列举S3桶对象时aws_session_token是否为必需参数?

问题结论

  1. aws_session_token 不是访问S3桶的必填参数,仅当你使用STS生成的临时安全凭证(如角色切换凭证、实例元数据凭证、短期授权凭证)时才需要传入,使用IAM用户长期Access Key/Secret Key时完全不需要该参数。
  2. 你遇到的报错和是否传入aws_session_token没有任何关联,本质是你的请求没有正确用到你传入的AK/SK,或者AK/SK本身存在合法性问题。

报错根因排查

你收到的InvalidAccessKeyId是AWS服务端返回的错误,代表服务端不识别你请求携带的Access Key ID,常见排查点如下:

  • 检查你填写的aws_access_key_id和aws_secret_access_key是否存在拼写错误,不要遗漏字符、不要混入多余空格、不要混淆大小写
  • 确认该AK对应的IAM用户所属AWS账号,和你要访问的S3桶所属AWS账号一致
  • 确认你初始化boto3时指定的region_name和S3桶实际所在区域匹配,未显式指定区域时boto3会读取本地默认区域配置,区域不匹配也可能触发该错误
  • 确认你使用的AK没有被管理员禁用、删除,也没有超出设置的有效期

常见代码错误修正

多数类似报错都是因为创建了自定义凭证的会话后,没有用该会话生成S3操作对象,导致boto3走默认凭证链读取其他凭证,没有用到你传入的AK/SK,以下是两种正确写法:

写法1:通过自定义Session操作

import boto3

# 用自定义AK/SK创建会话,必须指定桶所在区域
session = boto3.session.Session(
    aws_access_key_id="XXXXXXXXXX",
    aws_secret_access_key="YYYYYYYYYYYYYY",
    region_name="桶所在区域,例如cn-north-1、us-east-1"
)
# 必须用上述session创建s3资源,才会使用你传入的凭证
s3_resource = session.resource('s3')
first_bucket = s3_resource.Bucket("你的桶名")

# 遍历对象
for obj in first_bucket.objects.filter(Prefix="你的过滤前缀"):
    print(obj.key)

写法2:直接初始化S3客户端

import boto3

# 直接初始化s3客户端,所有参数显式传入
s3_client = boto3.client(
    's3',
    aws_access_key_id="XXXXXXXXXX",
    aws_secret_access_key="YYYYYYYYYYYYYY",
    region_name="桶所在区域"
)

# 调用ListObjectsV2接口获取对象列表
resp = s3_client.list_objects_v2(Bucket="你的桶名", Prefix="你的过滤前缀")
if "Contents" in resp:
    for obj in resp["Contents"]:
        print(obj["Key"])

内容的提问来源于stack exchange,提问作者Eric Garcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:30:02