在我的Rails应用程序中,我想显示来自我的AWS S3存储桶的静态图像 . 所以没有必要像Paperclip或Carrierwave这样的解决方案,因为不涉及上传 . 所以我使用 aws-sdk
gem与S3存储桶进行交互 .
这当然对公共图像很好,但是当我想显示私有图像时,我得到一个 access denied
. 我设置了以下环境变量:AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY和S3_BUCKET_NAME .
在Heroku上我用 heroku config:set
添加了这些环境变量,在本地我使用 dotenv
gem .
问题是我仍然在本地和Heroku上都有 access denied
错误 . 这里有什么问题?这是视图(使用静态URL,稍后这将是动态的):
= link_to "https://s3-eu-west-1.amazonaws.com/mybucket/Demo/20160503092647717.png" do
= image_tag("https://s3-eu-west-1.amazonaws.com/mybucket/Demo/20160503092647717.png", width: '600')
2 回答
您无法通过将AWS凭据添加到服务器来解决此问题 . 您只向客户端/浏览器发送指向受保护资源的链接 . 您必须公开资源或者为了增加一点安全性,您可以创建新的访问密钥,这些访问密钥具有对存储桶的读访问权限并使用AWS JS SDK并将新创建的凭据提供给访问者 .
S3存储桶默认为PRIVATE,只能通过所有者访问密钥访问 .
通过将Principal设置为“*”并附加到存储桶策略,可以使存储桶不需要访问密钥即可进行公共访问 .
以上“条件”可以限制哪个IP地址可以访问您的S3存储桶 .
通过严格的策略和访问控制,您可以通过多种方式授予存储桶更新或查看的权限 . 您需要仔细阅读并配置它们 . 请点击这里:S3 example bucket policies