在我的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')
答案 0 :(得分:0)
您无法通过将AWS凭据添加到服务器来解决此问题。您只向客户端/浏览器发送受保护资源的链接。您必须公开资源或者为了增加一点安全性,您可以创建新的访问密钥,这些访问密钥具有对存储桶的读访问权限并使用AWS JS SDK并为访问者提供新创建的凭据。
答案 1 :(得分:0)
默认情况下,S3存储桶为PRIVATE,只能通过所有者访问密钥访问。
通过将Principal设置为“*”并附加到存储桶策略,您可以在不需要访问密钥的情况下使存储桶成为公共访问权限。
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"AddPerm",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::examplebucket/*"],
"Condition": {
"IpAddress": {"aws:SourceIp": "54.240.143.0/24"},
"NotIpAddress": {"aws:SourceIp": "54.240.143.188/32"}
}
}
]
}
以上“条件”可以限制哪个IP地址可以访问您的S3存储桶。
有许多方法可以通过严格的策略和访问控制授予存储桶更新或查看其他方式。您需要通读并配置它们。 请点击此处:S3 example bucket policies