【问题标题】:Error "uninitialized constant AWS (NameError)"错误“未初始化的常量 AWS (NameError)”
【发布时间】:2014-05-14 14:53:31
【问题描述】:

表示 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)

【问题讨论】:

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


    【解决方案1】:

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

    请参阅此blog post 了解更多信息。

    【讨论】:

    • 如果您打算继续使用 SDK 的第一个版本,请按照 v1 documentation. gem install aws-sdk-v1 and require aws-adk-v1` 的规定执行以下操作。
    • 对于目前遇到此问题的人来说,这个答案很可能是正确的。我回答的原始问题早于 aws-sdk 版本 2。
    【解决方案2】:

    您需要安装/使用-v1 版本的aws-sdk。简单地做gem 'aws-sdk'require 'aws-sdk' 可以使用aws-sdk 的2.x 版本。

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

    require 'aws-sdk-v1' # not 'aws-sdk'
    

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

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

    GitHub documentation 所示。

    【讨论】:

    • 这个答案很有帮助,即使我没有直接使用它(在我的情况下,正确的 gem 版本就足够了,没有添加 require 行)。提醒您谨慎更新 gem。
    【解决方案3】:

    您可能会收到此错误,因为您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 => 这允许您并排运行 v1 和 v2。

    【讨论】:

      【解决方案4】:

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

      Gemfile 中的条目应该是

      gem 'aws-sdk'
      

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

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

      【讨论】:

      • 非常感谢!为什么在第一行添加 require'aws-sdk' 似乎可以解决它?!? =c ...这是铁轨!
      • 这不是解决办法。如果您同时安装了 1.x 和 2.x 版本的 aws-sdk,则此行不一定会加载正确的版本。
      • 你是对的,虽然 OP 在版本 2 存在之前问过这个问题。
      • @cmaitchison 你能告诉我gemfile在哪里吗?我知道所有宝石都在哪里,但从您的回答看来 gemfile 是一些配置或初始化文件。谢谢
      • @shaffooo 如果您的项目根目录中没有 Gemfile,那么 Trevor Rowe 的回答可能与您的问题更相关。当您使用名为 Bundler 的 Ruby 依赖项管理工具时,需要一个名为 Gemfile 的文件。
      【解决方案5】:

      我在 Chef 食谱中遇到了这个问题,所以下面的回答肯定是以 Chef 为中心的。

      亚马逊于 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 列表 |选择字符串 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

      【讨论】:

        【解决方案6】:

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

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

        require 'aws-sdk'
        

        require 'aws-sdk-v1'
        

        【讨论】:

        • 谢谢 dwag,亲爱的你
        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-19
          • 2012-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-21
          • 1970-01-01
          相关资源
          最近更新 更多