AWS S3 Java SDK-访问被拒绝

AWS S3 Java SDK-访问被拒绝,java,amazon-web-services,amazon-s3,Java,Amazon Web Services,Amazon S3,我试图使用AWS SDK访问一个bucket及其所有对象,但在运行代码时,我在线程“main”中得到一个异常错误,即异常:com.amazonaws.services.s3.model.AmazonS3Exception:access Denied(服务:Amazon s3;状态代码:403;错误代码:AccessDenied;请求ID:X),s3扩展请求ID:Y= 尽管我已获得以下所有权限,但请告知我缺少的位置以及发生拒绝访问错误的原因: s3:GetObject s3:GetObjectVe

我试图使用AWS SDK访问一个bucket及其所有对象,但在运行代码时,我在线程“main”中得到一个异常错误,即异常:com.amazonaws.services.s3.model.AmazonS3Exception:access Denied(服务:Amazon s3;状态代码:403;错误代码:AccessDenied;请求ID:X),s3扩展请求ID:Y=

尽管我已获得以下所有权限,但请告知我缺少的位置以及发生拒绝访问错误的原因:

s3:GetObject
s3:GetObjectVersion
s3:GetObjectAcl
s3:GetBucketAcl
s3:GetBucketCORS
s3:GetBucketLocation
s3:GetBucketLogging
s3:ListBucket
s3:ListBucketVersions
s3:ListBucketMultipartUploads
s3:GetObjectTorrent
s3:GetObjectVersionAcl
代码如下:

AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProtocol(Protocol.HTTP);
AmazonS3 conn = new AmazonS3Client(credentials, clientConfig);
conn.setEndpoint(bucketName);
Bucket bucket = conn.createBucket(bucketName);
ObjectListing objects = conn.listObjects(bucket.getName());
do {
    for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) {
            System.out.println(objectSummary.getKey() + "\t" +
                    objectSummary.getSize() + "\t" +
                    StringUtils.fromDate(objectSummary.getLastModified()));
    }
    objects = conn.listNextBatchOfObjects(objects);
} while (objects.isTruncated());

转到IAM,检查用于API的用户[Access Key&Secret Key]是否具有使用基于S3的API的权限

将S3策略附加到指定用户-尝试使用S3完全访问权限;一旦这起作用,您可以对访问进行细化。
有关更多信息,请查看此链接[]

问题现已解决。该准则存在以下问题:

  • 终点不正确,应该有一个正确的终点
  • 没有给予该桶足够的权限。在AWS SDK中使用bucket之前,应获取完整权限列表
  • 下面是正确的代码

    AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
    ClientConfiguration clientConfig = new ClientConfiguration();
    clientConfig.setProtocol(Protocol.HTTP);
    AmazonS3 conn = new AmazonS3Client(credentials, clientConfig);
    conn.setEndpoint("correct end point");
    Bucket bucket = conn.createBucket(bucketName);
    ObjectListing objects = conn.listObjects(bucket.getName());
    do {
        for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) {
                System.out.println(objectSummary.getKey() + "\t" +
                        objectSummary.getSize() + "\t" +
                        StringUtils.fromDate(objectSummary.getLastModified()));
        }
        objects = conn.listNextBatchOfObjects(objects);
    } while (objects.isTruncated());
    

    在bucket的权限选项卡中,我取消选中:

    • 管理此存储桶的公共访问控制列表(ACL)
    • 阻止新的公共ACL并上载公共对象(推荐)

    问题消失了。

    如果即使在设置了正确的IAM策略并检查了bucket/path之后仍然看到错误,请检查apache http客户端依赖关系。ApacheHTTP客户端4.5.5工作正常,而4.5.7及以上版本由于一些奇怪的原因(没有正确编码文件夹路径分隔符)失败。在这种情况下,必须将apache http客户端版本显式设置为4.5.5。。或者至少有其他版本可以使用。

    我遇到了同样的异常,我就是这样修复的


    S3 bucket对象使用服务端KMS加密。我必须将app/lambda角色作为用户添加到加密密钥中。

    我可以使用dragon disk和s3浏览器连接同一个存储桶,但不能通过代码连接。您是否可以重新检查代码和dragon disk是否使用相同的[Access key,Secret key]对?同时检查桶策略和桶所有者;因为。它们起着非常重要的作用,尤其是在拒绝访问的情况下。您好,谢谢,现在我可以工作了。事实上,问题是我没有完整的bucket权限列表,现在我已经获得了AWS SDK的所有权限,并且工作正常。您好,我为每个人都添加了权限,似乎都在工作。很抱歉,我提出了这篇旧文章,但仍然不明白为什么它在S3浏览器中工作,但在AWS SDK中不工作?你能解释一下代码中出现问题的确切原因吗。如果你做的一切都正确,它应该可以正常工作。我可以使用S3浏览器或CyberDuck访问bucket中的文件夹,但当我使用aws sdk php列出带有前缀的键时,我会得到未捕获的aws\S3\Exception\AccessDeniedException:aws错误代码:AccessDenied,状态代码:403您能否确保以下两点:1.您使用的端点是正确的,应该有一个正确的端点。2.对于特定类型的操作,铲斗有足够的权限。在AWS SDK中使用bucket之前,应获取完整权限列表。感谢您,它是获取密钥列表的端点。我遗漏了前缀的尾随斜杠,也有加密问题。bucket策略需要服务器端加密,我在上传时没有指定。