Lambda连接DynamoDB时出现请求签名不匹配错误排查
DynamoDB签名不匹配问题排查方案
核心问题定位
本地通过SharedIniFileCredentials可正常访问DynamoDB,但Lambda中硬编码accessKeyId和secretAccessKey时出现The request signature we calculated does not match the signature you provided错误,以下是具体排查与解决步骤:
1. 废弃Lambda硬编码凭证的做法
Lambda运行环境会自动关联执行角色权限,无需手动配置密钥。硬编码密钥极易引发以下问题:
- 密钥中的特殊字符(如斜杠)未正确处理,导致签名计算错误
- 密钥过期或权限变更未同步
- 违反AWS安全最佳实践,存在密钥泄露风险
修改后的代码无需手动配置凭证:
const { DynamoDBClient, ScanCommand } = require("@aws-sdk/client-dynamodb"); // 仅需指定区域,Lambda会自动获取执行角色凭证 const client = new DynamoDBClient({ region: "us-east-1" }); const queryTokens = async () => { try { const params = { TableName: "brc-20", }; const command = new ScanCommand(params); const response = await client.send(command); return response.Items; } catch (error) { console.log(error.message, 'for queryTokens'); } };
2. 检查Lambda执行角色权限
确保Lambda的执行角色已配置DynamoDB访问权限:
- 添加
dynamodb:Scan权限(对应代码中的ScanCommand操作) - 权限资源范围需包含目标表:
arn:aws:dynamodb:us-east-1::table/brc-20
3. 验证凭证一致性(若坚持硬编码)
如果必须使用硬编码密钥,执行以下验证:
- 本地通过命令获取
myProfile的密钥:aws configure get aws_access_key_id --profile myProfile aws configure get aws_secret_access_key --profile myProfile - 对比Lambda中硬编码的密钥,确保无字符遗漏、拼写错误或转义问题(如
secretAccessKey中的斜杠无需额外转义)
4. 确认区域匹配
检查DynamoDB表的实际区域是否为us-east-1,跨区域请求会导致签名计算规则不匹配,引发错误。
5. 核对SDK版本
代码中使用了ScanCommand(AWS SDK v3的API),需确保Lambda部署包中安装的是@aws-sdk/client-dynamodb包,而非v2版本的aws-sdk,版本不兼容会导致签名逻辑异常。
内容的提问来源于stack exchange,提问作者Rodrigo Burgos
相关产品推荐
相关产品推荐

