carrierwave를 사용하여 aws의 s3에 이미지를 업로드 할 수 있도록하고 이미지를 업로드하지 않을 때 기본 이미지를 표시하는 방법

소개



carrierwave에서 이미지 업로드 기능을 구현한 후 업로드된 이미지를 AWS S3에 저장할 수 있도록 하는 방법을 설명합니다.
덧붙여 carrierwave를 도입하고 있는 것을 전제로 해설하고 있습니다.
carrierwave 의 구현이 아직의 분은 이 기사 를 참고로 해 보세요.

AWS IAM 사용자 및 S3 버킷 생성



IAM 사용자 만들기


  • 먼저 aws 콘솔에 로그인하여 IAM 서비스에 액세스합니다.
  • 그런 다음 항목의 사용자에서 사용자 추가를 클릭합니다.

  • 사용자를 설정합니다.



    이것으로 IAM 사용자 설정이 완료됩니다.

  • S3 버킷 만들기


  • S3 서비스에 액세스합니다.
  • 그런 다음 항목 버킷에서 버킷 만들기를 클릭합니다.




  • 생성한 IAM 사용자가 S3에 액세스할 수 있도록 버킷 정책을 추가합니다.
  • 먼저 방금 만든 IAM 사용자의 ARN을 복사합니다.




  • 버킷 정책
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "Stmt000001",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::ARNをここに貼り付ける"
                },
                "Action": "s3*",
                "Resource": "arn:aws:s3:::バケット名"
            }
        ]
    }
    

    이것으로 AWS 설정이 완료됩니다.

    uploader 클래스 설정



    작성한 uploader 클래스의 설정(나의 경우는 ImageUploader 클래스)을 아래와 같이 추기합니다.
    개발 환경, 테스트 환경에서는 「strage: file」, 프로덕션 환경에서는 「strage: fog」를 지정하는 것으로, 프로덕션 환경만 이미지가 S3에 업로드되도록 하고 있습니다.

    app/uploaders/image_uploader.rb
    class ImageUploader < CarrierWave::Uploader::Base
      include CarrierWave::RMagick
      include CarrierWave::MiniMagick
    
      # only pg,jpeg,gif,png
      def extension_white_list
        %w(jpg jpeg gif png)
      end
    
      if Rails.env.development?
        storage :file
      elsif Rails.env.test?
        storage :file
      else
        storage :fog
      end
    
      def store_dir
        "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
      end
    
    #注) if original_filename.present?を記載しないと、画像をアップロードしていない場合でもファイル名を作成してしまい、実在しない画像を参照してしまいます。
      def filename
        if original_filename.present?
          time = Time.now
          name = time.strftime('%Y%m%d%H%M%S') + '.jpg'
          name.downcase
        end
      end
    

    그런 다음 config/initializers/아래에 carrierwave.rb 파일을 만들고 아래 코드를 추가합니다.

    config/initializers/carrierwave.rb
    require 'carrierwave/storage/abstract'
    require 'carrierwave/storage/file'
    require 'carrierwave/storage/fog'
    
    #本番環境以外ではS3を参照しないように設定しています。
    unless Rails.env.development? || Rails.env.test?
      CarrierWave.configure do |config|
        config.storage :fog
        config.fog_provider = 'fog/aws'
        config.fog_directory  = 'バケット名'
        config.fog_credentials = {
          provider: 'AWS',
          aws_access_key_id: アクセスキーID',
          aws_secret_access_key: 'シークレットアクセスキー',
          region: 'ap-northeast-1',
          path_style: true
        }
      end 
    end
    

    액세스 키 ID와 비밀 액세스 키는 악용될 수 있으므로 구현할 때 환경 변수를 사용하는 것이 좋습니다.
    이번에는 환경 변수의 설정에 대해서는 생략합니다.

    환경 변수에 대한 참고 기사 : 【Rails】 dotenv-rails를 사용하여 환경 변수를 관리합시다.

    마지막으로



    이것으로 설정이 완료됩니다. 실제로 이미지를 업로드하여 S3에 저장되어 있는지 확인해 보세요.

    참고 기사



    【Rails】 CarrierWave 튜토리얼

    좋은 웹페이지 즐겨찾기