Node.js/Lambda通过AWS Secrets Manager连接MySQL时账号密码未解析
解决AWS Secrets Manager获取的Secret值无法解析为MySQL连接参数的问题
问题核心:你从Secrets Manager获取到的secret_value是JSON格式的字符串,而非JavaScript对象,直接通过.访问属性自然会返回undefined。
快速修复方案
在connect函数中,将获取到的Secret字符串解析为JavaScript对象即可:
修改连接代码中的这一行:
const secret_value = await SecretsManager.getSecret(secretName);
替换为:
const secret_value = JSON.parse(await SecretsManager.getSecret(secretName));
完整修改后的connect函数代码:
const mysql = require('mysql2/promise'); const SecretsManager = require('./secret') async function connect() { const secretName = process.env.SECRET_NAME // 关键:将JSON字符串解析为JS对象 const secret_value = JSON.parse(await SecretsManager.getSecret(secretName)); try { const config = { host: process.env.DB_HOST, port: '3306', user: secret_value.username, password: secret_value.password, database: process.env.DB_NAME } console.log(config) const connection = await mysql.createConnection(config); return connection } catch (err) { console.log(`MySQL connection error: ${err}`) } } module.exports = { connect }
进阶优化方案(推荐)
如果希望getSecret函数直接返回可使用的对象,避免每次调用都手动解析,可以修改getSecret函数中的resolve逻辑,直接解析JSON后返回:
async function getSecret(secretName) { var AWS = require('aws-sdk'), region = process.env.REGION, secretName = secretName; var client = new AWS.SecretsManager({ region: region }); return new Promise((resolve,reject)=>{ client.getSecretValue({SecretId: secretName}, function(err, data) { if (err) { reject(err); } else { if ('SecretString' in data) { // 直接解析JSON字符串为对象返回 resolve(JSON.parse(data.SecretString)); } else { let buff = Buffer.from(data.SecretBinary, 'base64'); // 若二进制存储的是JSON格式,同样解析后返回 resolve(JSON.parse(buff.toString('ascii'))); } } }); }); } module.exports = { getSecret }
验证方式
修改后可以添加日志验证解析结果:
console.log(typeof secret_value); // 输出应为object console.log(secret_value.username); // 输出应为实际的数据库用户名
内容的提问来源于stack exchange,提问作者Zalizan Zolkipali
相关产品推荐
相关产品推荐

