4

Я слежу за железнодорожным справочником Хартла и прибыл в 11.4.4: Image upload in production. Что я сделал:Попытка настроить ведро A3 Amazon: 403 Запрещенные разрешения на ошибки и настройки

  • Вошёл для Amazon Web Services
  • В Amazon идентификации и управления доступом Я создал пользователь. Пользователь был создан успешно.
  • В Amazon S3 я создал новое ведро.
  • Установка разрешений на новое ведро:

Права доступа: Учебник предписывает «грант на чтение и запись для пользователя, созданного на предыдущем шаге». Однако в разделе «Permissons» для ведра имя нового пользователя не упоминается. Я мог выбирать только между всеми, проверенными пользователями, доставкой журнала, мной и именем пользователя. Amazon, похоже, создал себя из моего имени + номер. Я попробовал это, выбрав Authenticated users и установил флажки для разрешений Upload/Delete and View (и не выбрал разрешения List и Edit). Я также попробовал это, выбрав «Все» и проверил все четыре поля. Результаты были одинаковыми.

  • Я реализовал приложение Rails в соответствии с инструкциями учебника (я не считаю, что в этом нет ничего плохого, поэтому я не включил эти шаги здесь, чтобы не сделать его слишком длинным).

Инициализатор carrier_wave.rb имеет следующий код. Я добавил region: 'eu-west-1' в инициализатор (идея, которую я получил от here), чтобы избавиться от сообщения connecting to the matching region will be more performant.

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'],   # Set these key's using heroku config:set S3_ACCESS_KEY=<access key> 
     :aws_secret_access_key => ENV['S3_SECRET_KEY'], 
     :region    => 'eu-west-1' 
    } 
    config.fog_directory  = ENV['S3_BUCKET'] 
    end 
end 
  • Он работал в разработке и я нажал на Heroku.

Ошибка: При использовании загрузчиком в производстве, чтобы загрузить изображение, я получаю ошибку We're sorry, but something went wrong. Журнал сервера Heroku говорит:

app[web.1]: SQL (1.7ms) UPDATE "users" SET "avatar" = $1, "updated_at" = $2 WHERE "users"."id" = $3 [["avatar", "animaatjes.png.gif"], ["updated_at", "2015-05-20 12:37:56.683858"], ["id", 18]] 
heroku[router]: at=info method=POST path="https://stackoverflow.com/users/18" host=xxx.herokuapp.com request_id=xxx-7f9f-4580-89ba-xxx fwd="xx.xxx.xx.xxx" dyno=web.1 connect=0ms service=3461ms status=500 bytes=1714 
app[web.1]: Completed 500 Internal Server Error in 3317ms (ActiveRecord: 13.0ms) 
app[web.1]: (1.4ms) ROLLBACK 
app[web.1]: Excon::Errors::Forbidden (Expected(200) <=> Actual(403 Forbidden) 
app[web.1]: excon.error.response 
app[web.1]: :body   => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>F8xxxD89</RequestId><HostId>MdB5iSMgxxx1vqE+Q=</HostId></Error>" 
app[web.1]: :headers  => { 
app[web.1]:  "Connection"  => "close" 
app[web.1]:  "Content-Type"  => "application/xml" 
app[web.1]:  "Date"    => "Wed, 20 May 2015 12:37:57 GMT" 
app[web.1]:  "Server"   => "AmazonS3" 
app[web.1]:  "x-amz-id-2"  => "MdB5iSMg***K1vqdP+E+Q=" 
app[web.1]:  "x-amz-request-id" => "F80A**C58" 
app[web.1]: } 
app[web.1]: :local_address => "***.**.**.**" 
app[web.1]: :local_port => ***** 
app[web.1]: :reason_phrase => "Forbidden" 
app[web.1]: :remote_ip  => "**.***.***.***" 
app[web.1]: :status  => 403 
app[web.1]: :status_line => "HTTP/1.1 403 Forbidden\r\n" 
app[web.1]: app/controllers/users_controller.rb:46:in 'update' 
app[web.1]: Completed 500 Internal Server Error in 6151ms (ActiveRecord: 60.7ms)  

Что я сделал не так? Кажется, я имею какое-то отношение к разрешениям?


Update: Причина оказалась политикой, предоставляемый пользователю. Если я предоставляю пользовательский стандарт AmazonS3FullAccess, тогда он работает. Он не работает с AmazonS3ReadOnlyAccess, так как пользователь не может сохранить новое изображение. В моем приложении пользователю в основном нужны только 2 права: загрузите собственное изображение аватара и прочитайте изображение аватара. Было бы безопасным использование AmazonS3FullAccess или я должен написать свою собственную политику?

Я попробовал настраиваемую политику ниже, которая должна дать приложению читать и писать права (заимствованные из here), но которые все еще генерировали ошибку 403 Forbidden.

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": ["s3:ListBucket"], 
     "Resource": ["arn:aws:s3:::mybucket"] 
    }, 
    { 
     "Effect": "Allow", 
     "Action": [ 
     "s3:PutObject", 
     "s3:GetObject", 
     "s3:DeleteObject" 
     ], 
     "Resource": ["arn:aws:s3:::mybucket/*"] 
    } 
    ] 
} 
+0

Как это связано с ошибкой в ​​заголовке? Я думаю, вам нужно будет написать либо политику ведра, либо политику IAM, предоставляющую вам доступ к вашему пользователю - см. Http://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-overview.html –

+0

, Я изменил название. Дело в том, что я следую за этапом railstutorial.org. Я думаю, это должно быть довольно просто. Поэтому я немного сомневаюсь в необходимости какой-либо настройки. Как правило, пользователь, созданный в IAM, не был бы доступен для предоставления разрешений для ведра? Так, может быть, это не значит, что происходит не так? – Nick

+1

В учебнике не говорится о том, как предоставить доступ вообще - он просто говорит «читайте документы». –

ответ

0

Корень проблемы действительно оказался разрешением.Необходимо было написать пользовательскую политику и установить конфигурацию CORS на ведро. Для будущих пользователей, которые хотят реализовать эту главу руководства по рельсам, см. Writing an IAM policy and CORS configuration for Amazon S3 для получения необходимого кода.

0

У меня была такая же проблема, дело в том, что Amazon изменил свой макет, поэтому теперь создание пользовательской политики немного отличается от предыдущей. Поэтому, как только вы создаете политик не забудьте прикрепить политику пользователя в вопросе или вы получите 403 запрещенной ошибку

1

В моем случае s3:PutObjectAcl было разрешение, которое отсутствовало

0

я имел и вопросы из учебника -

Посмотрите в журналах Heroku -

Запретный

и

Ошибка сокета

Продолжая попытки решить эту проблему в течение дня, я в основном возвращаюсь к основам, воссоздал нового пользователя IAM и новое ведро s3, но на этот раз оставил REGION в качестве американского стандарта - единственный авторитет s3, который я смог найти приложить в политике был полный доступ - больше ничего - так что придает

также перепечатывания и подтверждающие ENV переменные на Heroku, а также копировать и наклеивать carrier_wave.rb из учебника. - чтобы быть уверенным, чтобы убедиться)

Первый раз, когда я возился и не знал, что делать, я мог бы щелкнуть несколько разных вещей: добавление групп и разрешений, просмотр неправильных вещей - иногда СБРОС и ШАГ через все, особенно после изучения AWS и IMS и s3 в первый раз.

Интересно, что в heroku они INSTRUCT устанавливают область ковша в качестве стандарта США и публикуют предупреждение. Обязательно создайте ведро в том же регионе, что и ваше приложение, чтобы воспользоваться бесплатными скоростями передачи данных в регионе AWS.

хорошо читать для Heroku в конфигурацию s3 здесь -> https://devcenter.heroku.com/articles/s3

3

Чтобы включить загрузки S3 файла, я должен был:

  • указать свой регион (нам-запад)
  • создать IAM пользователь
  • Добавить Bucket Policy, указывающую, что пользователь в качестве принципала
{ 
    "Version": "2008-10-17", 
    "Statement": [ 
     { 
      "Sid": "AllowFileUpload", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "arn:aws:iam::XXXXXXX:user/instaswan" 
      }, 
      "Action": [ 
       "s3:GetObject", 
       "s3:PutObject", 
       "s3:PutObjectAcl" 
      ], 
      "Resource": [ 
       "arn:aws:s3:::instaswan-dev", 
       "arn:aws:s3:::instaswan-dev/*" 
      ] 
     } 
    ] 
} 

Обязательно укажите как ресурс верхнего уровня, так и «/ *» и укажите любые другие атрибуты «Действие», которые вам нужны.

+0

Спасибо за отзыв на верхнем уровне. Я должен был это сделать, а затем смог заставить Эксон не побаловать себя. Добавление «Принципа» недействительно и разрешено в политике для S3. – dft

1

Возможно, вам не хватает шага, который должен установить вашу политику IAM, если вы используете пользователя IAM для настройки вашего ведра.

Перейти к консоли IAM, выберите пользователя, перейдите на permissions tab, нажмите кнопку attach policy и добавьте administrator access.

После того, что ошибка должна уйти, и вы можете загружать файлы без проблем;)