使用boto3列举S3桶对象时aws_session_token是否为必需参数?
问题结论
aws_session_token不是访问S3桶的必填参数,仅当你使用STS生成的临时安全凭证(如角色切换凭证、实例元数据凭证、短期授权凭证)时才需要传入,使用IAM用户长期Access Key/Secret Key时完全不需要该参数。- 你遇到的报错和是否传入
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
相关产品推荐
相关产品推荐

