MacOS M2环境下FastAPI+Boto3上传S3/MinIO遇100 Continue阻塞问题
解决方案
1. 禁用Expect: 100-continue请求头
MacOS M2环境下,Boto3默认触发的Expect: 100-continue机制可能和S3/MinIO的响应逻辑不兼容,导致请求卡住。直接关闭该机制即可解决:
代码层面修改
初始化Boto3客户端时添加对应配置:
import boto3 from botocore.config import Config s3_config = Config( expect_100_continue=False, connect_timeout=10, read_timeout=30, retries={'max_attempts': 3} ) s3_client = boto3.client( 's3', endpoint_url='http://你的MinIO端点' if 使用MinIO else None, aws_access_key_id='你的密钥ID', aws_secret_access_key='你的密钥', config=s3_config )
AWS CLI层面修改
编辑~/.aws/config文件,添加:
[default] s3 = expect_100_continue = false
2. 强制使用IPv4连接
MacOS M2默认优先IPv6,若你的存储服务未配置IPv6支持,会导致连接异常。强制切换到IPv4:
代码层面
在Config中添加IPv4强制配置:
s3_config = Config( # 保留其他配置... use_dualstack_endpoint=False, addressing_style='path' )
或运行脚本前设置环境变量:
export AWS_FORCE_IPV4=true
AWS CLI层面
在~/.aws/config中添加:
[default] s3 = addressing_style = path
执行CLI命令时附加环境变量:
AWS_FORCE_IPV4=true aws s3 cp 本地文件路径 s3://你的存储桶/目标路径
3. 调整超时参数
适当延长超时阈值,避免网络延迟触发ReadTimeoutError:
s3_config = Config( connect_timeout=15, read_timeout=60, retries={'max_attempts': 5, 'mode': 'standard'} )
4. MinIO服务端配置调整(仅针对MinIO)
若使用MinIO,检查并延长API请求超时时间,启动服务时添加参数:
minio server ./数据目录 --api-request-timeout 120s
验证测试
修改配置后,运行简单上传测试确认问题解决:
import boto3 from botocore.config import Config test_config = Config(expect_100_continue=False, use_dualstack_endpoint=False) client = boto3.client('s3', config=test_config, ...) client.put_object(Bucket='测试桶', Key='test.txt', Body=b'测试内容') print("上传完成,未出现卡顿")
内容的提问来源于stack exchange,提问作者Lucas Renato
相关产品推荐
相关产品推荐

