NodeJS调用AWS Secrets Manager回调失效致Lambda超时问题
解决Lambda调用Secrets Manager获取RDS凭证超时且无返回的问题
嘿,我一眼就揪出了问题的核心——你调用的函数名称和模块导出的函数名称完全不匹配,这直接导致你的回调函数永远不会被触发,Lambda一直在空等最终超时,自然也看不到creds的日志输出。
咱们对照代码看看:
- 在
secrets-manager.js里,你导出的函数是getRDSCredsFromSM:
module.exports = { getRDSCredsFromSM };
- 但在
index.js里,你调用的却是一个不存在的getDbCredentialFromSecretsManager函数:
secretsManager.getDbCredentialFromSecretsManager(function(err,creds) { ... })
Node.js找不到这个不存在的函数,所以根本不会执行Secrets Manager的请求逻辑,也不会调用你传入的回调,Lambda进程就一直挂着直到超时。
修正方案
只需要把index.js里的函数调用名称改成和导出一致的getRDSCredsFromSM就行,修正后的代码如下:
var mysql = require('mysql'); var secretsManager = require('./secrets-manager'); exports.handler = (event, context, callback) => { secretsManager.getRDSCredsFromSM(function(err,creds) { // 这里修改函数名 if (err) { console.log(err); callback(err, null); } else{ console.log("Creds ", creds); var connection = mysql.createConnection(creds); connection.connect(function(err) { if (err) { console.error(err.stack); callback(err,null); } else{ callback(null,connection); } }); } }); }
额外的小建议
为了避免后续踩坑,还可以做这些检查:
- 确认Lambda执行角色拥有
secretsmanager:GetSecretValue权限,不然即使函数名对了,也会返回权限错误 - 核对
secretName的取值是正确的Secrets Manager密钥ID或ARN - 把Lambda的超时时间设置得合理一点,建议至少5秒,毕竟Secrets Manager的请求需要一点网络耗时
内容的提问来源于stack exchange,提问作者Dev1ce
相关产品推荐
相关产品推荐

