NodeJS调用Amazon S3 getObject()返回Access Denied访问被拒求助
AWS S3 AccessDenied 问题排查方案
- 第一,验证环境变量配置正确性
确认process.env.AWS_ACCESS_KEY_ID、process.env.AWS_SECRET_ACCESS_KEY对应的是你配置了权限的IAM用户的有效密钥,没有多余空格、复制遗漏;同时确认process.env.AWS_BUCKET_REGION和S3桶实际所在的区域完全一致,区域不匹配也会触发访问拒绝错误。 - 第二,补全可能缺失的IAM权限
如果你的S3桶开启了默认KMS加密,你需要在当前IAM策略的Action数组中新增kms:Decrypt权限,资源字段配置你使用的KMS密钥的ARN;如果后续需要列取桶内对象等操作,还需要补充s3:ListBucket权限,资源配置为桶的根ARNarn:aws:s3:::atlasfitness-progress-s3。 - 第三,检查文件Key的正确性
AWS S3为了避免对象存在性泄露,当你请求的文件Key不存在时也可能返回AccessDenied错误而非404。确认你调用getFileS3传入的fileKey和对象实际存储的Key完全一致,没有多写/漏写前缀、大小写错误、特殊字符未正确编码的情况。 - 第四,检查桶级别的权限配置
查看S3桶本身的桶策略,有没有规则会拒绝当前IAM用户的访问请求;同时确认桶的「阻止公共访问」设置没有覆盖你的IAM授权规则(签名访问场景正常不受该配置影响,可作为兜底排查项)。 - 第五,调整SDK配置
部分AWS区域要求使用v4版本签名,你可以在初始化S3实例时补充签名版本配置:const s3 = new AWS.S3({ region: process.env.AWS_BUCKET_REGION, accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, signatureVersion: 'v4' })
快速验证方法
你可以在本地安装AWS CLI,配置和代码相同的密钥、区域,执行命令aws s3 cp s3://atlasfitness-progress-s3/[你的实际文件Key] ./test,如果CLI可以正常下载,说明权限配置没问题,问题出在代码参数层面;如果CLI也报同样的错误,直接排查权限、桶配置即可。
内容的提问来源于stack exchange,提问作者Gonsa02
相关产品推荐
相关产品推荐

