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

如何在本地将Lambda与DynamoDB配合使用?遇超时问题求助

解决Lambda连接本地DynamoDB超时问题

我看你遇到的问题很典型——在SAM Local环境下Lambda调用本地DynamoDB超时,但本地直接运行代码完全正常。主要有两个核心原因,对应下面的解决办法:

1. 异步调用未等待完成就返回,导致Lambda提前终止

你的代码里调用dyn.listTables是异步操作,但你在发起调用后立刻执行了callback(null, response),这会让Lambda函数直接结束生命周期,而DynamoDB的请求还在后台处理,最终就会出现超时。

修改思路很简单:把callback放到DynamoDB的回调函数内部,确保等请求完成后再返回结果:

let AWS = require('aws-sdk')
let dyn= new AWS.DynamoDB({ endpoint: new AWS.Endpoint("http://localhost:8000") })
function handler(event, context, callback) {
 dyn.listTables({Limit: 10}, function(err, data) {
 if (err) {
 console.log("Error", err.code)
 callback(err, { statusCode: 500 }) // 错误时返回500状态码
 } else {
 console.log("Table names are ", data.TableNames)
 callback(null, { 
     statusCode: 200, 
     body: JSON.stringify(data.TableNames) // 把结果返回给调用方
 })
 }
 })
}

2. SAM Local容器无法访问宿主机的DynamoDB

SAM Local运行Lambda是在Docker容器里的,容器内的localhost指向容器自身,而不是你的电脑(宿主机)。所以直接用http://localhost:8000会导致容器找不到宿主机上的DynamoDB服务。

针对不同系统有不同的解决方式:

  • Windows/macOS:Docker提供了特殊域名host.docker.internal,它会自动解析到宿主机的IP,直接替换localhost即可:
    let dyn= new AWS.DynamoDB({ endpoint: new AWS.Endpoint("http://host.docker.internal:8000") })
    
  • Linux:你可以手动指定宿主机的局域网IP(比如192.168.1.100),或者在启动SAM Local时加上--docker-network参数,让Lambda容器和DynamoDB容器处于同一个网络,然后用DynamoDB的容器名称作为地址。

另外还要确认两点:一是你的DynamoDB服务已经正常启动,端口8000没被其他程序占用;二是启动SAM Local时没有配置网络隔离的参数。

把这两个问题都解决后,超时情况应该就消失了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:44:09