Node.js使用aws-sdk可上传S3但删除报AccessDenied如何修复?
问题现象
Node.js环境下使用aws-sdk操作S3存储桶时,文件上传功能正常,但对象删除操作抛出403 AccessDenied错误,该删除功能5分钟前可正常运行。当前使用的IAM用户已配置S3全量访问权限。
错误核心日志:
err AccessDenied: Access Denied code: 'AccessDenied', region: null, statusCode: 403, retryable: false
排查方向与修复方案
按故障触发概率从高到低排序:
- 凭证身份与上层权限拦截排查
日志中region: null说明SDK客户端配置加载存在异常,首先不要直接信任控制台看到的IAM用户权限,先在代码中调用sts.getCallerIdentity()打印当前SDK实际使用的身份ARN、账号信息,确认代码没有通过环境变量、本地凭证文件、实例角色等默认凭证链加载到其他无权限的身份。
确认身份一致后,排查上层权限拦截:- 如果使用临时凭证(AssumeRole、实例角色、Lambda角色等),检查会话策略、角色权限边界是否存在
s3:DeleteObject的显式拒绝 - 如果账号属于AWS组织,检查最近5分钟是否有新的SCP(服务控制策略)下发,拦截了S3删除操作
- 点进IAM用户绑定的所谓“S3全量访问”策略查看JSON内容,确认不存在
NotAction: s3:DeleteObject、资源范围只配置桶ARN未配置桶ARN/*这类配置错误
- 如果使用临时凭证(AssumeRole、实例角色、Lambda角色等),检查会话策略、角色权限边界是否存在
- S3桶侧配置变更排查(突发故障最高概率原因)
由于故障是无代码改动下突发的,优先检查最近5分钟桶侧的配置改动:- 检查桶策略:是否新增了针对当前身份、当前请求来源IP/VPC的
s3:DeleteObject显式Deny规则,S3权限判定中显式Deny优先级高于所有允许规则,哪怕IAM给了全权限也会被拦截 - 检查MFA Delete配置:是否刚开启了MFA Delete,开启后所有永久删除版本化对象的操作必须携带有效MFA验证码,上传操作不受影响,完全匹配“能上传不能删”的现象
- 检查Object Lock配置:是否刚开启了桶级Object Lock默认保留期,或目标对象被加了Legal Hold(合法保留),合规模式下的保留对象任何身份都无法在保留期内删除,治理模式下需要带绕过保留参数才能删除
- 如果通过访问点(Access Point)访问桶,检查访问点策略是否拦截了删除操作
- 检查桶策略:是否新增了针对当前身份、当前请求来源IP/VPC的
- 请求参数与SDK配置排查
- 初始化S3客户端时明确指定桶所在的正确区域,不要留空,避免跨区重定向导致签名校验失败,示例初始化代码:
const s3 = new AWS.S3({ region: '替换为桶实际所在区域,如ap-northeast-1' }) - 如果桶开启了版本控制,检查删除请求是否正确传入
VersionId参数,若需要绕过治理模式Object Lock,额外传入BypassGovernanceRetention: true - 检查待删除对象的Key是否存在URL编码错误、多余斜杠等参数问题
- 初始化S3客户端时明确指定桶所在的正确区域,不要留空,避免跨区重定向导致签名校验失败,示例初始化代码:
- 对象所有权与加密排查
- 如果待删除对象是其他AWS账号上传,且上传时未授予桶所有者完整权限,桶所有者默认无法直接删除,需要由上传账号授予权限,或使用上传账号身份删除
- 如果对象使用客户管理KMS密钥加密,确认当前身份有密钥的使用权限,避免密钥策略拦截关联操作
内容的提问来源于stack exchange,提问作者Debanjan Tewary
相关产品推荐
相关产品推荐

