AWS SAM本地调用Lambda连本地DynamoDB报UnrecognizedClientException如何解决
问题修复方案
错误原因
你遇到的UnrecognizedClientException报错由两个配置缺失导致:
- Lambda代码中DynamoDB客户端默认指向AWS线上服务,没有指定本地DynamoDB的访问端点,请求线上服务时会校验AWS凭证有效性,因此报错
- 本地运行的DynamoDB容器不需要真实AWS密钥,但你没有配置本地测试场景下的占位密钥
具体修复步骤
- 修改Lambda代码,适配本地测试场景
新增本地环境判断逻辑,SAM本地调用时会自动注入AWS_SAM_LOCAL=true的环境变量,用该变量区分本地/线上环境,修改后的代码如下:
var AWS = require('aws-sdk'); AWS.config.update({region: 'us-east-1'}); exports.lambdaHandler = async (event, context) => { // 区分本地/线上环境 const isLocal = process.env.AWS_SAM_LOCAL === 'true'; const dynamoConfig = {}; if (isLocal) { // 同Docker网络下通过容器名访问本地DynamoDB,无需使用localhost dynamoConfig.endpoint = 'http://users:8000'; // 本地DynamoDB不校验密钥,随意填写占位即可 dynamoConfig.accessKeyId = 'testId'; dynamoConfig.secretAccessKey = 'testKey'; } const dynamoDB = new AWS.DynamoDB.DocumentClient(dynamoConfig); const params = { TableName: 'employees', Key: { name: "naxi" } }; const result = await dynamoDB.get(params).promise(); if (result.Item) { return result.Item; } else { return { error: 'Task not found.' }; } };
- 无需额外修改SAM调用命令,直接执行原有命令即可:
sam local invoke <lambdaFunctionName> --docker-network lambda-local
额外注意事项
你之前验证DynamoDB运行状态的命令存在拼写错误,localhsot需改为localhost,该错误不影响Lambda调用逻辑,仅手动验证时需要修正。
内容的提问来源于stack exchange,提问作者Naxi
相关产品推荐
相关产品推荐

