AWS S3 Java SDK - 拒绝访问

时间:2014-06-10 11:02:05

标签: java amazon-web-services amazon-s3

我正在尝试使用AWS SDK访问存储桶及其所有对象,但在运行代码时,我收到错误,如线程中的异常" main" com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: X), S3 Extended Request 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());

5 个答案:

答案 0 :(得分:23)

转到IAM并检查用户是否[访问密钥&正在使用的秘密密钥具有使用基于S3的API的优点。

将S3策略附加到指定用户 - 尝试 S3完全访问;一旦工作,你可以细化访问。 更多信息请查看此链接[Managing IAM Policies]

答案 1 :(得分:7)

问题现在解决了。代码存在以下问题:

  1. 结束点不正确,应该有一个正确的终点。
  2. 没有给予桶足够的许可。在AWS SDK中使用存储桶之前,应该先获得完整权限列表。
  3. 以下是正确的代码

    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());
    

答案 2 :(得分:1)

我遇到了同样的异常,这就是我修复它的方式。

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

答案 3 :(得分:0)

在存储桶的权限标签中,我取消选中:

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

问题就解决了。

答案 4 :(得分:0)

如果即使在设置正确的IAM策略并检查存储桶/路径后仍然看到错误,请检查apache http客户端依赖性。 apache http客户端4.5.5可以正常工作,而4.5.7和更高版本由于某种奇怪的原因而失败(未正确编码文件夹路径分隔符)。在这种情况下,您必须将apache http客户端版本显式设置为4.5.5。或者至少可以使用其他版本。