Как предоставить разрешения на доступ к АРМ пользователя на рельсы Хартль уроке
Я не знаю, как (или где также) предоставить пользователю разрешение на чтение и запись из AWS, чтобы пользователи могли размещать фотографии на sample_app в производственной среде. Это последняя задача в 11-й главе, она не охвачена учебником, и я нигде не могу найти решение.
Это 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['lalala'],
:aws_secret_access_key => ENV['oloalle']
}
config.fog_directory = ENV['name of bucket']
end
end
Это процедура из учебника: 1) Создать пользователя AWS IAM и записать доступ и секретный ключ-готово
2) create S3 bucket-done
3) грант чтение и запись разрешение пользователю, созданному на предыдущем шаге - как???
4) Затем я выполняю следующие три команды:
$ heroku config:set S3_ACCESS_KEY=lalala
$ heroku config:set S3_SECRET_KEY=oloalle
$ heroku config:set S3_BUCKET=name of bucket
5) нажимаем на Git и Heroku - сделать
6) heroku pg:reset DATABASE
- сделано
7)heroku run rake db:migrate
и вот я получаю это сообщение:
Running `rake db:migrate` attached to terminal... up, run.7906
rake aborted!
ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key
/app/vendor/bundle/ruby/2.0.0/gems/fog-core-1.28.0/lib/fog/core/service.rb:244:in `validate_options'
/app/vendor/bundle/ruby/2.0.0/gems/fog-core-1.28.0/lib/fog/core/service.rb:268:in `handle_settings'
/app/vendor/bundle/ruby/2.0.0/gems/fog-core-1.28.0/lib/fog/core/service.rb:98:in `new'
/app/vendor/bundle/ruby/2.0.0/gems/fog-core-1.28.0/lib/fog/storage.rb:25:in `new'
/app/vendor/bundle/ruby/2.0.0/gems/carrierwave-0.10.0/lib/carrierwave/uploader/configuration.rb:83:in `eager_load_fog'
/app/vendor/bundle/ruby/2.0.0/gems/carrierwave-0.10.0/lib/carrierwave/uploader/configuration.rb:96:in `fog_credentials='
/app/config/initializers/carrier_wave.rb:3:in `block in <top (required)>'
/app/vendor/bundle/ruby/2.0.0/gems/carrierwave-0.10.0/lib/carrierwave/uploader/configuration.rb:118:in `configure'
/app/vendor/bundle/ruby/2.0.0/gems/carrierwave-0.10.0/lib/carrierwave.rb:14:in `configure'
/app/config/initializers/carrier_wave.rb:2:in `<top (required)>'
/app/vendor/bundle/ruby/2.0.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `load'
/app/vendor/bundle/ruby/2.0.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `block in load'
/app/vendor/bundle/ruby/2.0.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:240:in `load_dependency'
/app/vendor/bundle/ruby/2.0.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `load'
/app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/engine.rb:652:in `block in load_config_initializer'
/app/vendor/bundle/ruby/2.0.0/gems/activesupport-4.2.0/lib/active_support/notifications.rb:166:in `instrument'
/app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/engine.rb:651:in `load_config_initializer'
/app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/engine.rb:616:in `block (2 levels) in <class:Engine>'
/app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/engine.rb:615:in `each'
/app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/engine.rb:615:in `block in <class:Engine>'
/app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/initializable.rb:30:in `instance_exec'
/app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/initializable.rb:30:in `run'
/app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/initializable.rb:55:in `block in run_initializers'
/app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/initializable.rb:44:in `each'
/app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/initializable.rb:44:in `tsort_each_child'
/app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/initializable.rb:54:in `run_initializers'
/app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/application.rb:352:in `initialize!'
/app/config/environment.rb:5:in `<top (required)>'
/app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/application.rb:328:in `require'
/app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/application.rb:328:in `require_environment!'
/app/vendor/bundle/ruby/2.0.0/gems/railties-4.2.0/lib/rails/application.rb:443:in `block in run_tasks_blocks'
Tasks: TOP => db:migrate => environment
(See full trace by running task with --trace)
4 ответа:
Вот мой учебник, который я создал, чтобы продолжить, где Майкл Хартл остановился в конце Ruby on Rails Tutorial (3-е изд. Глава 11. Он должен ответить на ваш вопрос и многое другое.
Получение railstutorial.org пример приложения для работы между Heroku и AWS был огромной занозой в заднице. Но я это сделал. Если вы нашли этот учебник,это означает, что вы, вероятно, столкнулись с ошибкой, которую вы не можете пройти. Это прекрасно. У меня их было несколько.
Первое, что вам нужно сделать, это вернуться назад. код, который предоставил Хартл. Убедитесь, что вы ввели его (или скопировали/вставили) точно так, как показано на рисунке. Из всего кода в этом разделе есть только одно небольшое дополнение, которое вам может понадобиться сделать. переменная окружения "регион". это необходимо, если вы создаете корзину, которая не находится в области US по умолчанию. Подробнее об этом позже. Вот код для
/config/initializers/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'], :region => ENV['S3_REGION'] } config.fog_directory = ENV['S3_BUCKET'] end end
Эта линия
:region => ENV['S3_REGION']
является проблемой для многих людей. Подробнее об этом позже.Вы должны использовать этот блок кода именно так, как показано. не кладите туда свои настоящие ключи.Мы пошлем их на хероку отдельно.
Если вам нужно было добавить эту строку кода, не забудьте зафиксировать ее в git и отправить в Heroku.
Теперь давайте перейдем к вашему аккаунту AWS и безопасности.
- прежде всего, создайте свой аккаунт AWS.По большей части это похоже на регистрацию на любом веб-сайте. Сделайте хороший длинный пароль и храните его в надежном месте, как зашифрованный пароль менеджер. Когда вы создадите свой аккаунт,вам будет предоставлен первый набор ключей AWS. Вы не будете использовать их в этом уроке, но они могут понадобиться вам в какой-то момент в будущем, поэтому сохраните их в безопасном месте.
- перейдите в секцию S3 и сделайте ведро. он должен иметь уникальный имя, поэтому я обычно просто ставлю дату в конце, и все. Например, вы можете назвать его "my-sample-app-bucket-20160126". Как только ты создали свое ведро, нажимаем на название, затем нажмите кнопку Свойства. Для вас важно знать, в каком "регионе" находится ваше ведро. найди его, и возьмите это на заметку. Вы будете использовать его позже.
Ваш основной аккаунт, вероятно, имеет полные разрешения на все, поэтому давайте не будем использовать его для передачи случайных данных между двумя веб-сервисами. Это может стоить вам много денег, если это выйдет наружу. Вместо этого мы сделаем ограниченного пользователя. создайте нового пользователя в разделе IAM. я назвал его "туман", потому что это программное обеспечение облачного сервиса это управляет отправкой и получением. Когда вы создадите его, у вас будет возможность отображения и/или загрузки ключей, связанных с новым пользователем. Очень важно, чтобы ты хранил это в сейфе. и безопасное место. Он не входит в ваш код, потому что это, вероятно, будет в конечном итоге он оказывается в хранилище, где его могут видеть другие люди. Кроме того, не давайте этого новый пользователь-пароль, так как он не будет входить в панель мониторинга AWS.- создайте новую группу. Я назвал свой "s3railsbucket". Вот где он находится то разрешения будут назначены. Добавьте в эту группу слово "туман".
- перейдите в раздел политики. Нажмите кнопку "Создать политику", затем выберите " Создать свою своя политика". Дайте ему имя, которое начинается с "Разрешить", чтобы он появился рядом в верхней части списка политик. Это огромный список. Вот что я сделал:
Имя политики: AllowFullAccessToMySampleAppBucket20160126
описание: позволяет удаленно записывать / удалять доступ к ведру S3 упомянутый мой образец-приложение-ведро-20160126.
Политический Документ:{ "Version": "2012-10-17", "Statement": [ { "Action": "s3:*", "Effect": "Allow", "Resource": [ "arn:aws:s3:::my-sample-app-bucket-20160126", "arn:aws:s3:::my-sample-app-bucket-20160126/*" ] } ] }
- вернитесь в раздел Группы, выберите созданную группу, затем добавьте Ваша новая политика в отношении группы.
Вот и все для конфигурации AWS. Мне не нужно было делать политику, чтобы позволить "туман", чтобы перечислить содержимое ведра, хотя большинство учебников я пробовал сказал, что это необходимо. Я думаю, что это необходимо только тогда, когда вам нужен пользователь это может войти в систему через Панель управления.
Теперь для Конфигурация Heroku. Этот материал вводится в вашем командной строки, как 'запустить в Heroku грабли дБ:мигрировать и такие. Это где вы вводите фактический ключ доступа и секретный ключ, полученный от пользователя" тумана", которого вы создали ранее.
Посмотрите еще раз на эту последнюю. Помните, когда вы смотрели на свойства ваш S3 ведро? Здесь вы вводите код, связанный с вашим компьютером. регион. Если ваше ведро не находится в Орегоне, вам придется изменить$ heroku config:set S3_ACCESS_KEY=THERANDOMKEYYOUGOT $ heroku config:set S3_SECRET_KEY=an0tHeRstRing0frAnDomjUnK $ heroku config:set S3_REGION=us-west-2 $ heroku config:set S3_BUCKET=my-sample-app-bucket-20160126
us-west-2
на ваш фактический региональный код. Эта ссылка работала, когда этот учебник был написан:Http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
Если это не работает, Google "AWS S3 region codes".
Проделав все это и дважды проверив ошибки в коде, я получил Heroku для работы с AWS для хранения картинок!
В
Services -> IAM
, Нажмите на1 User(s)
подIAM Resources
. Выберите пользователя, у которого вы хотите получить разрешение. В профиле этого пользователя нажмите кнопкуAttach User Policy
. Нажмите наSelect
дляAmazon S3 Full Access
и, наконец,Apply Policy
.
Для других в будущем, Этот ответ очень помог мне.
Перейдите на Heroku, в вашем приложении, перейдите в Настройки, нажмите Reveal Config Vars.
Нажмите на кнопку "правка" справа и введите свои секреты:
S3_BUCKET: name of your bucket goes here S3_ACCESS_KEY: xxxxx S3_SECRET_KEY: xxxx
На config / initializers / carrierwave.rb или где бы вы ни вводили свои секреты должны иметь:
CarrierWave.configure do |config| config.root = Rails.root.join('tmp') # adding these... config.cache_dir = 'carrierwave' # ...two lines config.fog_credentials = { :provider => 'AWS', # required :s3_access_key_id => ENV['S3_ACCESS_KEY'], # required :s3_secret_access_key => ENV['S3_SECRET_KEY'], # required :region => 'eu-west-1', # optional, defaults to 'us-east-1' :host => 's3.example.com', # optional, defaults to nil :endpoint => 'https://s3.example.com:8080' # optional, defaults to nil } config.fog_directory = ENV['S3_Bucket'] # required config.fog_public = false # optional, defaults to true config.fog_attributes = {'Cache-Control'=>'max-age=315576000'} # optional, defaults to {} end
Я обнаружил, что выбранный правильный ответ выше не работает для меня. Это то, что в конечном итоге сработало для меня после многих проб и ошибок.
Я сделал первые шаги, чтобы вручную ввести секретную информацию, как указано выше...Перейдите на Heroku, в вашем приложении, перейдите в Настройки, нажмите Reveal Config Vars.
Нажмите на кнопку "правка" справа и введите свои секреты:
S3_BUCKET: name of your bucket goes here
S3_ACCESS_KEY: xxxxx
S3_SECRET_KEY: xxxx
Однако небольшое разница в файле carrier_wave, похоже, сработала.
Обратите внимание на строку encpompassing
if Rails.env.production?
иend
.Carrier_wave.rb
if Rails.env.production? CarrierWave.configure do |config| config.root = Rails.root.join('tmp') # adding these... config.cache_dir = 'carrierwave' # ...two lines config.fog_credentials = { :provider => 'AWS', # required :aws_access_key_id => ENV['S3_ACCESS_KEY'], :aws_secret_access_key => ENV['S3_SECRET_KEY'], :region => 'eu-west-2', # optional, defaults to 'us-east-1' :host => 's3.example.com', # optional, defaults to nil :endpoint => 'https://s3.example.com:8080' # optional, defaults to nil } config.fog_directory = ENV['S3_Bucket'] # required config.fog_public = false # optional, defaults to true config.fog_attributes = {'Cache-Control'=>'max-age=315576000'} # optional, defaults to {} end end
Не уверен, была ли это проблема или нет.
Сделав это изменение, я закончил главу в соответствии с инструкциями Майкла Хартла.Теперь мы готовы зафиксировать изменения в нашей ветке темы и объединить их назад к мастеру:
$ bundle exec rake test
$ git add -A
$ git commit -m "Add user microposts"
$ git checkout master
$ git merge user-microposts
$ git push
Затем мы развертываем, сбрасываем базу данных и повторно заполняем образцы данных:
$ git push heroku
$ heroku pg:reset DATABASE
$ heroku run rake db:migrate
$ heroku run rake db:seed