使用boto3/smart_open连接AWS S3失败,请求调试指导
AWS S3上传失败调试指南(boto3/smart_open)
核心问题拆解
1. 区域代码错误导致连接失败
报错里的us-oregon是无效的AWS区域代码,俄勒冈对应的正确代码是us-west-2。不管用boto3还是smart_open,只要区域配置错误,就会连接到不存在的S3端点,直接触发EndpointConnectionError。
2. IAM政策的不合理限制
- 政策里加的
aws:Referer条件是给浏览器请求用的,SDK发起的请求不会携带Referer头,所以即使密钥正确,也会被政策拒绝。 - 政策只授权了对象级资源
arn:aws:s3:::MY_BUCKET/*,但列出bucket需要bucket级权限arn:aws:s3:::MY_BUCKET,这也是列bucket失败的原因。
分步解决办法
1. 修正区域配置
所有调用必须指定正确的区域us-west-2:
boto3配置方式
import boto3 # 方式1:创建Session时指定区域 session = boto3.Session( aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, region_name='us-west-2' ) s3 = session.resource('s3') # 方式2:直接创建Client时指定 s3_client = boto3.client('s3', region_name='us-west-2')
2. 调整IAM政策
删掉无用的Referer条件,补充bucket级权限:
{ "Version": "2012-10-17", "Id": "Policy1449009487903", "Statement": [ { "Sid": "Stmt1449009478455", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::MY_BUCKET", "arn:aws:s3:::MY_BUCKET/*" ] } ] }
提示:如果不需要全权限,可把
Action改成具体操作,比如s3:PutObject、s3:GetObject,按需缩小范围。
3. 正确用boto3上传文件
修正后的完整上传代码:
import boto3 session = boto3.Session( aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, region_name='us-west-2' ) s3 = session.resource('s3') # 上传本地文件到S3 s3.Bucket(S3_BUCKET).upload_file('本地文件路径', 'test.json') # 验证:列出bucket内的对象 for obj in s3.Bucket(S3_BUCKET).objects.all(): print(obj.key)
4. 正确用smart_open(>=5.0.0)上传
基于正确的boto3 Session,smart_open的简洁写法:
import boto3 from smart_open import open session = boto3.Session( aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, region_name='us-west-2' ) with open( f's3://{S3_BUCKET}/robots.txt', mode='w', transport_params={'client': session.client('s3')} ) as o: o.write("nothing to see here\n")
注:with语句会自动关闭文件,不需要手动调用
o.close()
验证步骤
- 先测试列bucket:运行列bucket代码,能看到目标bucket说明连接正常。
- 上传小文件:用示例代码传一个简单文本,确认S3控制台能看到文件。
内容的提问来源于stack exchange,提问作者user305883
相关产品推荐
相关产品推荐

