如何在本地将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
相关产品推荐
相关产品推荐

