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

问题描述 投票:0回答:8

它说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:in `':未初始化常量 AWS (NameError)

ruby-on-rails amazon-web-services ruby-on-rails-4 amazon-s3 aws-sdk-ruby
8个回答
114
投票

如果您收到此错误并且安装了“aws-sdk”gem,则您可能已无意中升级到了 aws-sdk gem 的版本 2。版本 2 使用

Aws
命名空间,而不是
AWS
。这允许版本 1 和版本 2 在同一应用程序中使用。

请参阅此博客文章了解更多信息。


24
投票

您需要安装/使用

-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 文档 所示。


17
投票

您可能会收到此错误,因为您没有在 Gemfile 中定义正确的 aws sdk 版本。重新捆绑安装了版本 1 或 2 的旧应用程序时可能会发生这种情况。

确定您要安装哪个版本:

aws-sdk 版本 3

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

# call sdk    
Aws.<whatever>

aws-sdk 版本 2

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

# call sdk    
Aws.<whatever>

aws-sdk 版本 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。


7
投票

听起来好像 gem 不存在于您的加载路径中,或者不需要它。

您的

Gemfile
中的条目应该是

gem 'aws-sdk'

只要您使用

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

或者,如果上述代码位于非 Rails 应用程序中,只需将

require 'aws-sdk'
放在第一行即可。


4
投票

我在厨师食谱中遇到了这个问题,所以下面的回复绝对是以厨师为中心的。

Amazon 于 2015 年 2 月上旬发布了 aws-sdk 的版本 2。版本 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)

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

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

在 PowerShell 上 PS C:\Users\Administrator> 宝石列表 |选择字符串 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


2
投票

我也面临着同样的问题。一个答案在这里有效,无需更新

gem

只需在需要的地方进行更改即可

[in th require statement in environment]

require 'aws-sdk'

require 'aws-sdk-v1'

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 建议使用最新版本,但这对于不想修改现有脚本的人来说应该很有用。


0
投票

如果您的 Gemfile 中有

gem 'aws-sdk-s3', require: false
,也可能会发生这种情况。我不知道为什么我们的项目会这样,但我不得不将其更改为
gem 'aws-sdk-s3'
。由于某种原因,在升级到 Rails 7.1 之前,它可以与
require: false
正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.