【问题标题】:Aws-sdk gem 'cannot load such file' error on remote server but not locallyAws-sdk gem'无法在远程服务器上加载此类文件'错误,但不在本地
【发布时间】:2015-05-05 15:55:25
【问题描述】:

这看起来与 other questions 非常相似,但这些解决方案看起来并不适用于此。

我可以在本地以生产模式运行我的 rails 应用程序,但在远程服务器上它会失败并显示有关 aws-sdk gem 的消息:

A LoadError occurred in images#index:

cannot load such file -- aws-sdk (You may need to install the aws-sdk gem)
app/controllers/images_controller.rb:9:in `block (2 levels) in index'

aws-sdk 正在被Paperclip 4.2.0 使用,目前它仅与 aws-sdk 1.x(无版本 2)集成。 require 'aws-sdk' 不在我自己的代码中。违规操作代码:

@images = @viewable.images
respond_to do |format|
  format.html {}
  #line 9:
  format.json {render json: @images, root: false, each_serializer: ImageSerializer}
end

我目前调查的内容如下。

远程与本地配置

这似乎是最有可能的原因。我的服务器可能找不到某些关键配置,因此无法初始化 aws-sdk。这是我的配置的工作原理:

S3 是根据this page 配置的。我完全按照教程进行操作,只是稍作改动以适应多个生产模式服务器:

config/application.yml(由figaro 加载到ENV 的值):

production:
  s3_bucket: 'mybucket'

development:
  s3_bucket: 'mybucket'

config/aws.yml(由 aws-sdk 自动加载):

development:
  access_key_id: AK_MY_ID
  secret_access_key: MYSECRET
production:
  access_key_id: AK_MY_ID
  secret_access_key: MYSECRET

摘自 config/environments/production.rb:

config.paperclip_defaults = {
  storage: :s3,
  s3_credentials: {
    bucket: ENV['s3_bucket']
  }
}

据我所知,每个 yml 文件的符号链接都在每次部署时正确创建:

deployer:~/apps/myapp/releases/20150505130826$ ll config/
lrwxrwxrwx  1 deployer deployer    53 May  5 13:08 application.yml -> /home/deployer/apps/myapp/shared/config/application.yml
lrwxrwxrwx  1 deployer deployer    45 May  5 13:08 aws.yml -> /home/deployer/apps/myapp/shared/config/aws.yml

我检查过的其他事项:

我怀疑这个控制器有问题

访问同一模型的其他操作和控制器也会失败,并且仅在远程服务器上失败。

Gem 安装看起来不错

几个月来,我没有遇到其他宝石在部署过程中丢失的问题。 bundler 没有输出表明安装失败。从 capistrano 部署输出:

 ~/.rvm/bin/rvm ruby-2.1.5@myapp do bundle install --path /home/deployer/apps/myapp/shared/bundle --without development test --deployment --quiet as deployer@myapp.com
DEBUG [c43674b8] Command: cd /home/deployer/apps/myapp/releases/20150505130826 && ~/.rvm/bin/rvm ruby-2.1.5@myapp do bundle install --path /home/deployer/apps/myapp/shared/bundle --without development test --deployment --quiet
INFO [c43674b8] Finished in 3.582 seconds with exit status 0 (successful).

我可以从 shell 检查 gem 的安装位置:

~/apps/myapp/releases/20150505130826$ ~/.rvm/bin/rvm ruby-2.1.5@myapp do bundle show aws-sdk
/home/deployer/apps/myapp/shared/bundle/ruby/2.1.0/gems/aws-sdk-1.64.0

在 Rails 控制台中:

2.1.5 :001 > Gem.loaded_specs['aws-sdk'].full_gem_path
 => "/home/deployer/apps/myapp/shared/bundle/ruby/2.1.0/gems/aws-sdk-1.64.0"

所以看起来 Rails 确实知道 gem。

AWS 凭证看起来不错

相同的凭据在我的本地计算机上完美运行(在开发模式和生产模式下)。凭据也可以在远程服务器上使用 s3cmd。当我故意在本地机器上将它们设置为不正确的值时,我从 AWS 收到拒绝访问错误,而不是整个操作像这样失败。

我还能在哪里寻找问题?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 paperclip aws-sdk


    【解决方案1】:

    我尝试使用gem 'aws-sdk-v1'。这对我的 aws 项目很有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      相关资源
      最近更新 更多