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

如何解决AWS S3 Object Lambda函数执行超60秒时的无效令牌错误?

S3 Object Lambda执行超60秒触发「Invalid token」错误的原因及解决办法

问题现象

测试Python版Amazon S3 Object Lambda函数时发现:当函数执行时间超过60秒,调用WriteGetObjectResponse接口会触发「Invalid token」错误;将睡眠时间调整为50秒时执行正常。已修改客户端超时参数(connect_timeout、read_timeout)及Lambda函数超时参数,但问题依旧。

示例代码:

import boto3
import json
import struct
from botocore.session import Session
from botocore.config import Config
import time

def lambda_handler(event, context):
    print('event', event)
    object_get_context = event["getObjectContext"]
    request_route = object_get_context["outputRoute"]
    request_token = object_get_context["outputToken"]
    s3_url = object_get_context["inputS3Url"]
    
    s = Session()
    s3 = s.create_client('s3', config=Config(connect_timeout=300, read_timeout=300, retries={'max_attempts': 1}))
    
    
    print("start")
    time.sleep(60)
    print("sleep for 60s")
    
    s3.write_get_object_response(
        Body=b"123",
        RequestRoute=request_route,
        RequestToken=request_token)

    return {'status_code': 200}

错误信息:

[ERROR] ClientError: An error occurred (ValidationError) when calling the WriteGetObjectResponse operation: Invalid token

核心原因

这是因为S3 Object Lambda生成的RequestToken存在60秒的硬性有效期限制。这个令牌用于关联S3的原始请求与Lambda的响应,一旦超过60秒,令牌会自动失效,此时即使Lambda函数本身的超时时间设置更长,调用WriteGetObjectResponse也会因令牌无效而失败。

解决办法

  1. 压缩函数处理耗时

    • 移除代码中不必要的等待、阻塞操作(比如示例中的time.sleep(60))
    • 优化数据处理逻辑:对大文件采用流式处理而非全量加载,减少内存占用与处理时间
    • 并行执行独立操作:使用多线程、异步IO等方式并行处理可拆分的任务,缩短总执行时间
  2. 调整业务架构(若处理耗时无法压缩至60秒内)

    • 如果业务场景确实需要超过60秒的处理时间,可考虑先返回一个基础响应给S3,再通过异步任务完成后续处理;或者将耗时任务拆分到其他Lambda函数中执行,当前S3 Object Lambda仅负责触发异步任务并返回临时响应(需注意业务逻辑的兼容性)

内容的提问来源于stack exchange,提问作者stjrc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 07:15:38