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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 23:26:36