关于 groovy:\\’Permission Denied\\’ 在从 Grails 获取 S3 上的图像时

'Permission Denied' when getting images on S3 from Grails

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

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

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

1
2
3
4
5
6
7
 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)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
    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 存储桶的权限设置为尽可能开放。我使用了"添加更多权限"按钮并添加了所有可能的选项。

这是我的存储桶策略:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"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 配置:

1
2
3
4
5
6
7
8
<CORSConfiguration>
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
 </CORSConfiguration>

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


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

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

但是如果你真的因为某种原因在本地需要这个文件,你应该在 /tmp

有写权限