はじめに
フロントエンドよりの駆け出しエンジニアの私が、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より少し、工程はありますが、こちらも簡単です。
また、先人たちが多いので、参考記事が多くありました。
実際の手順
-
gem 'carrierwave'
をGemfileに追加します。 -
gem 'fog-aws’
を追加も追加します。 - アップローダーの追加と編集を行います。
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を作成
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や他の開発系記事諸々コンスタントにあげていきたいと思います。