LoginSignup
54
73

More than 3 years have passed since last update.

RailsアプリでActiveStorage + AWS S3を使ってみよう!

Last updated at Posted at 2019-06-03

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でストレージを定義します。

config/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の追加

Gemfile
gem 'mini_magick'
gem 'aws-sdk-s3', require: false

Model、View、Controllerの修正

carrierwaveで書いていた部分を書き換えます。
モデル名、カラム名、view部分などは開発アプリごとに読み替えてください。

ActiveStorageでは他のカラムと同じようにActiveRecordで取り扱うことができます。

app/models/user.rb
#以下を追記(1対多の関連付けの場合はhas_many_attachedとする)
  has_one_attached :image
app/views/users/_form.html.slim など
# 以下を追記、carrierwaveを使用している場合はそのままでOK
= f.file_field :image, accept: "image/png, image/jpeg, image/gif"

まとめ

以上でActiveStorage + S3の導入終了です。
導入も中々簡単で良い感じです。
本番環境で上手く行かないですか?もしもherokuとdockerを使っているなら
こちらの記事が参考になるかもしれません。

54
73
1

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
54
73