2015-02-17 4 views
7

Когда я пытаюсь загрузить изображение в объект «Автомобиль», мне отказывают в доступе к S3. Но изображения сайта, которые находятся в . папка активов отображаются нормально, так как я добавил S3 Специфическая ошибка, что я получаю это:.Excon :: Errors :: Forbidden (Ожидаемый (200) <=> Фактический (403 Запретный)

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   => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>2CE306ACD51F02A1</RequestId><HostId>tKLXUAKxyDFTMExl7kE+AuVVsEJOFqXh983li6N7R2UlYDXv1Z3GJRvW5zy1XIXVs2zArp310vg=</HostId></Error>" 
2015-02-17T14:40:48.459642+00:00 app[web.1]:  "x-amz-id-2"  => ""part of secret key"=" 

С «частью секретного ключа», очевидно отредактированным я попытался создать другой пользователь и использовать новые ключи, но это не сработало.

app/uploaders/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 

Я считаю, что это все соответствующие файлы, дайте мне знать, если есть больше, чтобы видеть. Не уверен, что если указать регион или мощный пользователь, это не похоже.

ответ

40

[EDIT: Я по умолчанию отвечу на другой ответ, особенно если вы находитесь в среде prod. Это было обходным решением, которое работало для меня, когда вы создавали игрушку с разветвленной рукой несколько лет назад, но я согласен с предоставлением минимальных разрешений, когда безопасность является проблемой.]

Я столкнулся с той же ошибкой, и решение заключалось в том, чтобы прикрепить административную политики доступа с консоли управления AWS:

1) Войдите в консоль AWS Management в http://aws.amazon.com/iam/

2) Нажмите "политики" на навигационной панели на левой

3) Выберите «AdministratorAccess "политика

4) Нажмите Политика Действия> Вложить в верхней части страницы

5) Выберите пользователя, связанный с моим S3_ACCESS_KEY, S3_SECRET_KEY и S3_BUCKET

6) Нажмите кнопку "Attach Policy"

Просто предоставление всех разрешений из моего ковша на https://console.aws.amazon.com/s3/home было недостаточным.

+0

Удивительно, спасибо за это прохождение! Документам AWS об их обновленной системе было больно ориентироваться. – Jadam

+0

Хотелось бы, чтобы я мог дать вам больше, чем одно преимущество. Я буквально провел 4 часа, пытаясь добиться этого. Трудно поверить, что S3 настолько запутан, сложна в настройке и плохо документирована. – IAmNaN

+3

Итак, если мы будем следовать этому и создать пользователя на амазонке ... теперь у нас есть 2 набора ключей доступа/секретности (один общий для вашей учетной записи AWS, когда вы переходите к своим «учетным данным безопасности» -> Ключам доступа (идентификатор ключа доступа и секретный ключ доступа) ... затем еще один для любого пользователя, которого вы настраиваете в «Пользователи», как это используется в вышеприведенных шагах. Какой набор ключей мы используем в терминале при запуске «heroku config»: установите AWS_ACCESS_KEY_ID = и конфигурацию heroku : set AWS_SECRET_ACCESS_ID = '??? – BB500

2

Другой ответ, говорящий вам предоставить AdministratorAccess для пользователя IAM, является плохой идеей с точки зрения безопасности - это позволит любому, у кого есть доступ к этим ключам, выполнять какие-либо действия в вашей учетной записи, включая удаление всей инфраструктуры.

Я не разработал точный минимальный набор разрешений, Carrierwave/Противотуманная потребности, но меньший набор, который я получил рабочий выглядит так:

Создать СИА политику AWS с документом политики, как:

{ "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": [ "*" ] } ] }

Обратите внимание, что это не ошибка, чтобы указать S3 действия на обоих BUCKETNAME и BUCKETNAME/* - первое относится к действиям API, которые выполняются на ведро, а второй, на сохраненных объектов в ведре.

Смежные вопросы