使用NodeJs上传对象至S3存储桶报Access Denied错误如何解决
问题根因
Access Denied报错完全由存储桶策略配置错误导致,和你贴的Node.js SDK代码无关,核心问题有两个:
- IAM权限评估逻辑中Deny规则优先级永远最高,你当前配置的第一条Deny规则对
*(所有主体)生效,没有加任何排除条件,等于先把所有用户的所有S3操作全部禁止,后面写的Allow规则根本不会触发。 - 两条规则的
Resource字段只配置了桶本身的ARNarn:aws:s3:::some-random-bucket,没有覆盖桶内对象资源。上传对象属于对象级操作,需要匹配带/*后缀的对象ARN路径,仅配置桶级ARN无法满足上传操作的权限要求。
修复步骤
1. 替换错误的存储桶策略
将原有桶策略替换为以下配置:
{ "Version": "2012-10-17", "Id": "PolicyXXXXXXXXX", "Statement": [ { "Sid": "StmtXXXXXXXXXXXXXX", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::some-random-bucket", "arn:aws:s3:::some-random-bucket/*" ], "Condition": { "StringNotEquals": { "aws:PrincipalArn": "arn:aws:iam::XXXXXXXXXX:user/some-random-user" } } }, { "Sid": "StmtXXXXXXXXXXX", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::XXXXXXXXXX:user/some-random-user" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::some-random-bucket", "arn:aws:s3:::some-random-bucket/*" ] } ] }
配置调整点说明:
- 给全局Deny规则增加Condition判断,仅当访问者不是你授权的指定IAM用户时,才触发拒绝逻辑,避免合法用户被Deny规则拦截
- 两条规则的Resource列表同时加入桶ARN、桶内对象ARN(带
/*后缀),同时覆盖桶级操作、对象级操作的权限匹配要求
2. 仍报错时的排查项
如果替换策略后依然返回Access Denied,逐一核对以下配置:
- 确认SDK初始化时填写的
region和S3桶实际部署区域一致,当前配置为ap-south-1(孟买区域),区域不匹配时也会返回访问类错误 - 检查对应IAM用户绑定的身份策略、权限边界,以及账号所属组织的SCP策略,确认没有其他针对S3操作的Deny规则
- 如果存储桶开启了KMS密钥加密,确认该IAM用户拥有对应KMS密钥的
kms:GenerateDataKey、kms:Encrypt权限,缺少KMS权限时上传操作同样会被拒绝 - 确认存储桶的公网访问拦截配置、VPC端点访问策略没有限制当前请求来源
内容的提问来源于stack exchange,提问作者Karun Agarwal
相关产品推荐
相关产品推荐

