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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:41:11