boto3 S3 Client文档记载的close()方法不存在问题咨询
问题背景
官方公开文档标注S3客户端存在close()方法,公开资料说明该方法可解决常见的未关闭SSL socket告警问题,但在boto3 1.24.19版本下调用该方法会直接抛出属性不存在的错误,需确认是否为文档疏漏。
复现过程
复现环境信息:
- boto3版本:1.24.19
- Python版本:3.9.10
- 运行系统:macOS(darwin内核,Clang 13.0.0编译环境)
复现操作及报错输出如下:
$ pip freeze | grep boto3 boto3==1.24.19 $ python Python 3.9.10 (main, Jan 15 2022, 11:48:00) [Clang 13.0.0 (clang-1300.0.29.3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import boto3 >>> c = boto3.client('s3') >>> c.close() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/sbrown/.virtualenvs/moreroku/lib/python3.9/site-packages/botocore/client.py", line 838, in __getattr__ raise AttributeError( AttributeError: 'S3' object has no attribute 'close'
结论与解决方案
这个情况不属于文档疏漏,本质是文档默认展示最新版API说明,但使用的boto3版本过低,未合入该方法实现导致的:
S3.Client.close()是在boto3 1.26.0版本才正式实装到所有服务客户端的公共方法,1.24.x属于更早的维护分支,并没有包含该方法的实现,因此调用时会抛出属性不存在的错误。
可根据实际场景选择对应方案解决:
- 优先方案:将boto3升级到1.26.0及以上稳定版本,升级后即可正常调用
close()方法释放底层连接,彻底解决SSL socket未关闭的告警问题。 - 兼容方案:如果因依赖限制必须使用1.24.x旧版本,可通过调用客户端内部连接管理器的关闭方法手动释放资源,代码为
c._endpoint.http_session._manager.close()。注意该接口属于内部私有API,没有跨版本兼容性承诺,仅作临时兼容使用。
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

