ActiveStorageを使ってS3に画像を保存する【rails】
はじめに
ActiveStorageを使ってAWSのS3に画像を保存する方法について。
ActiveStorageの設定
まずはActiveStorageをインストールします。
$ rails active_storage:install $ rails db:migrate
続いて、該当のモデルと関連付けします。
class Article < ApplicationRecord has_one_attached :image end
image
の部分は任意に名前を設定できます。
上記のように設定することで、image
をカラムのように扱うことができます。
具体的には、画像を呼び出す時に下記のような感じになります。
<%= image_tag @article.image %>
ちなみに複数画像を添付したい場合は、has_many_attached
を使用します。
またカラムの名前は複数形にします。
has_many_attached :images
保存先の設定
ActiveStorageの保存先は、デフォルトではローカルのサーバーに保存されます。
config.active_storage.service = :local
config.active_storage.service = :local
local
というのは、config/storage.yml
で定義された保存先になります。
local: service: Disk root: <%= Rails.root.join("storage") %>
保存先をAmazonのS3に変更する
では、本番環境での画像の保存先をAmazonのS3に変更します。
続いてIAMユーザーを作成して、S3FullAccess
などのポリシーをアタッチします。
IAMユーザーを作成する際に、アクセスキーID
とシークレットアクセスキー
というものが作成されるので保存しておきましょう。
保存したIDとキーはcredentials.yml.enc
などに環境変数として設定しておきます。
続いて、Gemをインストールします。
gem "aws-sdk-s3"
続いて保存先をlocal
からamazon
に変更します。
config.active_storage.service = :amazon
上記で指定した保存先のamazon
を定義します。
amazon: service: S3 access_key_id: <%= Rails.application.credentials.aws[:access_key_id] %> secret_access_key: <%= Rails.application.credentials.aws[:secret_access_key] %> region: <バケットを作成したときのリージョン> bucket: <設定したバケット名>