2

Heroku で S3 をインストールしようとすると、アプリがクラッシュしました。

私がやりたいことは、Carrierwave がファイルを S3 ストレージにアップロードし、レールが S3 ストレージからアセットをロードできるようにすることです。S3 アカウントを開き、アプリ バケット内で、次のディレクトリ ツリーを含む 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

次に、bundle install

次に、config/initializers/carrierwave.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 を配置すればよいですか?

賢明なアドバイスをありがとう

オーレリアン

4

2 に答える 2

2

これが私が問題を解決した方法です:

私はメソッドをコメントアウトしました:config.s3_access_policyそしてconfig.fog_host、それはうまくいきました。これは、Rails 環境に基づいてアップロードするときに、Fog the 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
于 2013-02-03T05:20:55.433 に答える
1

これについてはよくわかりませんが、あなたと同じガイドに従っているようで、時代遅れになっているに違いありません。CarrierWave Uploader API が変更されたようです。現在、アップロードされた画像はデフォルトで公開されていますが、これは config.fog_public 構成オプションで変更できます。

詳細については、こちらこちらをご覧ください。

私は結局:

...
:provider              => 'AWS',
:aws_access_key_id     => ENV['S3_KEY'],
:aws_secret_access_key => ENV['S3_SECRET'],
:region                => ENV['S3_REGION']
...

私のフォグ初期化子で。もう何も必要ありませんでした。

于 2013-02-02T11:42:20.807 に答える