使用AWS SDK Codemod迁移Lambda至V3后仍遇模块找不到错误
解决AWS SDK V2转V3后Lambda报错"Cannot find module 'aws-sdk'"的问题
问题原因
报错的核心是代码中仍保留了AWS SDK V2的全局依赖导入和配置逻辑,但V3已经完全摒弃了全局AWS对象的设计,且Lambda运行时默认不再预装V2版本的aws-sdk包,导致找不到模块。同时,代码里的AWS.config.update()配置在V3中完全无效,属于冗余代码。
解决方案
1. 删除V2 SDK的导入语句
直接移除第一行const AWS = require("aws-sdk");,V3采用独立服务客户端导入模式,你已经通过const { Connect } = require("@aws-sdk/client-connect");导入了所需的客户端,无需全局AWS对象。
2. 移除全局配置代码块
删除整个AWS.config.update()代码段,V3不支持全局配置,所有客户端配置都需要直接传递给对应的服务实例(你的Connect客户端已经单独配置了httpOptions)。
3. 清理Connect客户端的冗余参数
移除Connect构造函数中的apiVersion: "2017-08-08",V3客户端默认使用最新API版本,该参数已被废弃。
4. 确保依赖包正确打包部署
Lambda运行时不预装AWS SDK V3的客户端包,需要手动安装依赖并打包:
npm install @aws-sdk/client-connect proxy-agent --save
将node_modules目录与代码一起打包上传到Lambda。
修正后的完整代码
const { Connect } = require("@aws-sdk/client-connect"); const proxy = require("proxy-agent"); const { TIME_FRAME, PROXY_URL } = process.env; const padLeft = (num) => (num < 10 ? `0${num}` : num); const fixMinutes = (num) => Math.floor(num / 5) * 5; const formatDate = (y, mon, d, h, m) => `${y}-${mon}-${d}T${h}:${m}`; const extractDate = () => { const now = new Date(); const minute = fixMinutes(now.getMinutes()); return { year: now.getFullYear(), month: padLeft(now.getMonth() + 1), day: padLeft(now.getDate()), hour: padLeft(now.getHours()), minute: padLeft(minute), }; }; exports.handler = async (event, context, callback) => { const { ARN } = event["Details"]["ContactData"]["Queue"]; const cleanedIds = ARN.split("instance/")[1].split("/queue/"); const InstanceId = cleanedIds[0]; const QueueId = cleanedIds[1]; const connect = new Connect({ httpOptions: { agent: proxy(PROXY_URL), }, }); const { year, month, day, hour, minute } = extractDate(); const formattedEndDateTime = formatDate(year, month, day, hour, minute); const formattedStartDateTime = formatDate(year, month, day, hour, "00"); const EndTime = new Date(formattedEndDateTime); const StartTime = new Date(formattedStartDateTime); StartTime.setMinutes(minute - TIME_FRAME); const params = { EndTime, StartTime, InstanceId, MaxResults: 10, Filters: { Channels: ["VOICE"], Queues: [QueueId], }, HistoricalMetrics: [ { Name: "QUEUE_ANSWER_TIME", Statistic: "AVG", Unit: "SECONDS", }, ], }; const { MetricResults } = await connect.getMetricData(params); const { Collections } = MetricResults[0]; let waitTime = 15; if (Collections.length !== 0) { waitTime = Math.ceil(Collections[0].Value / 60); } return callback(null, { waitTime }); };
内容的提问来源于stack exchange,提问作者FrontPageRob
相关产品推荐
相关产品推荐

