You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加AWS模块与SSM/Secrets层后,Node.js Lambda运行时提示AWS未定义

问题分析与解决方案

核心错误原因

  1. /* global AWS */仅用于告知代码编辑器/ESLint该变量为全局变量,不会实际引入AWS SDK,对Lambda运行时无任何作用。
  2. AWS-Parameters-and-Secrets-Lambda-Extension是参数缓存扩展层,用于提升SSM参数/Secrets Manager密钥的获取性能,不提供AWS SDK,和你遇到的AWS is not defined错误无关。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:05:21