Запустив heroku run rake db:migrate
, я получаю эту ошибку: Missing required arguments: aws_access_key_id, aws_secret_access_key
.
Я сделал исправление, рекомендованное в вопросе SO 25596504, в частности, безуспешно изменив файл carrier_wave.rb
на carrierwave.rb
. Я следую странице учебника Hartl 688, в которой указывается добавление их как $heroku config:set S3_ACCESS_KEY=<access key>
. Я заменил '' версиями фактического ключа в кавычках и без кавычек. Ключи отображаются, когда я запускаю конфигурацию heroku, например, S3_ACCESS_KEY:
Приложение работало до того, как я начал работать над этим разделом (11.4) учебника, повторно загружая изображения. Я, кстати, знаю о жемчужине Фигаро; однако я хотел бы попробовать следовать подходу учебника. Что мне не хватает? Любые мысли будут оценены. Спасибо!
heroku - Отсутствуют обязательные аргументы: aws_access_key_id, aws_secret_access_key, следуя учебнику Hartl
Ответы (5)
Перейдите на 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
Вот учебник, который я сделал после большой работы по настройке AWS для работы с Heroku, как описано в главе 11 учебника по Ruby on Rails, написанного Майклом Хартлом. Я надеюсь, что это помогает:
Заставить пример приложения Rails Tutorial для работы между Heroku и AWS было огромной головной болью. Но я сделал это. Если вы нашли это руководство, это означает, что вы, вероятно, столкнулись с ошибкой, которую не можете обойти. Это нормально. У меня их было несколько.
Первое, что вам нужно сделать, это вернуться к коду, который предоставил Хартл. Убедитесь, что вы ввели его (или скопировали/вставили) именно так, как показано. Из всего кода в этом разделе есть только одно небольшое дополнение, которое вам может понадобиться. Переменная среды "region". Это необходимо, если вы создаете корзину, которая не находится в зоне США по умолчанию. Подробнее об этом позже. Вот код для /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']
является проблемой для многих людей. По мере продолжения этого урока вы узнаете, для чего он нужен.
Вы должны использовать этот блок кода именно так, как показано. НЕ помещайте туда свои настоящие ключи. Мы отправим их в Heroku отдельно.
Теперь давайте перейдем к вашей учетной записи AWS и безопасности.
- Прежде всего, создайте свою учетную запись AWS. По большей части это похоже на регистрацию на любом веб-сайте. Придумайте хороший длинный пароль и сохраните его в безопасном месте, например, в зашифрованном менеджере паролей. Когда вы создадите учетную запись, вам будет предоставлен первый набор ключей AWS. Вы не будете использовать их в этом уроке, но они могут вам понадобиться в будущем, поэтому сохраните их в надежном месте.
- Перейдите в раздел S3 и создайте сегмент. У него должно быть уникальное имя, поэтому я обычно просто ставлю дату в конце, и этого достаточно. Например, вы можете назвать его «my-sample-app-bucket-20160126». После того, как вы создали свою корзину, нажмите на имя, затем нажмите «Свойства». Вам важно знать, в каком "Регионе" находится ваш сегмент. Найдите его и запишите. Вы будете использовать его позже.
- Ваша основная учетная запись, вероятно, имеет полные права доступа ко всему, поэтому давайте не будем использовать ее для передачи случайных данных между двумя веб-сервисами. Это может стоить вам больших денег, если оно выйдет наружу. Вместо этого мы сделаем ограниченного пользователя. Создайте нового пользователя в разделе IAM. Я назвал его "туман", потому что это программное обеспечение облачной службы, которое обрабатывает отправку и получение. При его создании у вас будет возможность отображать и/или загружать ключи, связанные с новым пользователем. Важно, чтобы вы хранили это в безопасном и надежном месте. Он НЕ входит в ваш код, потому что он, вероятно, окажется в репозитории, где его смогут увидеть другие люди. Кроме того, не давайте этому новому пользователю пароль, так как он не будет входить в панель управления AWS.
- Создайте новую группу. Я назвал свой "s3railsbucket". Здесь будут назначены разрешения. Добавьте «туман» в эту группу.
- Перейдите в раздел Политики. Нажмите «Создать политику», затем выберите «Создать собственную политику». Дайте ему имя, начинающееся с «Разрешить», чтобы оно отображалось в верхней части списка политик. Это огромный список. Вот что я сделал:
Имя политики: AllowFullAccessToMySampleAppBucket20160126
Описание: Разрешает удаленный доступ для записи/удаления к корзине S3 с именем my-sample-app-bucket-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 run rake db: migrate» и тому подобное. Здесь вы вводите фактический ключ доступа и секретный ключ, полученные от пользователя "туман", которого вы создали ранее.
$ 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
Посмотрите еще раз на последний. Помните, когда вы смотрели на свойства корзины S3? Здесь вы вводите код, связанный с вашим регионом. Если ваше ведро находится не в Орегоне, вам придется изменить us-west-2
на ваш фактический код региона. Эта ссылка работала, когда этот учебник был написан:
http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
Если это не сработает, погуглите «Коды регионов AWS S3».
Проделав все это и перепроверив код на наличие ошибок, я заставил Heroku работать с AWS для хранения картинок!
Я думаю, что эта ошибка произошла из-за того, что имя переменной не совпадает.
В файле Carrierwave.rb вы должны заменить :s3_access_key_id и :s3_secret_access_key на префикс «aws».
if Rails.env.production? CarrierWave.configure do |config| config.root = Rails.root.join('tmp') config.cache_dir = 'carrierwave' config.fog_credentials = { # Configuration for Amazon S3 :provider => 'AWS', # change var's name :aws_access_key_id => ENV['S3_ACCESS_KEY'], # change var's name :aws_secret_access_key => ENV['S3_SECRETE_KEY'] } config.fog_directory = ENV['S3_BUCKET'] end end
И его можно развернуть.
По какой-то причине запуск rake assets:precompile RAILS_ENV=development
исправил это для меня.
[и переменные env не нужно называть S3_ACCESS_KEY
и т. д., я использовал aws.access_key_id
]
Запуск rake assets:precompile
без RAILS_ENV был единственным способом заставить его прекомпилироваться.