Rails ActiveStorageを用いてs3にprefix(フォルダ)をつけて保存する方法

RailsのActiveStorageを使ってs3に格納するケースは多々あると思います。

s3に格納する際にprefixをつける方法を紹介します。

前提としてGem「aws-sdk-s3」を利用しているため、事前に設定してから下記の設定を行なってください。

s3のActiveStorageのサービスをオーバーライドする

下記のファイルを作成します。

作成場所は「lib/active_storage/service/my_s3_service.rb」です。

require 'active_storage/service/s3_service'

module ActiveStorage
    class Service::MyS3Service < Service::S3Service
        private

        def object_for(key)
            bucket.object(prefix(key))
        end

        def prefix(key)
            return "MyFolder/#{key}"
        end
    end
end

storage.ymlでオーバーライドしたクラスを指定する

dev:
    service: MyS3
    access_key_id: xxx
    secret_access_key: xxx
    region: xxx
    bucket: xxx

まとめ

設定は以上です。

良くも悪くもactive_strage_blobsのkeyにはs3のprefixが入らない形です。

その意味ではprefixがテナントIDなど何かに依存した仕様の場合は都合が良いかと思います。