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

Node.js Lambda通过AWS SAM Local调用DynamoDB Local无法列出表名

问题排查与解决方案

你的Lambda返回空表列表,核心原因是代码未正确指向本地DynamoDB实例,或网络/环境变量配置存在问题,以下是具体排查和修复步骤:

1. 确认AWS_SAM_LOCAL环境变量是否生效

Lambda代码中仅当AWS_SAM_LOCAL存在时才会设置本地DynamoDB的endpoint,如果该变量未被正确注入,代码会默认访问AWS云端的DynamoDB(而云端没有你的SampleTable)。

  • 在代码开头添加日志,验证变量是否存在:
    console.log('AWS_SAM_LOCAL:', process.env.AWS_SAM_LOCAL);
    console.log('DynamoDB options:', options);
    
  • 运行SAM本地时,确保该变量被自动设置(SAM Local默认会注入,若使用自定义启动脚本,需手动添加-e AWS_SAM_LOCAL=true参数)。

2. 修正Endpoint配置

代码中使用new AWS.Endpoint()的写法可能存在初始化问题,尝试直接赋值字符串endpoint:

if (process.env.AWS_SAM_LOCAL) {
  options.endpoint = 'http://host.docker.internal:8000'; // 替换原有的new AWS.Endpoint写法
}

3. 排查容器网络连通性

如果使用Docker运行SAM Local和DynamoDB,可能存在网络隔离问题:

  • 若DynamoDB通过Docker Compose启动,启动SAM Local时指定相同的网络:
    sam local start-api --docker-network <你的DynamoDB容器所在网络名>
    
  • 或者直接使用DynamoDB容器的IP地址作为endpoint(通过docker inspect <DynamoDB容器ID>获取IP),避免host.docker.internal的DNS解析问题。

4. 完善错误捕获,排查潜在问题

当前代码的catch块仅打印错误但未返回,无法直观看到连接失败的原因,修改代码暴露错误信息:

catch (err) {
  console.log('DynamoDB Error:', err);
  response = {
    statusCode: 500,
    body: JSON.stringify({ error: err.message, stack: err.stack })
  };
}

这样可以通过API响应看到具体错误(如连接超时、权限不足等)。

5. 验证Region一致性

本地DynamoDB默认使用us-east-1,确保代码中的region配置与DynamoDB实例一致,若你自定义了DynamoDB的region,需同步修改代码中的options.region。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:35:24