Подтвердить что ты не робот

Ошибка "uninitialized constant AWS (NameError)"

Говорят, что AWS неинициализирован. Я использую жемчужину aws-sdk-core.

Вместо этого я попытался использовать жемчужину aws-sdk, и проблема все еще была там.

Это файл инициализаторов /aws.rb:

AWS.config(:access_key_id => ENV['AWS_ACCESS_KEY_ID'],
                      :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'])

s3 = AWS::S3.new
AVATAR_BUCKET = s3.buckets[ENV['AVATAR_BUCKET_NAME']]

Когда я пытаюсь запустить сервер или открыть консоль, я получаю эту ошибку:

/initializers/aws.rb:1:in `': неинициализированная константа AWS (NameError)

4b9b3361

Ответ 1

Вы можете получить эту ошибку, потому что вы не определили правильную версию aws sdk в своем Gemfile. Это может произойти при переустановке старых приложений с установленной версией 1 или 2.

Убедитесь, что версия, которую вы хотите установить:

aws-sdk версия 3

gem 'aws-sdk', '~> 3'

# call sdk    
Aws.<whatever>

aws-sdk version 2

gem 'aws-sdk', '~> 2'

# call sdk    
Aws.<whatever>

aws-sdk version 1

# version constraint
gem 'aws-sdk', '< 2'

# or 

# use the v1 gem
gem 'aws-sdk-v1'

# call sdk    
AWS.<whatever>

v1 находится под AWS а v2 и v3 - под Aws => Это позволяет вам запускать v1 и v2 бок о бок.

Ответ 2

Если вы получаете эту ошибку, и у вас установлен "aws-sdk" gem, у вас, вероятно, будет обновлено до версии 2 aws-sdk gem непреднамеренно. Версия 2 использует пространство имен Aws, а не Aws. Это позволяет использовать версии 1 и 2 в одном приложении.

Подробнее см. в сообщении в блоге.

Ответ 3

Вам нужно установить/использовать версию -v1 aws-sdk. Просто выполнение gem 'aws-sdk' или require 'aws-sdk' может вместо этого использовать версию 2.x aws-sdk.

Чтобы избежать путаницы, для скриптов, требующих 1.x, используйте:

require 'aws-sdk-v1' # not 'aws-sdk'

И для скриптов, требующих 2.x, используйте:

gem 'aws-sdk', '~> 2'

как указывает документация GitHub.

Ответ 4

Звучит так, как если бы камень не присутствовал в вашем пути загрузки, или он не требуется.

Запись в Gemfile должна быть

gem 'aws-sdk'

Это будет неявно делать require 'aws-sdk' по мере инициализации приложения, пока вы запускаете приложение с помощью bundle exec rails server или bundle exec rails console.

В качестве альтернативы, если вышеуказанный код был в приложении без рельсов, просто поместите require 'aws-sdk' в первую строку.

Ответ 5

Я столкнулся с этой проблемой в рецепте шеф-повара, поэтому ответ ниже явно шеф-повара.

Amazon выпустила версию 2 aws-sdk в начале февраля 2015 года. Версия 2 не полностью обратно совместима с версией 1.

Итак, вы должны принять решение - довольны ли вы функциональностью версии 1 или хотите функциональность версии 2?

Если вы довольны версией 1, возможно, на короткий срок, необходимо, чтобы Chef явно загружал версию 1, потому что по умолчанию она использует последнюю версию. Для этого вы должны указать атрибут версии для загрузки в рецепте, который загружает chef_gem aws-sdk. Модификация выглядит так (вероятно, реализована в default.rb для рассматриваемой поваренной книги):

chef_gem "aws-sdk" do
  action :nothing

  # Source:  https://aws.amazon.com/releasenotes/Ruby?browse=1
  version '1.62.0'  

end.run_action(:install)

Обновите версию в метаданных поваренной книги, затем загрузите кулинарную книгу на свой сервер шеф-повара. Обновите версию поваренной книги в среде, затем загрузите среду на свой сервер шеф-повара.

После конвергенции запустите список драгоценных камней в вашем экземпляре, чтобы увидеть версии gem:

В PowerShell PS C:\Users\Administrator > список драгоценных камней | select-string aws-sdk

В Linux: список драгоценных камней | grep -i aws-sdk

Это типичные результаты:

aws-sdk (2.0.27, 1.62.0) 
aws-sdk-core (2.0.27) 
aws-sdk-resources (2.0.27) 
aws-sdk-v1 (1.62.0)

Обратите внимание, что последний указывает aws-sdk-v1. Теперь вы должны обновить свой рецепт, чтобы потребовать старую версию aws-sdk. Измените это:

require 'aws-sdk'

:

require 'aws-sdk-v1'

Обновите версию в метаданных .rb, загрузите кулинарную книгу, обновите версию в файле окружения, загрузите среду, и вам будет хорошо идти после следующей конвергенции.

Это сообщение в блоге содержит более подробную информацию и решения этой проблемы: http://ruby.awsblog.com/post/TxFKSK2QJE6RPZ/Upcoming-Stable-Release-of-AWS-SDK-for-Ruby-Version-2

Ответ 6

Я не специалист по Ruby, но я решил ту же проблему, выполнив приведенные ниже команды.

Чтобы удалить установленные драгоценные камни AWS

gem list --no-version --local | grep aws | xargs gem uninstall -aIx

Чтобы установить жемчуг v1, который был совместим с моим Ruby script:

gem install aws-sdk -v 1.64.0

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

Ответ 7

У меня была та же проблема. Один ответ работал без обновления gem.

Просто измените, где требуется [in th require statement in environment]

require 'aws-sdk'

to

require 'aws-sdk-v1'