heroku - Отсутствуют обязательные аргументы: aws_access_key_id, aws_secret_access_key, следуя учебнику Hartl

Запустив 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) учебника, повторно загружая изображения. Я, кстати, знаю о жемчужине Фигаро; однако я хотел бы попробовать следовать подходу учебника. Что мне не хватает? Любые мысли будут оценены. Спасибо!


person user3763682    schedule 14.01.2015    source источник
comment
Можете ли вы опубликовать свой инициализатор несущей волны.rb?   -  person CWitty    schedule 14.01.2015


Ответы (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
person neo    schedule 14.01.2015
comment
Должен ли я заменить «AWS_KEY», «AWS_SECRET» и «AWS_BUCKET» фактическими значениями или оставить как есть? Спасибо. - person user3763682; 14.01.2015
comment
вы должны оставить все как есть, никогда не размещайте свои секреты на github... затем установите их в конфигурационные переменные Heroku - person neo; 14.01.2015
comment
Это решило это для меня. Пожалуйста, обновите свой ответ, чтобы он соответствовал терминологии Хартла на благо других в будущем, и я приму его. Это должны быть S3_ACCESS_KEY, S3_SECRET_KEY и S3_Bucket. Спасибо еще раз! - person user3763682; 15.01.2015
comment
У меня была такая же проблема, и это тоже сработало для меня. Спасибо! - person Hanna; 30.04.2015

Вот учебник, который я сделал после большой работы по настройке 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 и безопасности.

  1. Прежде всего, создайте свою учетную запись AWS. По большей части это похоже на регистрацию на любом веб-сайте. Придумайте хороший длинный пароль и сохраните его в безопасном месте, например, в зашифрованном менеджере паролей. Когда вы создадите учетную запись, вам будет предоставлен первый набор ключей AWS. Вы не будете использовать их в этом уроке, но они могут вам понадобиться в будущем, поэтому сохраните их в надежном месте.
  2. Перейдите в раздел S3 и создайте сегмент. У него должно быть уникальное имя, поэтому я обычно просто ставлю дату в конце, и этого достаточно. Например, вы можете назвать его «my-sample-app-bucket-20160126». После того, как вы создали свою корзину, нажмите на имя, затем нажмите «Свойства». Вам важно знать, в каком "Регионе" находится ваш сегмент. Найдите его и запишите. Вы будете использовать его позже.
  3. Ваша основная учетная запись, вероятно, имеет полные права доступа ко всему, поэтому давайте не будем использовать ее для передачи случайных данных между двумя веб-сервисами. Это может стоить вам больших денег, если оно выйдет наружу. Вместо этого мы сделаем ограниченного пользователя. Создайте нового пользователя в разделе IAM. Я назвал его "туман", потому что это программное обеспечение облачной службы, которое обрабатывает отправку и получение. При его создании у вас будет возможность отображать и/или загружать ключи, связанные с новым пользователем. Важно, чтобы вы хранили это в безопасном и надежном месте. Он НЕ входит в ваш код, потому что он, вероятно, окажется в репозитории, где его смогут увидеть другие люди. Кроме того, не давайте этому новому пользователю пароль, так как он не будет входить в панель управления AWS.
  4. Создайте новую группу. Я назвал свой "s3railsbucket". Здесь будут назначены разрешения. Добавьте «туман» в эту группу.
  5. Перейдите в раздел Политики. Нажмите «Создать политику», затем выберите «Создать собственную политику». Дайте ему имя, начинающееся с «Разрешить», чтобы оно отображалось в верхней части списка политик. Это огромный список. Вот что я сделал:

Имя политики: 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/*"
            ]
        }
    ]
}
  1. Вернитесь в раздел Группа, выберите группу, которую вы создали, затем добавьте новую политику в группу.

Это все, что касается конфигурации 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 для хранения картинок!

person Max Wilder    schedule 27.01.2016
comment
Хорошее обновление! Вы должны поделиться ею с Майклом Хартлом, чтобы помочь улучшить его книгу. - person user3763682; 02.02.2016
comment
Потратил 5 часов и наконец-то выполнил действия, предложенные вами. Теперь все работает!!! Большое спасибо! - person Liuda; 11.02.2016
comment
Круто, спасибо большое за этот пост! это должен быть правильный ответ! - person Palermo Andre Deschamps; 17.02.2016
comment
@Max Я следовал всему, что вы сказали, но все еще получаю эту ошибку: bash: синтаксическая ошибка рядом с неожиданным токеном `новая строка' - person Nirupa; 17.06.2016
comment
Я разобрался, пришлось убрать ‹› внутри которого я клал свой Access_key. - person Nirupa; 17.06.2016

Я думаю, что эта ошибка произошла из-за того, что имя переменной не совпадает.

В файле 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

И его можно развернуть.

person Yuri Chow    schedule 07.06.2015

По какой-то причине запуск rake assets:precompile RAILS_ENV=development исправил это для меня.
[и переменные env не нужно называть S3_ACCESS_KEY и т. д., я использовал aws.access_key_id]

person lakesare    schedule 12.03.2016
comment
поэтому, попробовав все остальные ответы, это то, что сработало для меня. Ваше здоровье! Теперь кто-нибудь знает, почему?! - person defuzed; 18.04.2016

Запуск rake assets:precompile без RAILS_ENV был единственным способом заставить его прекомпилироваться.

person Steve    schedule 21.08.2017