2

我有一个 grails 2.1.1 应用程序正在访问存储在 s3 上的存储桶中的图像,我正在使用 Grails-AWS 插件访问它。

当我使用“grails run-app”并且服务器是 localhost:8080/myApp 时,一切正常。我可以毫无问题地放置和获取文件。

但是,当我将 war 文件部署到 Amazon Elastic Beanstalk 时,尝试获取图像时出现以下错误:

 java.io.FileNotFoundException: 90916.png (Permission denied)

at java.io.FileOutputStream.<init>(FileOutputStream.java:209)

at java.io.FileOutputStream.<init>(FileOutputStream.java:160)

at com.sommelier.domain.core.MyDomainObject.getPicture(MyDomainObject.groovy:145)

这是我获取引发错误的图像的代码:

    File getPicture() {

    def url = aws.s3().on("mybucket").url(image, "myfoldername")

    File imageFile = new File(image)
    def fileOutputStream = new FileOutputStream(imageFile)
    def out = new BufferedOutputStream(fileOutputStream)
    out << new URL(url).openStream()
    out.close()

    return imageFile        

}

我已将我的 s3 存储桶的权限设置为尽可能开放。我使用了“添加更多权限”按钮并添加了所有可能的选项。

这是我的存储桶策略:

{
"Version": "2008-10-17",
"Id": "Policy1355414697022",
"Statement": [
    {
        "Sid": "AllowPublicRead",
        "Effect": "Allow",
        "Principal": {
            "AWS": "*"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::mybucket/*"
    },
    {
        "Sid": "",
        "Effect": "Allow",
        "Principal": {
            "AWS": "*"
        },
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::mybucket/*"
    }
]
 }

还有我的 CORS 配置:

<CORSConfiguration>
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
 </CORSConfiguration>

有什么想法吗?这是 S3 权限问题,还是有其他问题?

4

1 回答 1

1

您似乎正在尝试创建没有写权限的文件。

最好不要将副本保存到应用服务器。如果可以,我建议您从内存中的对象返回操作/内容/任何内容。

但是,如果您确实出于某种原因在本地确实需要该文件,则应该在 /tmp 中具有写权限

于 2012-12-26T08:18:21.897 回答