Python调用boto3访问S3报AccessDenied,访问密钥应配置在哪
报错核心原因
你当前抛出AccessDenied异常的直接原因有两点:
- 代码中未初始化S3客户端,也没有传入任何访问认证凭证,boto3默认会尝试读取本机环境变量、本地配置文件里的凭证,找不到就会发起匿名请求,必然被拒绝。
- 你手中
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
相关产品推荐
相关产品推荐

