添加AWS模块与SSM/Secrets层后,Node.js Lambda运行时提示AWS未定义
问题分析与解决方案
核心错误原因
/* global AWS */仅用于告知代码编辑器/ESLint该变量为全局变量,不会实际引入AWS SDK,对Lambda运行时无任何作用。AWS-Parameters-and-Secrets-Lambda-Extension是参数缓存扩展层,用于提升SSM参数/Secrets Manager密钥的获取性能,不提供AWS SDK,和你遇到的AWS is not defined错误无关。- Lambda的Node.js运行时环境中,AWS SDK的可用性和引入方式取决于你使用的Node.js版本:
- Node.js 16及更早版本:默认自带AWS SDK v2,但仍需手动引入
- Node.js 18及以上版本:默认自带AWS SDK v3(模块化),不再内置SDK v2
修复步骤
情况1:使用Node.js 16及更早版本(自带SDK v2)
修改代码,手动引入AWS SDK v2,替换掉无效的/* global AWS */注释:
const AWS = require('aws-sdk'); AWS.config.update({region: 'us-east-1'}); const ssm = new AWS.SSM(); console.log('Loading function...'); exports.handler = async (event, context) => { console.log('value1 =', event.key1); console.log('value2 =', event.key2); console.log('value3 =', event.key3); try { const data = await ssm.getParameters({ Names: [`/my/dev/scrt`], WithDecryption: false, }).promise(); if (!data.Parameters.length) { throw new Error(`SSM Parameter was not set.`); } const plainsecret = data.Parameters[0].Value; console.log(`the secret is ${plainsecret}`); return `${plainsecret} - ${event.key1}`; } catch (err) { console.error(err); throw err; } };
额外修复:原代码中
${scrt}属于未定义变量,需改为${plainsecret};同时将.then()改为await语法,避免Lambda函数提前结束(异步回调未执行完的情况下,handler已返回)。
情况2:使用Node.js 18及以上版本(推荐用SDK v3)
AWS SDK v3采用模块化设计,需单独引入SSM相关的客户端和命令:
const { SSMClient, GetParametersCommand } = require("@aws-sdk/client-ssm"); const client = new SSMClient({ region: "us-east-1" }); console.log('Loading function...'); exports.handler = async (event, context) => { console.log('value1 =', event.key1); console.log('value2 =', event.key2); console.log('value3 =', event.key3); try { const command = new GetParametersCommand({ Names: [`/my/dev/scrt`], WithDecryption: false, }); const data = await client.send(command); if (!data.Parameters.length) { throw new Error(`SSM Parameter was not set.`); } const plainsecret = data.Parameters[0].Value; console.log(`the secret is ${plainsecret}`); return `${plainsecret} - ${event.key1}`; } catch (err) { console.error(err); throw err; } };
如果你在Node.js 18+环境下仍想使用SDK v2,需要将
aws-sdk包添加到项目依赖中,打包后上传至Lambda(默认环境不再内置v2)。
内容的提问来源于stack exchange,提问作者yen
相关产品推荐
相关产品推荐

