【问题标题】:Setting credentials for showing static image from Amazon S3设置凭证以显示来自 Amazon S3 的静态图像
【发布时间】:2016-05-04 00:32:25
【问题描述】:

在我的 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')

【问题讨论】:

  • 您是否将手动上传的图片权限设置为对任何人可见?

标签: ruby-on-rails amazon-s3


【解决方案1】:

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

【讨论】:

  • 谢谢,我不知道你也可以轻松控制亚马逊端的访问。
  • @John :请注意 AWS 中的限制,例如源 IP 的条件限制不适用于 VPC 私有 IP 地址。
【解决方案2】:

您无法通过将 AWS 凭证添加到服务器来解决这个问题。您仅向客户端/浏览器发送受保护资源的链接。您要么必须公开资源,要么为了增加一点安全性,您可以创建对存储桶具有读取权限的新访问密钥,并使用 AWS JS SDK 并将新创建的凭据提供给您的访问者。

【讨论】:

    猜你喜欢
    • 2021-11-23
    • 2015-04-26
    • 2018-08-05
    • 2020-11-03
    • 2013-11-21
    • 2011-06-22
    • 1970-01-01
    • 2021-09-07
    • 2011-01-18
    相关资源
    最近更新 更多