Node.js中使用Middy从SSM读取值失败,请求协助排查
问题分析与修复方案
错误原因
Lambda抛出的TypeError: Cannot read properties of undefined (reading 'Parameter'),核心问题出在middy的ssm中间件配置和参数访问逻辑上:
- 错误的参数结构访问:当
setToContext: true时,ssm中间件会直接将SSM参数的值存入handler.context.botToken,而非返回完整的SSM响应对象(即{ Parameter: { Value: 'xxx' } }),所以你访问Parameter.Value会触发undefined错误。 - SSM参数路径配置错误:如果
process.env.BOT_TOKEN存储的不是SSM参数的完整路径(如/your-app/slack/bot-token),而是Token本身,中间件会尝试去SSM中查找名称等于该Token的参数,导致获取失败,handler.context.botToken变为undefined。
修复步骤
步骤1:修正参数访问逻辑
无论SSM参数是否正确获取,先修正before中间件的参数读取代码:
.before(async (handler) => { // 直接使用handler.context.botToken,它已经是SSM参数的实际值 const botToken = handler.context.botToken; if (!botToken) { throw new Error("Failed to retrieve bot token from SSM"); } console.log(`Retrieved bot token: ${botToken}`); initializeClient(botToken); });
步骤2:确认SSM参数配置
- 确保
process.env.BOT_TOKEN存储的是SSM参数的完整路径,而非Token本身; - 给Lambda函数添加IAM权限,允许调用
ssm:GetParameter(若参数加密,还需kms:Decrypt权限)。
可选:如果无需SSM存储Token
若你直接用环境变量存储Token,可移除ssm中间件,简化代码:
// 初始化Slack客户端 initializeClient(process.env.BOT_TOKEN); // 仅保留必要的中间件 export const handler = middy(handlePipelineEvent) .use(doNotWaitForEmptyEventLoop());
内容的提问来源于stack exchange,提问作者Abhinay
相关产品推荐
相关产品推荐

