Ошибка "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)
Ответы
Ответ 1
Вы можете получить эту ошибку, потому что вы не определили правильную версию aws sdk в своем Gemfile. Это может произойти при переустановке старых приложений с установленной версией 1 или 2.
Убедитесь, что версия, которую вы хотите установить:
gem 'aws-sdk', '~> 3'
# call sdk
Aws.<whatever>
gem 'aws-sdk', '~> 2'
# call sdk
Aws.<whatever>
# 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'