Lambda调用PutObjectCommand报错‘Resolved credential object is not valid’排查
问题分析与解决方案
问题根源
部署到Lambda后触发Resolved credential object is not valid错误,核心原因是代码中凭证配置逻辑存在漏洞:
- 原代码仅判断
process.env.DEVELOPMENT_MODE是否存在,而非明确的真值(比如'true')。如果Lambda环境中该变量被意外设置为空字符串、'false'等非真值但存在的值,会进入凭证配置分支。 - Lambda环境中不存在
AWS_ACCESS_KEY和AWS_SECRET_KEY变量,导致accessKeyId和secretAccessKey被设为undefined,形成无效凭证。
解决方案
1. 修正凭证配置逻辑
将环境变量判断改为严格匹配'true',确保只有本地开发模式才手动配置凭证:
const configuration: S3ClientConfig = { region: 'us-west-2', }; // 仅当DEVELOPMENT_MODE明确为'true'时,才加载本地凭证 if (process.env.DEVELOPMENT_MODE === 'true') { configuration.credentials = { accessKeyId: process.env.AWS_ACCESS_KEY!, secretAccessKey: process.env.AWS_SECRET_KEY!, }; } export const s3 = new S3Client(configuration);
2. 清理Lambda环境变量
确保Lambda的环境变量中未设置DEVELOPMENT_MODE,或设置为'false'等非'true'值,让SDK自动使用Lambda的IAM角色凭证。
3. 验证Lambda角色权限
确认策略中的BUCKET_NAME已替换为实际存储桶名称,否则权限策略不生效:
{ "Action": [ "s3:DeleteObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::你的实际桶名/*" ], "Effect": "Allow" }
补充说明
AWS SDK v3在Lambda环境中会自动通过Lambda的凭证提供者获取临时IAM角色凭证,无需手动配置credentials。只要Lambda角色拥有对应S3操作权限,SDK就能正常完成请求。
内容的提问来源于stack exchange,提问作者cscan
相关产品推荐
相关产品推荐

