LoginSignup
5
3

More than 3 years have passed since last update.

【Rails】CarrierWaveによる画像投稿 【AWS EC2】

Last updated at Posted at 2020-10-07

筆者の環境

Ruby 2.5.3
Rails 5.2.4.2
gem: fog-aws

Railsで画像投稿にCarrierWaveを導入したのですが、gem:fog-awsを利用していて多くエラーに遭遇したので、恐らくこれから導入される方は苦労すると思い、設定を残しておこうと思いました。

同じ環境であれば、carrierwave.rbについては下記の設定ファイルでOKなはずです。

carrierwave.rbの設定

config/initializers/carrierwave.rb
require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'

CarrierWave.configure do |config|
  if Rails.env.development? || Rails.env.test?
    config.storage = :file
    config.enable_processing = false if Rails.env.test?
  elsif Rails.env.production?
    config.fog_provider = 'fog/aws'
    config.fog_credentials = {
      provider: 'AWS',
      aws_access_key_id: ENV["AWS_ACCESS_KEY_ID"],
      aws_secret_access_key: ENV["AWS_SECRET_ACCESS_KEY"],
      region: 'ap-northeast-1'
    }
    config.storage = :fog
    config.fog_directory = 'あなたのS3のバケット名'
    config.asset_host = 'https://s3.ap-northeast-1.amazonaws.com/あなたのS3バケット名'
  end
end

CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/

ポイント

・本番環境のみAWS S3で画像を保持するようになっています。開発環境はローカルに保存されます。
・carrierwave.rbの保管ディレクトリは注意してください。app/config/initializers/carrierwave.rbです。

carrierwave.rb
CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/

最下部のこのコードですが、デフォルトだとcarrierwaveはファイル名に日本語が使えない為、使えるようにする一文です。文字化けを防ぐことができます。

carrierwave.rb
aws_access_key_id: ENV["AWS_ACCESS_KEY_ID"],
aws_secret_access_key: ENV["AWS_SECRET_ACCESS_KEY"]

については、.envファイルで環境変数を指定してください。

AWS S3の設定

S3の設定も色々と苦労したので、スクリーンショットで残しておきたいと思います。

スクリーンショット 2020-10-07 15.02.06.png
S3の自分のバケットのプロパティです。ログ記録のみ有効にしてあります。ちなみにこの下の詳細設定も全て無効です。

スクリーンショット 2020-10-07 15.05.36.png
ブロックパブリックアクセスです。下部2つのみオンにしてあります。

スクリーンショット 2020-10-07 15.06.47.png
バケットポリシーエディターです。各自バケット名など変更してください。

コピーできるように下にコードを載せておきます。

バケットポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt000001",
            "Effect": "Allow",
            "Principal": {
                "AWS": "あなたのユーザーのARN(IAMから確認)"
            },
            "Action": "s3*",
            "Resource": "arn:aws:s3:::あなたのS3バケット名"
        }
    ]
}

その他の項目は設定していません。

CarrierWaveの所感

CarrierWaveは画像リサイズなど便利ですが、AWS EC2へデプロイし、S3を使用するとなると少し大変でした。
ActiveStorageも勉強したいと思います。
少しでも誰かの助けの記事になれば幸いです!

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3