错误“未初始化的常量AWS(NameError)”

时间:2014-04-03 01:56:03

标签: ruby-on-rails amazon-web-services ruby-on-rails-4 amazon-s3 aws-sdk-ruby

据说AWS未初始化。我正在使用aws-sdk-core gem。

我尝试使用aws-sdk gem,问题仍然存在。

这是initializers / 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:在`':未初始化的常量AWS(NameError)

7 个答案:

答案 0 :(得分:109)

如果您收到此错误,并且您拥有" aws-sdk"安装了gem,你可能无意中升级到了aws-sdk gem的第2版。版本2使用Aws命名空间,而不是AWS。这允许在同一应用程序中使用版本1和版本2.

有关详细信息,请参阅此blog post

答案 1 :(得分:23)

您需要安装/使用-v1 aws-sdk版本的gem 'aws-sdk'。只需执行require 'aws-sdk'aws-sdk即可使用require 'aws-sdk-v1' # not 'aws-sdk' 的2.x版本。

为避免混淆,对于需要1.x的脚本,请使用:

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

对于需要2.x的脚本,请使用:

{{1}}

GitHub documentation表示。

答案 2 :(得分:9)

您可能会收到此错误,因为您didn't define the correct aws sdk version in your Gemfile.在重新捆绑安装了版本1或2的旧应用时会发生这种情况。

确定要安装的版本:

aws-sdk version 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 =&gt;这允许您并排运行v1和v2。

答案 3 :(得分:6)

听起来好像载入路径中没有宝石,或者它不是必需的。

Gemfile中的条目应为

gem 'aws-sdk'

只要您使用require 'aws-sdk'bundle exec rails server启动应用,这将在应用初始化时隐式执行bundle exec rails console

或者,如果上述代码位于非rails应用程序中,只需将require 'aws-sdk'放在第一行。

答案 4 :(得分:4)

我在Chef配方中遇到了这个问题,所以下面的答案肯定是以厨师为中心的。

亚马逊于2015年2月初发布了aws-sdk的第2版。版本2并不完全向后兼容版本1.

因此,您必须做出决定 - 您是否满足版本1功能,或者您是否需要版本2功能?

如果您满足版本1(可能是短期版本),则必须让Chef明确加载版本1,因为默认情况下,它似乎使用最新版本。要执行此操作,您必须在加载chef_gem aws-sdk的配方中指定要加载的版本属性。修改看起来像这样(可能在相关的cookbook的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)

更新cookbook元数据中的版本,然后将cookbook上传到Chef服务器。更新环境中的cookbook版本,然后将环境上传到Chef服务器。

收敛后,在您的实例上运行一个gem列表以查看gem版本:

在PowerShell上 PS C:\ Users \ Administrator&gt;宝石清单| 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'

更新metadata.rb中的版本,上传cookbook,更新环境文件中的版本,上传环境,你应该好好接受下一次收敛。

此博客文章包含此问题的更多详细信息和解决方案: http://ruby.awsblog.com/post/TxFKSK2QJE6RPZ/Upcoming-Stable-Release-of-AWS-SDK-for-Ruby-Version-2

答案 5 :(得分:1)

我不是Ruby专家,但我通过运行以下命令解决了同样的问题。

删除已安装的AWS gems

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

安装与我的Ruby脚本兼容的v1 gem:

gem install aws-sdk -v 1.64.0

我同意这不是推荐的方式,因为AWS建议使用最新版本,但这对于不想修改现有脚本的人来说非常有用。

答案 6 :(得分:1)

我遇到了同样的问题。一个答案在这里没有更新gem

只需更改所需位置[in th require statement in environment]

即可
require 'aws-sdk'

require 'aws-sdk-v1'