Noz*_*Noz 8 ruby-on-rails amazon-s3 paperclip
我最近使用s3cmd 工具将本地存储中的一千个Paperlclip附件移到了Amazon S3 .您可以在此处找到有关我如何完成此操作的详细信息,但总而言之,我使用以下命令迁移所有旧附件.
s3cmd sync my-app/public/system/ s3://mybucket
Run Code Online (Sandbox Code Playgroud)
我更新了我的代码库以使用新的S3存储桶,我已经测试了连接,一切正常.事实上,我可以通过我的应用程序将新附件上传到远程S3存储桶,查看/下载它们没问题.然而,似乎某个地方Paperclip和S3彼此不同步,我移动到我的s3桶的所有附件(在下图中模糊)返回403s,如果我尝试通过我访问它们应用.但是上传到同一个存储桶的新附件加载得很好.

我有一个IAM组设置,具有以下配置:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::mybucket/*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
从我可以将新附件上传到S3的事实来看,我会说连接建立得很好.我相信我设置s3cmd通过不同的IAM用户帐户连接到我的存储桶,而不是通过我的应用程序访问存储桶的用户帐户.它可能是一个许可问题吗?如果是这样,我可以以任何方式更改上述权限以授予对这些文件的访问权限吗?
我正在使用aws-sdk将paperclip与S3集成.
编辑: 我认为这可能是一个所有权问题,因为我使用管理员密钥上传文件而不是我在我的应用程序中使用的文件.在配置它以使用应用程序使用的相同密钥后,我清除了存储桶并重新启动了s3cmd.然而,我遇到了同样的结果.
Edit2: 我可以通过进入我的应用程序的生产控制台并手动与我的存储桶交互来进一步验证我的权限和连接.一切都工作得很好,即我可以检索我的浏览器返回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
Run Code Online (Sandbox Code Playgroud)
Win*_*eld 14
看起来您的S3存储桶策略不允许公共用户正确地进行公共读取访问.尝试类似的东西:
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "AllowPublicRead",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::my-brand-new-bucket/*"
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
当您手动应用公共读取权限时,您能够以公共用户身份访问这些文件的事实确认您的存储桶策略未正确授予读取权限.
使用公共S3 URL访问文件时,没有经过身份验证的用户.