0
0

Railsアプリの画像をS3にアップロードをしてみた

Posted at

はじめに

フロントエンドよりの駆け出しエンジニアの私が、Railsのアプリケーションの画像をS3にアップロードしてと言われたのでやってみたの記事を書こうと思います。

そもそもS3とは

AWSのオンラインストレージサービスです。
画像データは容量が重く、データベースでの保存だと、クエリの実行速度が重くなり、パフォーマンスが低下します。
さらに、ストレージ容量が満たされ、拡張が必要になることがあります。
そのため、S3などの大規模データを保管することに特化したサービスを使います。

S3以外の画像やファイルのストレージサービスには以下のようなものがあります。

  • Google Cloud Storage
  • Microsoft Azure Blob Storage
  • Backblaze B2:

Railsで、画像をS3にアップロードする方法

Railsで、画像をS3にアップロードする方法を調べました。

方法1 Active Storage

Rails標準の技術のActive Storageを使用する方法があります。
Active Storageは、ファイルアップロードを行う機能で、Rails5.2で追加されました。
Rails側では、storage.ymにAmazonの情報を書き込み、Active Storageの設定ファイルにて、Amazaonを指定するだけでとても簡単です。

方法2 Carrierwaveとfog-aws (こちらを採用しました。)

こちらは、上記のGemをインストールして、アップローダーをマウントしたり、画像ファイルの保存先を指定します。
carrierwave.rbを生成したりとActive Storageより少し、工程はありますが、こちらも簡単です。
また、先人たちが多いので、参考記事が多くありました。

イメージ図
スクリーンショット 2023-12-05 23.41.18.png

実際の手順

  1. gem 'carrierwave'をGemfileに追加します。
  2. gem 'fog-aws’を追加も追加します。
  3. アップローダーの追加と編集を行います。
/app/uploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  # 保存形式の設定
  storage :fog

  # 画像ファイルの保存先の設定
  def store_dir
    "uploads/share/#{model.voice_id}/#{model.category}"
  end
end

4.モデルの修正を行います。

# CarrierWaveのアップローダーをマウント
  # ImageUploader を使用して、
  # photo カラムにファイルをアップロードできるようになる。
  mount_uploader :photo, ImageUploader

5.envファイルにアクセスキーを入力します。

S3_ACCESS_KEY_ID = 'アクセスキー'
S3_SECRET_ACCESS_KEY = 'シークレットアクセスキー'

6.carrierwave.rbを作成

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

CarrierWave.configure do |config|
  config.storage = :fog
  config.fog_provider = 'fog/aws'
  config.fog_credentials = {
    provider: 'AWS',
    aws_access_key_id: ENV['S3_ACCESS_KEY_ID'],#AWSのaccess_key_id
    aws_secret_access_key: ENV['S3_SECRET_ACCESS_KEY'],#AWSのsecret_access_key
    region: 'ap-northeast-1', #アジアパシフィック(東京)を表している
    path_style: true
  }

  config.fog_directory  = 'バケット名'
  config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/バケット名'
end

おわりに

お読みいただきありがとうございました。
S3と聞くと、初学者の方がよく詰まっている印象があったので、実装が不安でした。
しかし、Railsは使いやすいGemなど方法が用意されており、容易に設定できると知ることができ、印象が変わりました。

今後もRailsや他の開発系記事諸々コンスタントにあげていきたいと思います。

0
0
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
0
0