ruby-on-rails - Heroku AWS3 CarrierWave 和 Rails 问题

标签 ruby-on-rails heroku amazon-s3 carrierwave

在尝试使用 Heroku 安装 S3 时,我的应用程序崩溃了。

我想要做的是将Carrierwave上传文件到S3存储,并让rails从S3存储加载 Assets 。我打开了我的 S3 帐户,并在我的应用程序存储桶中上传了整个 Assets 文件夹,目录树如下所示:

  • 我的应用程序
    • Assets
      • 图片
      • JavaScript
      • 样式表

以下是我阅读指南 Heroku: Using AWS S3 to Store Static Assets and File Uploads 时遵循的步骤和 Example of setting up S3 with Carrierwave :

在我的 Gemfile 中我添加了

gem 'fog'

我运行了命令:

heroku config:add AWS_ACCESS_KEY_ID=XXXXXX AWS_SECRET_ACCESS_KEY=XXXXXX
heroku config:add S3_BUCKET_NAME=myapp
heroku config:add S3_REGION=ap-southeast-1 # I created my bucket in Singapore
heroku config:add S3_ASSET_URL=https://s3-ap-southeast-1.amazonaws.com/myapp/assets_%24folder%24

然后运行捆绑安装

然后我创建了 config/initializers/rierwave.rb

# config/initializers/carrierwave.rb
CarrierWave.configure do |config|
  config.fog_credentials = {
    # Configuration for Amazon S3 should be made available through an Environment variable.
    # For local installations, export the env variable through the shell OR
    # if using Passenger, set an Apache environment variable.
    #
    # In Heroku, follow http://devcenter.heroku.com/articles/config-vars
    #
    # $ heroku config:add S3_KEY=your_s3_access_key S3_SECRET=your_s3_secret S3_REGION=eu-west-1 S3_ASSET_URL=http://assets.example.com/ S3_BUCKET_NAME=s3_bucket/folder
    # Configuration for Amazon S3
    :provider => 'AWS',
    :aws_access_key_id => ENV['AWS_ACCESS_KEY_ID'],
    :aws_secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'],
    :region => ENV['S3_REGION']
  }

  # For testing, upload files to local `tmp` folder.
  if Rails.env.test? || Rails.env.cucumber?
    config.storage = :file
    config.enable_processing = false
    config.root = "#{Rails.root}/tmp"
  else
    config.storage = :fog
  end

  config.cache_dir = "#{Rails.root}/tmp/uploads" # To let CarrierWave work on heroku
  config.fog_directory = ENV['S3_BUCKET_NAME']
  config.s3_access_policy = :public_read # Generate http:// urls. Defaults to :authenticated_read (https://)
  config.fog_host = "#{ENV['S3_ASSET_URL']}/#{ENV['S3_BUCKET_NAME']}"

end

之后我更新了我的 git 并在 heroku 上推送:

git add .
git commit -m "added S3 configs with fog"
git push heroku master

当我使用 Heroku 应用程序时,我意识到存在错误,并检查了日志并发现以下错误:

...
2013-01-20T11:00:17+00:00 heroku[web.1]: Process exited with status 1
2013-01-20T11:00:17+00:00 heroku[web.1]: State changed from starting to crashed
2013-01-20T11:00:17+00:00 heroku[web.1]: State changed from crashed to starting
...
2013-01-20T11:00:52+00:00 app[web.1]: /app/config/initializers/carrierwave.rb:29:in `block in <top (required)>': undefined method `s3_access_policy=' for CarrierWave::Uploader::Base:Class (NoMethodError)
...
2013-01-20T11:00:53+00:00 heroku[web.1]: Process exited with status 1
2013-01-20T11:00:53+00:00 heroku[web.1]: State changed from starting to crashed
2013-01-20T11:04:52+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path=/ host=myapp.herokuapp.com fwd=xxx.xxx.xx.x dyno= queue= wait= connect= service= status=503 bytes=
2013-01-20T11:04:54+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path=/favicon.ico host=myapp.herokuapp.com fwd=xxx.xxx.xx.x dyno= queue= wait= connect= service= status=503 bytes=
2013-01-20T11:04:55+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path=/favicon.ico host=myapp.herokuapp.com fwd=xxx.xxx.xx.x dyno= queue= wait= connect= service= status=503 bytes=

我还尝试运行 heroku run rake db:migrate

并出现错误:

rake aborted!
undefined method `s3_access_policy=' for CarrierWave::Uploader::Base:Class

另外,在我看来,我应该为静态资源放置什么 URL?

感谢您的明智建议

奥雷利安

最佳答案

这是我解决问题的方法:

我注释掉了以下方法:config.s3_access_policyconfig.fog_host并且它起作用了。这是我的最终初始化程序,带有额外的条件检查,以便在基于 Rails 环境上传时使用雾化 Rails 文件系统。谢谢 FrontierPsycho,你是对的,凭据是最低限度的预先要求。

# config/initializers/carrierwave.rb
CarrierWave.configure do |config|
  config.fog_credentials = {
    # Configuration for Amazon S3 should be made available through an Environment variable.
    # For local installations, export the env variable through the shell OR
    # if using Passenger, set an Apache environment variable.
    #
    # In Heroku, follow http://devcenter.heroku.com/articles/config-vars
    #
    # $ heroku config:add S3_KEY=your_s3_access_key S3_SECRET=your_s3_secret S3_REGION=eu-west-1 S3_ASSET_URL=http://assets.example.com/ S3_BUCKET_NAME=s3_bucket/folder
    # Configuration for Amazon S3
    :provider => 'AWS',
    :aws_access_key_id => ENV['AWS_ACCESS_KEY_ID'],
    :aws_secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'],
    :region => ENV['S3_REGION']
  }

  # For testing, upload files to local `tmp` folder.
  if Rails.env.test? || Rails.env.cucumber?
    config.storage = :file
    config.enable_processing = false
    config.root = "#{Rails.root}/tmp"

  elsif Rails.env.development?
    config.storage = :file
  else
    config.storage = :fog
  end

  config.cache_dir = "#{Rails.root}/tmp/uploads" # To let CarrierWave work on heroku
  config.fog_directory = ENV['S3_BUCKET_NAME']
  # config.s3_access_policy = :public_read # Generate http:// urls. Defaults to :authenticated_read (https://)
  # config.fog_host = "#{ENV['S3_ASSET_URL']}/#{ENV['S3_BUCKET_NAME']}"

end

关于ruby-on-rails - Heroku AWS3 CarrierWave 和 Rails 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14424116/

相关文章:

ruby-on-rails - FactoryGirl - 在一个循环中定义几个工厂

ruby-on-rails - Controller :Class 的未定义方法 `after_create'

python - 无法在 Django 站点上配置 Facebook 登录

git - Heroku推送应用问题

ruby-on-rails - 我应该在 Heroku Cedar 上使用 Thin 还是 Unicorn

amazon-web-services - 使用 aws 进行情绪分析失败,因为 cloudformation 堆栈似乎找不到我的源代码 s3 存储桶

amazon-s3 - 如何使用 Lambda 函数将 Amazon RDS 数据库备份到 S3 存储桶

ruby-on-rails - Rails应用程序流程图生成?

ruby-on-rails - 您使用 Rails 进行版本控制和部署的工作流程是什么?

c# - 为什么 AmazonS3Util.DoesS3BucketExist 始终返回 true?