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に変更します。

まずはAWSのS3にてバケットを作成します。

続いてIAMユーザーを作成して、S3FullAccessなどのポリシーをアタッチします。

IAMユーザーを作成する際に、アクセスキーIDシークレットアクセスキーというものが作成されるので保存しておきましょう。

保存したIDとキーはcredentials.yml.encなどに環境変数として設定しておきます。

study-output.hatenadiary.com

続いて、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: <設定したバケット名>