首页 > 解决方案 > (Permission denied)] 将文件上传到 Amazon S3 时发生

问题描述

我正在尝试将文件上传到 Amazon S3。它在我的本地运行良好,但是在部署在 Elastic Beanstalk 中时出现权限被拒绝错误。

我的代码:

public String uploadFileToS3BucketTemp(ByteArrayOutputStream baos, boolean enablePublicReadAccess, String filename, String path) 
    {
        LocalDateTime localDate = LocalDateTime.now();
        String currentDateTime = CommonFunctions.customDateFormatter(CommonFunctions.getCurrentDateTime(), "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd");

        Date date = new Date();
        //Pattern for showing milliseconds in the time "SSS"
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
        String str = sdf.format(date);
        
        String time = str.split("\\s")[1].split("\\.")[0];
        String currentTime =  time.replaceAll(":", "-");
        String fileName = filename+"-"+currentDateTime+"-"+ currentTime +".xls";
        String filePath = "";

        try {

            File file = new File(filePath+fileName);
        
            FileOutputStream fos = new FileOutputStream(file);

            baos.writeTo(fos);
            fos.close();
            
            InputStream is=new FileInputStream(file);
            
            
            s3Client.putObject(new PutObjectRequest(bucketName, path+"/"+fileName, is, new ObjectMetadata()));
            
        } catch (IOException | AmazonServiceException ex) {
            logger.error("error [" + ex.getMessage() + "] occurred while uploading [" + fileName + "] ");
        }
        
        String url = signedUrl(path+"/"+fileName);
        
        return url;
    }

在检查服务器日志时,它向我显示以下错误:

ERROR 25491 (Permission denied)] occurred while uploading

存储桶不是公开的。ElasticBeantsalk 具有具有 AmazonS3FullAccess 权限的 IAM 角色

标签: javaamazon-web-servicesspring-bootamazon-s3

解决方案


我在 Elastic Beanstalk 中部署时收到权限被拒绝错误。”

您可以参考 AWS 示例,这些示例描述了如何使用使用 Java 编写的 Web 应用程序将给定文件从桌面上传到 Amazon S3 存储桶。由于使用了 Java(Spring BOOT 应用程序),因此您可以使用 AWS SDK for Java V2。

使用适用于 Java 的 AWS 开发工具包创建示例 AWS 照片分析器应用程序

在此示例中,请注意应用程序已部署到 Elastic Beanstalk。Amazon S3 服务客户端的创建方式如下:

 S3Client s3 = S3Client.builder()
            .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
            .region(region)
            .build();

在 Elastic Beanstalk 上,您可以通过定义以下变量将您的凭据设置为具有 Amazon S3 权限的 IAM 角色:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

现在,您可以使用 S3 服务客户端使用以下 Java 逻辑将文件放入 Amazon S3 存储桶:

// Places an image into a S3 bucket.
public String putObject(byte[] data, String bucketName, String objectKey) {

    s3 = getClient();

    try {
        PutObjectResponse response = s3.putObject(PutObjectRequest.builder()
                        .bucket(bucketName)
                        .key(objectKey)
                        .build(),
                RequestBody.fromBytes(data));

        return response.eTag();

    } catch (S3Exception e) {
        System.err.println(e.getMessage());
        System.exit(1);
    }
    return "";
}

推荐阅读