我正在开发一个AngularJS(前端)+ Rails API(后端)网站。我使用Amazon S3存储图像。
我可以使用aws sdk将图像从Rails上传到S3。我看到我的S3中的图像失效了。但是,当我稍后从AngularJS视图尝试获取它时,我的GET请求获得Forbidden:Access denied错误。我猜这个问题与桶或图像对象权限有关,但我无法弄清楚是什么。
这是我上传图片的摘要:
AWS.config(
:access_key_id => 'access-key',
:secret_access_key => 'secret-key',
:s3_endpoint => 's3-eu-west-1.amazonaws.com'
)
key = 'key_path_in_bucket'
# Image is stored in S3
s3 = AWS::S3.new
puts "S3=" + s3.inspect
bucket = s3.buckets[bucketName]
obj = bucket.objects[key]
puts "obj=" + obj.inspect
obj.write(photo)
注意:我没有在上传请求中使用任何权限(当我在S3中检查图像时,我在属性中看到没有设置任何权限。)
这是我的保管政策:
{
"Version": "2008-10-17",
"Id": "Policy1399551968880",
"Statement": [
{
"Sid": "Stmt1399551891404",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::yanpy.dev/*"
},
{
"Sid": "Stmt1399551962551",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::yanpy.dev/*"
}
]
}
这是我的GET请求:
Remote Address:178.236.7.33:80
Request URL:http://yanpy.dev.s3.amazonaws.com/img/boats/6/52.jpg
Request Method:GET
Status Code:403 Forbidden
Request Headersview source
Accept:image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8,es;q=0.6
Connection:keep-alive
Host:yanpy.dev.s3.amazonaws.com
Referer:http://localhost:1234/app/index.html
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.132 Safari/537.36
Response Headersview source
Content-Type:application/xml
Date:Thu, 08 May 2014 15:04:42 GMT
Server:AmazonS3
Transfer-Encoding:chunked
x-amz-id-2:8QWnbecCc4nXd8+0zDxkqcECs+Sqkh8eBqq/FAWcy62mBRvK3VoCUbcBMywwCcyr
x-amz-request-id:A7D2E1F80F3F0612
以防万一有用,当我手动在桶中创建对象时,我也可以将其设置为公共(使用make公共菜单)。但是,当我从aws sdk API上传图像时,我无法做到(由于错误,我得到以下对象未公开)。
答案 0 :(得分:1)
确保您设置此政策并尝试从浏览器访问您的图片:
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "AllowPublicRead",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::yanpy.dev/*"
}
]
}
当这个工作时设置这个CORS配置并尝试从Angular:
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
答案 1 :(得分:0)
我终于修好了。
问题是我有两个不同的AWS账户。正如我的存储桶策略(上文)中所定义的那样,到目前为止,我授予每个人读写权限。因此,当我上传图像时,我使用的是第一个用户的密钥凭据。我能够上传。但是,我无法打开文件,因为我使用的是第二个用户的S3 AWS账户。
我刚刚更改了密钥凭据,一切都运行良好。