使用@aws-sdk/client-s3的PutObjectCommand时遇AccessDenied错误求助
S3上传AccessDenied问题排查
两周前可正常通过构建后脚本上传文件至S3存储桶,近期突然出现AccessDenied错误。已生成新的Access Key并确认密钥无误;所用IAM用户配置了Full S3访问权限且多次核对;通过AWS S3 GUI可正常上传文件,但使用Node.js的@aws-sdk/client-s3调用时触发报错,区域和存储桶名称均确认正确,报错发生在s3Client.send()方法处。
代码示例
const { S3Client, PutObjectCommand } = require("@aws-sdk/client-s3"); const REGION = "us-east-1"; const bucket_name = 'bucket_name'; const access_key = process.env.AWS_ACCESS_KEY_ID; const access_secret = process.env.AWS_SECRET_ACCESS_KEY; const s3Client = new S3Client({ credentials: { accessKeyId: access_key, secretAccessKey: access_secret }, region: REGION }); const data = await s3Client.send(new PutObjectCommand({ Bucket: bucket_name, Key: "test.txt", Body: "hello" }) );
错误信息
AccessDenied: Access Denied ... { '$fault': 'client', '$metadata': { httpStatusCode: 403, requestId: '...', extendedRequestId: '...', cfId: undefined, attempts: 1, totalRetryDelay: 0 }, Code: 'AccessDenied', RequestId: '...', HostId: '...' }
排查解决步骤
- 验证环境变量加载情况:在代码中添加
console.log(access_key, access_secret),确认变量值不为undefined或空字符串,排查构建环境的变量注入是否异常。 - 用AWS CLI测试权限:使用同一组Access Key执行
aws s3 cp test.txt s3://bucket_name/test.txt,若CLI也报错,说明IAM权限可能存在隐藏限制(如权限边界、组织策略);若CLI执行成功,问题则集中在Node.js代码配置。 - 检查S3桶策略:查看存储桶的桶策略配置,确认没有拒绝该IAM用户
PutObject操作的规则,桶策略优先级高于IAM用户权限。 - 确认MFA状态:若IAM用户近期启用了MFA,代码中未提供MFA令牌会导致权限拒绝,需检查用户的MFA配置。
- 更新SDK版本:执行
npm install @aws-sdk/client-s3@latest更新至最新版本,排除旧版本SDK的签名算法兼容性问题。 - 排查网络环境:在本地运行代码测试,排除代理、防火墙等网络因素导致的请求签名验证失败。
内容的提问来源于stack exchange,提问作者Wolfian TR
相关产品推荐
相关产品推荐

