仅知AWS Bucket与对象名,Python无密钥下载S3文件报错如何解决?
无需AWS密钥下载S3对象的可行方法
只有当目标S3桶或对象本身允许无授权访问,或者能借助其他AWS授权机制时,才能不用Access Key/Secret Key完成下载,具体方案如下:
1. 目标对象/桶已设置公开可读权限
如果桶的所有者已将目标对象或整个桶配置为公开可读,可以用两种方式下载:
方式一:直接用HTTP请求下载(无需boto3)
直接构造对象的公开URL,用requests库发起请求即可,URL格式为https://<桶名>.s3.<区域>.amazonaws.com/<对象键>,示例代码:
import requests # 替换为实际的桶名、区域和对象键 bucket_name = "yz" region = "us-east-1" # 比如国内区域用cn-north-1 object_key = "keh.docx" public_url = f"https://{bucket_name}.s3.{region}.amazonaws.com/{object_key}" response = requests.get(public_url) with open("keh.docx", "wb") as file: file.write(response.content)
方式二:用boto3匿名客户端访问
boto3支持匿名访问公开资源,修改你的代码如下:
import boto3 # 创建匿名S3资源客户端 s3 = boto3.resource('s3', aws_access_key_id='', aws_secret_access_key='') s3.Bucket('yz').download_file(Key='keh.docx', Filename='keh.docx')
2. 代码运行在AWS服务环境内(如EC2、Lambda)
如果代码部署在AWS的EC2实例、Lambda函数等托管服务上,给该服务实例附加具备S3读取权限的IAM角色即可。boto3会自动从环境中获取角色的临时凭证,无需手动配置密钥,你的原有代码可以直接运行。
3. 使用预签名URL
让桶的所有者生成一个预签名下载URL(包含临时授权信息,可设置有效期),你直接用HTTP请求访问这个URL就能下载对象,不需要自己的AWS密钥。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

