You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Java无法删除Amazon S3对象?排查Access Denied错误

问题:Amazon S3 删除前缀文件夹下对象时出现 Access Denied 403 异常

我尝试基于前缀文件夹列出Amazon S3对象并逐个删除,代码如下:

AWSCredentials awsCredentials = new BasicAWSCredentials("accesskey", "secretkey"); 
AmazonS3 s3client = new AmazonS3Client(awsCredentials); 
ListObjectsRequest listObjectsRequest = new ListObjectsRequest("bucketname","folder",null,"/",1000); 
s3client 
    .listObjects(listObjectsRequest) 
    .getObjectSummaries() 
    .forEach( (file) -> { 
        DeleteObjectRequest deleteRequest = new DeleteObjectRequest("bucketname", file.getKey()); 
        s3client.deleteObject(deleteRequest); 
    }); 

但出现以下异常:

com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied;

at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513) 
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4187) 
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4134) 
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4128) 
at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:839) 

我使用的密钥有效,可执行getObject()等其他操作,请问问题出在哪里?


可能的原因及解决方案

看起来你遇到的是S3权限配置的典型问题——虽然你的密钥能执行读取类操作,但删除对象需要额外的权限支持,我整理了几个最可能的原因和对应的解决办法:

  • IAM用户缺少必要权限:
    你的IAM用户拥有getObject权限,但删除操作需要明确的s3:DeleteObject权限,同时列出对象还需要s3:ListBucket权限(因为listObjects本质是读取桶内对象列表)。建议检查你的IAM策略,确保包含这两个权限,且资源范围覆盖目标桶和前缀路径。比如一个合适的策略示例:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:DeleteObject",
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::bucketname",
                    "arn:aws:s3:::bucketname/folder/*"
                ]
            }
        ]
    }
    

    如果你的存储桶开启了版本化,还需要添加s3:DeleteObjectVersion权限,否则删除版本化对象也会触发403错误。

  • 桶策略限制了删除操作:
    除了IAM用户的权限,S3桶本身的桶策略可能存在拒绝删除的规则,或者没有明确允许你的IAM用户执行删除操作。可以到S3控制台的桶权限页面检查桶策略,确保没有Deny语句拦截s3:DeleteObject,同时确认有对应的Allow规则。

  • 过时API的潜在兼容性问题:
    你代码中使用的listObjects方法已经被AWS标记为过时,建议改用listObjectsV2方法,它不仅更可靠,还能避免一些旧API的潜在兼容性问题。不过这通常不是403的直接原因,但更新到推荐的API是长期的最佳实践。

  • 权限边界或临时凭证限制:
    如果你的密钥是临时凭证(比如来自STS服务),或者IAM用户设置了权限边界,需要确认这些限制是否允许执行s3:DeleteObject操作。权限边界会限制用户能拥有的最大权限,即使IAM策略允许,边界拒绝的话也会触发403。

内容的提问来源于stack exchange,提问作者thaveethu gce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:30:06