AWS Lambda+TypeScript出现502错误及TypeError问题排查求助
问题分析与解决方案
问题概述
通过API Gateway调用Lambda时返回502 Bad Gateway,Lambda日志抛出如下错误:
{ "errorType": "TypeError", "errorMessage": "Object.defineProperty called on non-object", "stack": [ "TypeError: Object.defineProperty called on non-object", " at defineProperty (<anonymous>)", " at __name (/var/task/index.js:24690:37)", " at <static_initializer> (/var/task/index.js:24816:9)", " at node_modules/@aws-sdk/lib-dynamodb/dist-cjs/index.js (/var/task/index.js:24814:82)", " at __require (/var/task/index.js:10:50)", " at Object.<anonymous> (/var/task/index.js:44040:35)", " at Module._compile (node:internal/modules/cjs/loader:1364:14)", " at Module._extensions..js (node:internal/modules/cjs/loader:1422:10)", " at Module.load (node:internal/modules/cjs/loader:1203:32)", " at Module._load (node:internal/modules/cjs/loader:1019:12)" ] }
项目无代码变更,但数日前运行正常,Lambda使用Node.js 18环境。
可能原因
- AWS SDK v3版本混杂:项目中
@aws-sdk系列包版本差异过大(如@aws-sdk/client-dynamodb为3.637.0,@aws-sdk/client-lambda为3.698.0,@aws-sdk/client-scheduler低至3.350.0)。AWS SDK v3的子包需保持版本一致,否则内部API不兼容,会导致初始化阶段调用Object.defineProperty时传入非对象值触发错误。 - CDK版本冲突:同时使用CDK v1的
@aws-cdk/aws-iam(1.202.0)和CDK v2的aws-cdk-lib(2.76.0),两类版本的依赖会产生冲突,间接影响Lambda运行时的依赖加载。 - Lambda运行时小版本更新:AWS可能对Node.js 18运行时推送了补丁更新,旧版本SDK与新运行时环境不兼容,导致初始化报错。
- 依赖包缓存损坏:部署时的
node_modules缓存或package-lock.json文件损坏,导致SDK包文件缺失或结构异常。
解决方案
统一AWS SDK v3版本
修改package.json中所有@aws-sdk开头的依赖,将版本统一为同一稳定版(建议使用最新兼容版,如3.699.0),示例:"@aws-sdk/client-dynamodb": "^3.699.0", "@aws-sdk/client-lambda": "^3.699.0", "@aws-sdk/client-s3": "^3.699.0", "@aws-sdk/client-scheduler": "^3.699.0", "@aws-sdk/client-secrets-manager": "^3.699.0", "@aws-sdk/client-sqs": "^3.699.0", "@aws-sdk/lib-dynamodb": "^3.699.0", "@aws-sdk/protocol-http": "^3.699.0", "@aws-sdk/s3-request-presigner": "^3.699.0", "@aws-sdk/util-create-request": "^3.699.0"执行
rm -rf node_modules package-lock.json清理缓存,再npm install重新安装依赖后重新部署。移除CDK v1依赖
替换CDK v1的@aws-cdk/aws-iam和@aws-cdk/aws-lambda-event-sources为CDK v2对应模块:@aws-cdk/aws-iam→aws-cdk-lib.aws_iam@aws-cdk/aws-lambda-event-sources→aws-cdk-lib.aws_lambda_event_sources
删除package.json中的CDK v1依赖,重新安装部署。
验证并适配Lambda运行时
查看Lambda控制台中Node.js 18的具体小版本,若近期有更新,可尝试:- 将SDK升级至适配该运行时的最新版本
- 若AWS支持回退,暂时回退到之前的运行时小版本测试
清理部署缓存
部署Lambda时,确保使用全新的部署包,避免依赖缓存问题。若使用CDK部署,可执行cdk clean清理部署缓存后重新部署。
内容的提问来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

