ruby-on-rails - 使用s3cmd工具将403 AccessDenied for Paperclip附件上传到Amazon S3

最近,我使用s3cmd tool将一千多个Paperlclip附件从本地存储移至Amazon S3。您可以找到有关如何完成here的详细信息,但总而言之,我使用以下命令迁移了所有旧附件。

s3cmd sync my-app/public/system/ s3://mybucket 

我更新了代码库,以利用新的S3存储桶,测试了连接,一切正常。实际上,我可以通过我的应用程序将新附件上载到远程S3存储桶,并查看/下载它们没有问题。但是,似乎Paperclip和S3彼此之间并不同步,如果我尝试通过我的设备访问它们,所有移到s3存储桶的附件(在下图中模糊显示)都返回403s。应用。但是,将新附件上传到同一存储桶中就可以了。

我有一个具有以下配置的IAM组设置:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::mybucket/*"
    }
  ]
}

从我可以将新附件上传到S3的事实来看,我要说的是建立了良好的连接。我相信我将s3cmd设置为通过与通过应用程序访问存储桶不同的IAM用户帐户连接到存储桶。可能是许可问题?如果是这样,我可以通过任何方式更改上述权限以授予对这些文件的访问权限吗?

我正在使用 aws-sdk将回形针与S3集成在一起。

编辑:
我认为这可能是所有权问题,因为我使用管理 key 而不是我在应用程序中使用的 key 上载了文件。在将存储桶配置为使用应用程序所使用的相同 key 之后,我清除了存储桶并重新同步了s3cmd。但是,我遇到了相同的结果。

编辑2:
通过进入应用程序的生产控制台并手动与存储桶进行交互,我可以进一步验证权限和连接。一切运行正常,即我可以检索浏览器返回403s的文件。
> s3 = AWS::S3.new
=> <AWS::S3>
> bucket = s3.buckets['mybucket']
=> #<AWS::S3::Bucket:mybucket>  
> bucket.exists?
=> true
> image = bucket.objects["SomeFolder/SomeImage.jpg"]
=> <AWS::S3::S3Object:SomeFolder/SomeImage.jpg>
> puts image.read
=> ǃ���^�D��턣�����=m������f ... machine code

最佳答案

看来您的S3存储桶策略不允许公共(public)用户正确访问公共(public)读取。尝试类似的东西:

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "AllowPublicRead",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::my-brand-new-bucket/*"
      ]
    }
  ]
}

当您手动应用公共(public)读取权限时,您能够以公共(public)用户身份访问这些文件,这一事实确认您的存储桶策略未正确授予读取访问权限。

当您使用公共(public)S3 URL访问文件时,没有经过身份验证的用户。