#Railsアプリでの画像アップロードに何を使ってますか?
Railsアプリでの画像アップロードには何を使ってますか?
carrierwaveでモデルと関連付けを行って、ファイルはpubic/imagesに保存していますか?
私もRails学習用のアプリ開発にcarrierwaveを使ってます。使いやすくて良いですよね。
しかしRails5.2からはActiveStorageという備え付けの
ストレージ管理機能が追加されているらしいです。
せっかくなので今回は、ActiveStorageへと移行し
外部ストレージとしてAWS S3を使用する構成に替えて行きたいと思います。
Railsガイドわかりやすいです!
Active Storage の概要
こちらのRAILSガイドの説明が分かりやすいです。
ですが細かいところで自分の環境と差異があったりしたので
そこらへんを含めながらメモを残します。
ではやっていきましょーー
ActiveStorage + S3 導入手順
AWSのセットアップ
AWSに登録の部分は省略します。
登録していない方は中々面倒な作業ですがAWSに登録してください。
流れとしては
・S3バケットを作成・設定
・IAMユーザーを作成してS3バケットを使えるように設定
・IAMユーザーの認証情報をRailsで使用する
という3ステップです。
###S3バケットの作成
S3サービスへ移動して、「バケットの作成」をします。
バケットを作るとはストレージのフォルダを作るというイメージです。
特にデフォルトのまま変更なく作成すれば大丈夫です。
###IAMユーザーの作成
AWSではIAMという機能を用いて各機能へのアクセス権限を制御します。
IAMで与えた権限の超えた動作を行うことができないので
もしもkeyが流出したとしても最小限の被害に抑えることができます。
IAMサービスのページに移動したら
「ユーザー」→「ユーザー作成」→「名前を自由に入力して、プログラムによるアクセスにチェック」
「既存のポリシーをアタッチ」→「S3FullAccessを検索してチェック」
で他はデフォルトのまま作成完了で大丈夫かと思います。
これでS3に自由にアクセスできるユーザーが作成されました。
ここで示される
アクセスキー ID
シークレットアクセスキー
を控えておきましょう。(CSVファイルをダウンロードすれば簡単です。)
これらをRailsアプリで使用します。
※今回は開発環境用にS3FullAccessポリシーをアタッチしていますが本番環境では
権限を制限しておいたほうが良いと思います。(**こちらの記事**で解説しています。)
AWS S3の認証情報をcredentialsに追加
大事な認証情報をcredentialsを使ってrailsに教えます。
$ EDITOR=vi rails credentials:edit
#以下を追記
aws:
access_key_id: 先ほど控えたもの
secret_access_key: 先ほど控えたもの
追記したら:wqで保存します。
テーブルの作成
$ rails active_storage:install
$ rails db:migrate
activestorageで使用するテーブルを作成します。
アップロードするファイルとモデルの関連付けに使用されています。
config/storage.ymlの編集
storage.ymlでストレージを定義します。
test:
service: Disk
root: <%= Rails.root.join("tmp/storage") %>
local:
service: Disk
root: <%= Rails.root.join("storage") %>
amazon:
service: S3
access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
region: ap-northeast-1
bucket: バケットの名前
これは元々storage.yml内のコメントアウトされている内容をそのまま使っています。
access_key_idとsecret_access_keyはcredentialsで管理しましょう。
config/environments/production.rbの編集
元々のファイルが
config.active_storage.service = :local
となっていると思いますので
config.active_storage.service = :amazon
と変更してproduction環境でamaozonという名前で定義したストレージを
使用するように変更しましょう。
必要なgemの追加
gem 'mini_magick'
gem 'aws-sdk-s3', require: false
Model、View、Controllerの修正
carrierwaveで書いていた部分を書き換えます。
モデル名、カラム名、view部分などは開発アプリごとに読み替えてください。
ActiveStorageでは他のカラムと同じようにActiveRecordで取り扱うことができます。
#以下を追記(1対多の関連付けの場合はhas_many_attachedとする)
has_one_attached :image
# 以下を追記、carrierwaveを使用している場合はそのままでOK
= f.file_field :image, accept: "image/png, image/jpeg, image/gif"
##まとめ
以上でActiveStorage + S3の導入終了です。
導入も中々簡単で良い感じです。
本番環境で上手く行かないですか?もしもherokuとdockerを使っているなら
**こちら**の記事が参考になるかもしれません。