在EC2实例上上传文件至S3时出现权限被拒绝的错误

4
在我的应用中,用户可以上传他们的照片到S3存储,然后我会将返回的URL持久化到数据库中。
我遇到的问题是,在将应用部署到弹性 Beanstalk 环境时,由于在 catalina.out 日志中发现的错误,我无法再将照片存储到 S3 存储中。
java.io.IOException: Permission denied
    at java.io.UnixFileSystem.createFileExclusively(Native Method)
    at java.io.File.createNewFile(File.java:1012)
    at com.common.util.file.FileUtil.convert(FileUtil.java:17)

如何设置权限以便我能够修复这个 bug?
[编辑] 当我在本地主机上运行应用程序时,我将能够将文件上传到 S3 存储桶中。我使用此链接中的示例代码作为上传文件的实现模板。
以下是我用来将多部分文件转换为文件的代码:
public File convert(MultipartFile file) throws IOException {
    File convFile = new File(file.getOriginalFilename());
    convFile.createNewFile();                               // Cause IOException
    FileOutputStream fos = new FileOutputStream(convFile);
    fos.write(file.getBytes());
    fos.close();
    return convFile;
}

弹性 Beanstalk 应用程序运行在没有持久本地存储的 Amazon EC2 实例上。您应该直接将文件写入 S3。 - jarmod
感谢您的回复。由于我缺乏经验,我不确定是否直接将文件写入S3。我已经编辑了帖子,并提供了更多关于我的情况的细节。 - dkn
如果您已经有文件,则可以查看AWS S3 SDK以获取可用于将文件上传到S3的方法,例如http://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpJava.html。关于您刚添加的代码,您试图在哪里创建新文件?您是否实际上有权限在该位置创建文件? - jarmod
你找到解决这个问题的方法了吗?我尝试将多部分文件转换为流并上传到S3,但是这并没有起作用,并且上传的文件存在问题。 - bhavs
2个回答

2

在您的应用程序中,请勿附加aws凭据。创建一个IAM角色,该角色应具有AWS S3的权限。在使用Elastic Beanstalk启动应用程序时,将此IAM角色附加到EC2实例。

您的应用程序使用IAM角色来验证AWS S3以上传图像。最佳做法是通过AutoScaling组或Elastic Beanstalk或直接从EC2仪表板附加具有特定许可的IAM角色以启动EC2实例。


1

你提供的示例代码链接使用了ProfileCredentialsProvider,它从默认配置文件中为默认配置文件提供AWSCredentials(查看更多)。

你需要做以下两件事情之一:(1)将配置文件从本地机器复制到EC2实例上,或者(2)使用其他方法向SDK提供AWS凭证。例如,请参阅使用AWS凭证工作


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接