carrierwaveでS3にアップロード

やること

  • AWSのIAMで「S3FullAccess」の権限を持ったユーザを作成し、アクセスキーを作成する(アクセスキー・シークレットアクセスキーは控えておく)
  • S3バケットを作成する。このときACLは無効に設定しておく
  • rails/config/initializers/carrierwave.rbを以下のように編集
CarrierWave.configure do |config|
  config.storage = :fog
  config.fog_provider = 'fog/aws'
  config.fog_credentials = {
    provider: 'AWS',
    aws_access_key_id: '[作成したアクセスキー]',
    aws_secret_access_key: '[シークレットアクセスキー]',
    region: '[S3のリージョン]'
  }
  config.fog_directory  = '[作成したバケット名]'
  config.cache_storage = :fog
  config.fog_public = false
end

config.fog_public = false を追記していないと、

アプリで画像をアップロードしようとしても「The bucket does not allow ACLs」というエラーが出て失敗するので注意。

アクセスキーなどは環境変数にしておく
(間違ってもgithubなどにアップロードしてはいけない)

production環境ではS3に、develop環境ではローカル(/upload配下)にアップロードするようにした。