使用SAM的Lambda函数无法连接本地DynamoDB 求助排查
解决SAM本地Lambda无法连接DynamoDB Local的问题
问题根源
用SAM本地运行Lambda时,Lambda是在Docker容器内执行的。你代码里配置的http://localhost:8000指向的是Lambda容器自身的localhost,而非运行DynamoDB Local的宿主机,因此出现连接失败的错误。
解决方案
1. 修改DynamoDB端点配置
将Lambda代码中的DynamoDB端点指向宿主机的可访问地址:
- Windows/macOS(Docker Desktop环境):用
host.docker.internal,这是Docker提供的特殊域名,会自动解析到宿主机IP。 - Linux环境:直接使用宿主机的实际IP地址(比如
192.168.1.100这类局域网IP),或者配置Docker使用host网络模式。
修改Lambda代码
建议通过环境变量读取端点,保持配置灵活性:
import AWS from 'aws-sdk'; import bcrypt from 'bcrypt'; export const lambdaHandler = async (event, context) => { const dynamoDB = new AWS.DynamoDB.DocumentClient({ region: 'localhost', endpoint: process.env.DYNAMODB_LOCAL_ENDPOINT // 从环境变量获取端点 }); const params = { TableName: process.env.TABLE_NAME, Select: 'COUNT', }; const result = await dynamoDB.scan(params).promise(); return result }
更新SAM模板的环境变量
把DYNAMODB_LOCAL_ENDPOINT的值替换为宿主机可访问地址:
Environment: Variables: TABLE_NAME: "User" DYNAMODB_LOCAL_ENDPOINT: http://host.docker.internal:8000 # Windows/macOS环境用这个 # DYNAMODB_LOCAL_ENDPOINT: http://192.168.1.100:8000 # Linux环境替换为你的宿主机IP
2. 验证连接
重启SAM本地服务后重新测试:
- 停止当前SAM服务:按
Ctrl+C - 重新启动:执行
sam local start-api(或用sam local invoke直接调用函数)
额外检查
- 确认DynamoDB Local仍在运行,端口8000未被其他程序占用
- 你的IAM角色资源ARN配置正确(
arn:aws:dynamodb:localhost:localhost:table/User符合DynamoDB Local的格式要求)
内容的提问来源于stack exchange,提问作者Azazel
相关产品推荐
相关产品推荐

