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

Python调用boto3访问S3报AccessDenied,访问密钥应配置在哪

报错核心原因

你当前抛出AccessDenied异常的直接原因有两点:

  1. 代码中未初始化S3客户端,也没有传入任何访问认证凭证,boto3默认会尝试读取本机环境变量、本地配置文件里的凭证,找不到就会发起匿名请求,必然被拒绝。
  2. 你手中OKIA开头的字符串是S3的访问密钥ID(AK),仅靠这一个值无法完成S3的签名认证,还需要和它配对的秘密访问密钥(SK)才能通过鉴权。
凭证传入位置

S3的访问凭证需要在初始化boto3 S3客户端的时候传入,不是在get_object请求方法里传,正确代码示例如下:

import boto3
from botocore.exceptions import ClientError

# 初始化客户端时统一配置认证信息
s3_client = boto3.client(
    service_name='s3',
    aws_access_key_id='OKIA4RBSCI236N869IJG', # 这里填你拿到的AK
    aws_secret_access_key='对应配对的SK值', # 找给你发AK的管理员索要,没有这个值无法完成认证
    # 注意:如果使用的不是AWS官方S3,是其他厂商兼容S3服务/私有云S3,必须补充下面的endpoint_url配置,指向实际服务地址
    # endpoint_url='https://你的S3服务访问域名'
)

try:
    response = s3_client.get_object(
        Bucket='solutions',
        Key='accounts/services/具体目标文件名' # Key要写完整对象路径,不能只写到文件夹前缀
    )
    print(response)
except ClientError as e:
    print(f"请求异常: {e}")
其他注意事项
  • S3本身没有文件夹实体概念,solutions/accounts/services是对象前缀,不是具体文件,直接把前缀填到Key参数调用get_object,就算认证通过也会报找不到对象的错误。如果要遍历该前缀下的所有文件,需要调用list_objects_v2接口,传入Prefix='accounts/services/'参数。
  • 如果填完AK/SK和endpoint后仍然报AccessDenied,需要联系密钥管理员确认:当前密钥是否被授予了solutions存储桶下对应路径的s3:GetObject权限,密钥是否过期、是否有IP访问限制。
  • 不要硬编码密钥在代码里,生产环境建议通过环境变量、IAM角色、本地凭证文件的方式加载密钥,避免密钥泄露。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.18 16:15:42