【问题标题】:AWS S3 Java SDK - Access DeniedAWS S3 Java SDK - 拒绝访问
【发布时间】:2014-06-10 11:02:04
【问题描述】:

我正在尝试使用 AWS 开发工具包访问存储桶及其所有对象,但在运行代码时,我在线程“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());

【问题讨论】:

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


    【解决方案1】:

    去 IAM 并检查正在用于 API 的用户 [Access Key & Secret Key] 是否有使用 S3 Based API 的特权。

    将 S3 策略附加到指定用户 - 尝试使用 S3 完全访问权限;一旦成功,您就可以细化访问权限。 欲了解更多信息,请查看此链接 [Managing IAM Policies]

    【讨论】:

    • 您好,可以使用dragon disk和s3浏览器连接同一个bucket,但不是通过代码。
    • 你能重新检查一下你是否为代码和龙盘使用了相同的[访问密钥,秘密密钥]对吗?还要检查存储桶策略和存储桶所有者;因为。它们起着非常重要的作用,尤其是在访问被拒绝的情况下。
    • 嗨,谢谢,现在我可以工作了,实际上问题是我没有存储桶的完整权限列表,现在我已经获得了 AWS SDK 的所有权限,并且工作正常。跨度>
    • 嗨,我已经为每个人添加了权限,并且似乎工作正常。
    • 我和root用户有同样的问题,我认为root用户默认拥有所有访问权限
    【解决方案2】:

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

    1. 终点不正确,应该有正确的终点。
    2. 没有为存储桶提供足够的权限。在使用 AWS SDK 中的存储桶之前,应获取完整权限列表。

    下面是正确的代码

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

    【讨论】:

    • 抱歉提出旧帖子,但仍然不明白为什么它适用于 S3 浏览器但不适用于 AWS SDK?
    • 你能解释一下你的代码出现的问题的确切点吗?如果您已正确完成所有操作,它应该可以正常工作。
    • 我可以使用 S3 Browser 或 Cyber​​Duck 访问存储桶内的文件夹,但是当我使用 aws sdk php 列出带有前缀的键时,我得到 Uncaught Aws\S3\Exception\AccessDeniedException: AWS Error Code: AccessDenied,状态码:403
    • 您能否确定以下两点: 1.您使用的端点是正确的,应该有一个正确的端点。 2.对于特定类型的操作,桶有足够的权限。在使用 AWS SDK 中的存储桶之前,应获取完整权限列表。
    • 谢谢 这是获取密钥列表的端点。 s3.amazonaws.com/bucket/?prefix=myfolder/&delimiter=我错过了前缀的尾部斜杠
    【解决方案3】:

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

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

    【讨论】:

    • 我也遇到了加密问题。存储桶策略需要服务器端加密,我在上传时没有指定。
    【解决方案4】:

    在存储桶的权限选项卡中,我取消选中:

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

    问题就解决了。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:
        // This is save s3 buket image  code   
        
        
        
        
            byte imageBytes[] = request.getThumbnail().readAllBytes();  
        
            InputStream inputStream = new ByteArrayInputStream(imageBytes);
        
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(imageBytes.length);
            metadata.setContentType("image/png");
            String image = String.valueOf(System.currentTimeMillis());
            
            // String image=String.valueOf(System.getProperty(String.valueOf(inputRequest)));
            // String image=String.valueOf(System.getProperty(String.valueOf(inputRequest)));
        
            String key = "image/" + image;
        
            s3.putObject(new PutObjectRequest(bucketName, key, inputStream, metadata)
              .withCannedAcl(CannedAccessControlList.Private));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-24
          • 2021-11-06
          • 1970-01-01
          • 2020-09-30
          • 1970-01-01
          • 2016-12-21
          • 1970-01-01
          • 2018-08-21
          相关资源
          最近更新 更多