它说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 在同一应用程序中使用。
请参阅此博客文章了解更多信息。
您需要安装/使用
-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 文档 所示。
您可能会收到此错误,因为您没有在 Gemfile 中定义正确的 aws sdk 版本。重新捆绑安装了版本 1 或 2 的旧应用程序时可能会发生这种情况。
确定您要安装哪个版本:
gem 'aws-sdk', '~> 3'
# call sdk
Aws.<whatever>
gem 'aws-sdk', '~> 2'
# call sdk
Aws.<whatever>
# 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。
听起来好像 gem 不存在于您的加载路径中,或者不需要它。
您的
Gemfile
中的条目应该是
gem 'aws-sdk'
只要您使用
require 'aws-sdk'
或 bundle exec rails server
启动应用程序,这将在应用程序初始化时隐式执行 bundle exec rails console
。
或者,如果上述代码位于非 Rails 应用程序中,只需将
require 'aws-sdk'
放在第一行即可。
我在厨师食谱中遇到了这个问题,所以下面的回复绝对是以厨师为中心的。
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
我也面临着同样的问题。一个答案在这里有效,无需更新
gem
。
只需在需要的地方进行更改即可
[in th require statement in environment]
require 'aws-sdk'
到
require 'aws-sdk-v1'
我不是 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 建议使用最新版本,但这对于不想修改现有脚本的人来说应该很有用。
如果您的 Gemfile 中有
gem 'aws-sdk-s3', require: false
,也可能会发生这种情况。我不知道为什么我们的项目会这样,但我不得不将其更改为gem 'aws-sdk-s3'
。由于某种原因,在升级到 Rails 7.1 之前,它可以与 require: false
正常工作。