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

AWS Amplify调用Lambda返回504超时 控制台测试正常如何解决

问题根因

你调整了所有能想到的超时配置依然报错的核心原因,是漏掉了调用链路最上层的API Gateway超时限制:

  • 在AWS控制台直接测试Lambda时,请求不会经过API Gateway链路,只要Lambda本身的内存、超时配置足够,就能正常执行完成
  • 应用端发起的请求必须先经过API Gateway再触发Lambda,不管你客户端、Lambda服务本身、Lambda内部的axios请求设置了多长的超时时间,API Gateway REST API的集成超时默认值是29秒,且这是不可调整的硬上限,只要后端处理时长超过29秒,API Gateway会直接掐断连接返回504,根本不会等待Lambda后续的执行结果。
    从你贴的CloudWatch错误日志可以看到,Lambda内部axios配置的超时是900000ms(15分钟),说明Lambda本身根本没触发自身的超时逻辑,是上游链路提前断开了连接。
排查步骤
  • 按请求流向从外到内逐节点核对超时阈值:前端Amplify请求 → API Gateway → Lambda运行环境 → Lambda内部第三方请求(axios调用),任意一个节点的超时阈值小于实际请求处理时长,都会触发504错误
  • 去CloudWatch查看对应Lambda请求的实际执行时长:如果执行时长卡在29秒左右就被截断,可直接判定是API Gateway超时导致;如果执行时长跑到你设置的Lambda超时阈值才终止,才是Lambda配置未生效的问题
  • 部署完成后直接到AWS控制台核对API Gateway对应端点的配置,不要只依赖本地Amplify模板配置——很多时候Amplify推送时会出现配置漏更新、被默认值覆盖的问题,本地改了不代表云端真的生效了。
修复方案
  • 针对长耗时请求调整调用模式:因为API Gateway REST API最多只能等待29秒,没有办法调高超时阈值,如果你的接口实际处理时长超过29秒,不要用前端同步等待返回的模式,改成异步调用逻辑:前端触发接口后Lambda先返回202状态码表示请求已接收,后台异步执行长耗时任务,任务完成后通过WebSocket推送结果,或者让前端轮询单独的任务状态接口获取结果。如果你的接口处理时长本来就小于29秒,直接到API Gateway控制台找到/my-path的POST方法集成项,确认超时配置为默认最大值即可。
  • 做单端点配置隔离:不需要加全局axios拦截器调整所有请求的超时,你现在的写法——在API.post的配置项里单独给当前请求传timeout参数、在Lambda内部给当前第三方请求单独传axios的timeout配置就可以实现单端点超时控制,不会影响其他接口的默认配置。
  • 顺手修正Lambda错误返回的取值逻辑:axios抛出的错误状态码挂载在error.response.status字段下,你当前代码里写的error.statusCode拿不到正确的状态码,会默认返回500,调整后方便后续定位问题。

修正后的Lambda错误返回片段参考:

catch (error) {
  console.log('ERROR: ', JSON.stringify(error))
  const statusCode = error.response?.status || 500
  return {
    statusCode,
    headers: {
      "Access-Control-Allow-Origin": "*",
      "Access-Control-Allow-Headers": "*"
    },
    body: JSON.stringify(error),
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:39:20