繁体   English   中英

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

[英]Error “uninitialized constant AWS (NameError)”

这是说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)

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

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

您需要安装/使用aws-sdk-v1版本。 简单地做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文档所示。

您可能会收到此错误,因为您没有在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。

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

你的Gemfile的条目应该是

gem 'aws-sdk'

这将隐式执行require 'aws-sdk'作为应用程序初始化,只要您使用bundle exec rails serverbundle exec rails console启动应用程序。

或者,如果上面的代码在非rails应用程序中,只require 'aws-sdk'在第一行上输入require 'aws-sdk'

我在Chef配方中遇到了这个问题,所以下面的响应肯定是以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> gem list | 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

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

删除已安装的AWS宝石

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

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

gem install aws-sdk -v 1.64.0

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

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

只需根据需要进行更改[in th require statement in environment]

require 'aws-sdk'

require 'aws-sdk-v1'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM