Amazon S3 GET对象访问被拒绝

时间:2014-05-08 16:05:50

标签: ruby-on-rails angularjs amazon-web-services amazon-s3

我正在开发一个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上传图像时,我无法做到(由于错误,我得到以下对象未公开)。

2 个答案:

答案 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账户。

我刚刚更改了密钥凭据,一切都运行良好。