Excon ::错误::禁止(预期(200)实际(403禁止)

当我尝试将图片上传到“Car”对象时,我被拒绝访问S3。 但是,由于我添加了S3,因此资源文件夹中的站点图像显示得很好。 我得到的具体错误是:

2015-02-17T14:40:48.459629+00:00 app[web.1]: Excon::Errors::Forbidden (Expected(200)  Actual(403 Forbidden) 2015-02-17T14:40:48.459630+00:00 app[web.1]: excon.error.response 2015-02-17T14:40:48.459635+00:00 app[web.1]: "Connection" => "close" 2015-02-17T14:40:48.459637+00:00 app[web.1]: "Content-Type" => "application/xml" 2015-02-17T14:40:48.459639+00:00 app[web.1]: "Date" => "Tue, 17 Feb 2015 14:40:48 GMT" 2015-02-17T14:40:48.459640+00:00 app[web.1]: "Server" => "AmazonS3" 2015-02-17T14:40:48.459632+00:00 app[web.1]: :body => "\nAccessDeniedAccess Denied2CE306ACD51F02A1tKLXUAKxyDFTMExl7kE+AuVVsEJOFqXh983li6N7R2UlYDXv1Z3GJRvW5zy1XIXVs2zArp310vg=" 2015-02-17T14:40:48.459642+00:00 app[web.1]: "x-amz-id-2" => ""part of secret key"=" 

随着“秘密密钥的一部分”明显被编辑。 我尝试过创建一个不同的用户并使用新密钥,但这没有用。 不是从这里去的地方。

应用程序/上传/ picture_uploader

 class PictureUploader < CarrierWave::Uploader::Base include CarrierWave::MiniMagick process resize_to_limit: [400, 400] if Rails.env.production? storage :fog else storage :file end # Override the directory where uploaded files will be stored. # This is a sensible default for uploaders that are meant to be mounted: def store_dir "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" end # Add a white list of extensions which are allowed to be uploaded. def extension_white_list %w(jpg jpeg gif png) end end 

carrier_wave.rb

 if Rails.env.production? CarrierWave.configure do |config| config.fog_credentials = { # Configuration for Amazon S3 :provider => 'AWS', :aws_access_key_id => ENV['S3_ACCESS_KEY'], :aws_secret_access_key => ENV['S3_SECRET_KEY'] } config.fog_directory = ENV['S3_BUCKET'] end end 

我相信这是所有相关文件,让我知道是否有更多要看。 不确定指定区域或超级用户是否有帮助,似乎不会。

[编辑:此时我默认为另一个答案,特别是如果你处于刺激环境中。 这是一种解决方法,对我来说在几年前制造易碎玩具时起作用,但我同意在担心安全问题时授予最小权限。

我遇到了同样的错误,解决方案是从AWS管理控制台附加管理访问策略:

1)通过http://aws.amazon.com/iam/登录AWS管理控制台

2)单击左侧导航窗格中的“策略”

3)选择“AdministratorAccess”策略

4)单击页面顶部的“策略操作”>“附加”

5)选择与我的S3_ACCESS_KEY,S3_SECRET_KEY和S3_BUCKET关联的用户

6)点击“附加政策”

仅通过https://console.aws.amazon.com/s3/home从我的存储桶授予所有权限是不够的。

从安全的角度来看,告诉您在IAM用户上授予AdministratorAccess的另一个答案是一个坏主意 – 它允许任何有权访问这些密钥的人在您的帐户中执行任何操作,包括删除所有基础结构。

我还没有确定Carrierwave / Fog需要的确切最小权限集,但是我工作的一个较小的集合看起来像:

使用以下策略文档创建AWS IAM策略:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::BUCKETNAME/*" }, { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::BUCKETNAME" }, { "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets" ], "Resource": [ "*" ] } ] }

请注意,在BUCKETNAMEBUCKETNAME/*上指定S3操作不是错误 – 第一个涉及对存储桶执行的API操作,第二个涉及存储桶中存储的对象。