42

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

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

这是初始化程序/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)

4

7 回答 7

113

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

有关更多信息,请参阅此博客文章

于 2015-02-05T22:46:37.683 回答
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 文档所示。

于 2015-03-02T20:53:50.010 回答
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 version 1

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

# or 

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

# call sdk    
AWS.<whatever>

v1 is scoped under AWS and v2 and v3 scoped under Aws => That allows you to run v1 and v2 side by side.

于 2018-03-11T16:33:55.553 回答
7

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

你的条目Gemfile应该是

gem 'aws-sdk'

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

或者,如果上面的代码在非 Rails 应用程序中,只需放在require 'aws-sdk'第一行。

于 2014-04-03T02:40:27.953 回答
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> gem list | 选择字符串 aws-sdk

在 Linux 上:gem 列表 | 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

于 2015-02-24T21:31:43.953 回答
2

我面临着同样的问题。一个答案在这里工作而没有更新gem.

只需在需要的地方进行更改[in th require statement in environment]

require 'aws-sdk'

require 'aws-sdk-v1'
于 2017-05-28T16:38:01.457 回答
1

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

删除已安装的 AWS gem

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

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

gem install aws-sdk -v 1.64.0

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

于 2015-04-28T06:43:09.683 回答