拒绝访问(服务:Amazon S3;状态代码:403;错误代码:AccessDenied;请求ID:xxxxxxxxxxxxx)

时间:2016-09-26 11:58:18

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

我正在尝试使用部署在运行在ec2上的tomcat上的应用程序来访问我的s3存储桶。

我可以看到很多与此相关的帖子,但看起来大多数人抱怨没有适当的访问权限。我可以正确访问所有存储桶,我可以使用不同的应用程序(如jenkins s3插件)从其他应用程序上传文件而不会出现任何问题。我无能为力,为什么只有在tomcat上部署的java Web应用程序才会发生这种情况。我已经确认了下面的事情。

  1. ec2实例是使用IAM角色创建的。
  2. IAM角色具有对桶的写入权限。木偶脚本能够写入存储桶。
  3. 尝试使用其他应用程序来检查IAM角色,它可以解决任何问题。
  4. 根据我的理解,如果在创建S3存储桶客户端(AmazonS3Client)时未指定任何凭据,则会将IAM角色身份验证作为默认值。

    这是我编写的用于测试权限的示例函数。

    public boolean checkWritePermission(String bucketName) {
        AmazonS3Client amazonS3Client=new AmazonS3Client();
        LOG.info("Checking bucket write permission.....");
        boolean hasWritePermissions = false;
        final ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentLength(0);
        // Create empty content
        final InputStream emptyContent = new ByteArrayInputStream(new byte[0]);
        // Create a PutObjectRequest with test object
        final PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName,
                "TestDummy.txt", emptyContent, metadata);
        try {
            if (amazonS3Client.putObject(putObjectRequest) != null) {
                LOG.info("Permissions validated!");
                // User has write permissions, TestPassed.
                hasWritePermissions = true;
    
            }
        }
        catch (AmazonClientException s3Ex) {
            LOG.warn("Write permissions not available!", s3Ex.getMessage());
            LOG.error("Write permissions not available!", s3Ex);
        }
        return hasWritePermissions;
    }
    
      

    com.amazonaws.services.s3.model.AmazonS3Exception:拒绝访问(服务:Amazon S3;状态代码:403;错误代码:AccessDenied;请求ID:xxxxxxxxxxxxxx)。

1 个答案:

答案 0 :(得分:1)

不确定您是否已解决此问题;但是,如果您在存储分区上使用自定义KMS密钥,并且您尝试访问的文件已使用该自定义密钥加密,则也会引发此错误。

有时您仍然可以在S3存储桶中列出对象,因此隐藏了此问题。确保您的IAM策略包含kms解密权限。

相关问题