使用Boto3向AWS S3批量上传文件时遭遇ExpiredToken错误求助
问题描述
我使用以下Python代码向AWS S3上传文件:
import boto3 s3_client = boto3.client("s3") s3_client.upload_file(img_path, bucket, key)
这段上传代码运行在循环中,需要处理大量数据,整个流程耗时数日,且我采用了多进程机制。运行一段时间后出现如下错误:
Failed to upload image.JPEG: An error occurred (ExpiredToken) when calling the PutObject operation: The provided token has expired.: image.JPEG
我知晓凭证会定期刷新,但不清楚如何解决该问题。
解决方案
该问题的核心原因是:在主进程中创建的boto3.client实例会缓存初始凭证,多进程环境下子进程会继承这一缓存的凭证,当凭证过期后,子进程内的客户端无法自动刷新凭证。
可行的解决方法:
- 不在主进程预先创建S3客户端,在每个子进程内部创建
boto3.client实例。这样每个子进程会独立获取并管理自身的凭证,当凭证过期时会自动完成刷新。 - 或者使用
boto3.Session管理会话,在每个子进程中基于新会话创建客户端,确保凭证刷新机制正常运作。示例代码如下:
import boto3 from multiprocessing import Process def upload_file_in_process(img_path, bucket, key): # 在子进程内创建会话与客户端 session = boto3.Session() s3_client = session.client("s3") s3_client.upload_file(img_path, bucket, key) # 多进程调用示例 if __name__ == "__main__": processes = [] # 假设files为待上传的文件信息列表 for file_info in files: p = Process( target=upload_file_in_process, args=(file_info["path"], "my-bucket", file_info["key"]) ) processes.append(p) p.start() for p in processes: p.join()
补充说明
本问题已找到可行解决方案,申请关闭。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

